code wiki / (root) / nx_material_source_tangent_gate_t301.nx

nx_material_source_tangent_gate_t301.nx source

↩ module page · 54 lines · 3698 B

1import "nx_gltf_render_descriptor_candidate_t181.nx" 2import "nx_gate_verdict.nx" 3// Source-shape witness; does not infer missing normal textures or generate tangent frames. 4func mt_index(bin:*u8,v:*i64,i:i64)->i64{ 5 let at:i64=v[0]+i*v[2];if v[3]==5121{return bin[at] as i64} 6 if v[3]==5123{return (bin[at] as i64)|((bin[at+1] as i64)<<8)} 7 return gll_ru32(bin,at) 8} 9func main(argc:i64,argv:*i64)->i64{ 10 if argc!=2&&argc!=3{return 2}; 11 var expectMapped:i64=0 12 if argc==3{ 13 let mode:*u8=argv[2] as *u8;let expected:*u8="mapped" 14 if gll_slen(mode)!=gll_slen(expected){return 2} 15 var mi:i64=0;while mi<gll_slen(expected){if mode[mi]!=expected[mi]{return 2};mi=mi+1} 16 expectMapped=1 17 }let ctr:*i64=gv_ctr();var n:i64=0;let bytes:*u8=sys_read_file(argv[1] as *u8,&n) 18 if (bytes as i64)<=0{return 3} 19 let cx:*i64=sys_mmap(GLD_CONTEXT_WORDS*8) as *i64;let opened:i64=gltf_view_open(bytes,n,cx) 20 gv_check("actual retained GLB native open",opened==0,ctr);if opened!=0{return 4} 21 let st:*i64=cx[5] as *i64;let bin:*u8=cx[8] as *u8 22 let w:*i64=sys_mmap(32) as *i64;let identity:*u8=sys_mmap(256) 23 w[0]=identity as i64;w[1]=256;gpd_source_identity(w,cx);sys_write(1,identity,w[2]);gv_puts("\n") 24 let mesh:i64=gld_nth(cx,0,"meshes",0);let parts:i64=gli_array(cx,mesh,"primitives",0) 25 var p:i64=0;var failures:i64=0;var mapped:i64=0;var counted:i64=0;var triangles:i64=0;var mixed:i64=0 26 let tv:*i64=sys_mmap(GLD_VIEW_WORDS*8) as *i64;let iv:*i64=sys_mmap(GLD_VIEW_WORDS*8) as *i64 27 while p<parts{ 28 let beforeMixed:i64=mixed 29 let prim:i64=gld_nth(cx,mesh,"primitives",p);let material:i64=gld_nth(cx,0,"materials",gld_int(cx,prim,"material",-1)) 30 let nm:i64=gli_member(cx,material,"normalTexture");if nm==1{mapped=mapped+1};if nm<0{failures=failures+1} 31 if gli_member(cx,prim,"attributes")!=1{return 5};let sp:*i64=cx[4] as *i64;let attributes:i64=sp[0] 32 let tang:i64=gld_int(cx,attributes,"TANGENT",-1);let index:i64=gld_int(cx,prim,"indices",-1) 33 if gltf_accessor_view(cx,tang,st[2],tv)!=0||gltf_accessor_view(cx,index,st[2],iv)!=0{return 6} 34 if tv[3]!=5126||tv[5]!=4||tv[6]!=0||iv[5]!=1||iv[6]!=0||iv[1]%3!=0{return 7} 35 if iv[3]!=5121&&iv[3]!=5123&&iv[3]!=5125{return 8} 36 var i:i64=0;while i<tv[1]{ 37 let at:i64=tv[0]+i*tv[2];var k:i64=0;var nonzero:i64=0 38 while k<3{let b:i64=gll_ru32(bin,at+k*4);if ((b>>23)&255)==255{failures=failures+1};if (b&2147483647)!=0{nonzero=1};k=k+1} 39 let hand:i64=gll_ru32(bin,at+12);if (hand&2147483647)!=1065353216||nonzero==0{failures=failures+1} 40 counted=counted+1;i=i+1 41 } 42 i=0;while i<iv[1]{ 43 let a:i64=mt_index(bin,iv,i);let b:i64=mt_index(bin,iv,i+1);let c:i64=mt_index(bin,iv,i+2) 44 if a>=tv[1]||b>=tv[1]||c>=tv[1]{return 9} 45 let wa:i64=gll_ru32(bin,tv[0]+a*tv[2]+12);let wb:i64=gll_ru32(bin,tv[0]+b*tv[2]+12);let wc:i64=gll_ru32(bin,tv[0]+c*tv[2]+12) 46 if wa!=wb||wa!=wc{mixed=mixed+1};triangles=triangles+1;i=i+3 47 };gv_kv("part_index",p);gv_kv("part_mixed_handedness_triangles",mixed-beforeMixed);p=p+1 48 } 49 gv_kv("parts",parts);gv_kv("normal_map_parts",mapped);gv_kv("tangent_visits_shared_stream_repeated_per_part",counted);gv_kv("triangles",triangles);gv_kv("invalid_tangent_records",failures);gv_kv("mixed_handedness_triangles",mixed) 50 gv_check("source finite nonzero xyz and exact signed unit handedness",failures==0,ctr) 51 gv_check("source triangles have coherent handedness",mixed==0,ctr) 52 if expectMapped==1{gv_check("explicit mapped fixture has source normal texture",mapped>0,ctr)}else{gv_check("Catwalk is explicitly no-map compatibility only",mapped==0&&parts==14,ctr)} 53 gltf_view_close(cx);return gv_verdict("source-tangent",ctr,"Actual source tangent shape only; no unit-length/orthogonality/pose/normal-map rendering claim") 54}