nx_gltf_multipart_gate_t345.nx source
↩ module page · 71 lines · 8868 B
1// nx_gltf_multipart_gate_t345.nx -- Processes and validates GLB files for material and geometry consistency across multiple rendering contexts.
2import "nx_gltf_export.nx"
3import "nx_gltf_render_descriptor_candidate_t181.nx"
4import "nx_gate_verdict.nx"
5func mp_same(a:*u8,b:*u8,n:i64)->i64{var i:i64=0;while i<n{if a[i]!=b[i]{return 0};i=i+1};return 1}
6func main()->i64{
7 let c:*i64=gv_ctr();let ln:*i64=sys_mmap(16) as *i64
8 let src:*u8=sys_read_file("knowledge/gates/connected-body-sdf-domain-t337.glb",ln);let sourceBytes:i64=ln[0]
9 let cx:*i64=sys_mmap(GLD_CONTEXT_WORDS*8) as *i64;if gltf_view_open(src,sourceBytes,cx)!=0{return 1}
10 let pv:*i64=sys_mmap(GLD_VIEW_WORDS*8) as *i64;let iv:*i64=sys_mmap(GLD_VIEW_WORDS*8) as *i64;let st:*i64=cx[5] as *i64
11 if gltf_accessor_view(cx,0,st[2],pv)!=0||gltf_accessor_view(cx,2,st[2],iv)!=0{return 2}
12 let nv:i64=pv[1];let nf:i64=iv[1]/3;let vertices:*i64=sys_mmap(nv*24) as *i64;let faces:*i64=sys_mmap(nf*24) as *i64
13 var i:i64=0;while i<nv{var k:i64=0;while k<3{if gld_view_float(cx,pv,i,k,1,(vertices as i64+(i*3+k)*8) as *i64)!=0{return 3};k=k+1};i=i+1}
14 i=0;while i<nf*3{faces[i]=gll_ru32(cx[8] as *u8,iv[0]+i*iv[2]);i=i+1}
15 let legacy:*u8="knowledge/gates/multipart-legacy-t345.glb";let legacySize:i64=write_glb(vertices,faces,nv,nf,legacy);let old:*u8=sys_read_file(legacy,ln)
16 gv_check("legacy write_glb real connected geometry byte parity",legacySize==sourceBytes&&ln[0]==sourceBytes&&mp_same(src,old,sourceBytes)==1,c)
17 let r:*GlMaterialParts=sys_mmap(__size_of(GlMaterialParts)) as *GlMaterialParts
18 let labels:*i64=sys_mmap(nf*8) as *i64;i=0;while i<nf{labels[i]=i%2;i=i+1}
19 let mats:*i64=sys_mmap(3*GL_MAT_WORDS*8) as *i64
20 i=0;while i<3{mats[i*GL_MAT_WORDS+GL_MAT_R]=i*GL_MAT_LINEAR_Q/2;mats[i*GL_MAT_WORDS+GL_MAT_G]=GL_MAT_LINEAR_Q-i*GL_MAT_LINEAR_Q/2;mats[i*GL_MAT_WORDS+GL_MAT_B]=GL_MAT_LINEAR_Q/2;mats[i*GL_MAT_WORDS+GL_MAT_METALLIC]=i*GL_MAT_RATIO_Q/2;mats[i*GL_MAT_WORDS+GL_MAT_ROUGHNESS]=GL_MAT_RATIO_Q-i*GL_MAT_RATIO_Q/2;i=i+1}
21 r.face_material=labels;r.face_count=nf;r.materials=mats;r.material_count=3;r.material_words=3*GL_MAT_WORDS
22 let path:*u8="knowledge/gates/multipart-material-t345.glb";let written:i64=write_glb_material_parts(vertices,faces,nv,nf,r,path);let data:*u8=sys_read_file(path,ln);let size:i64=ln[0]
23 let dc:*i64=sys_mmap(GLD_CONTEXT_WORDS*8) as *i64;if written<=0||size!=written||gltf_view_open(data,size,dc)!=0{return 4}
24 let mesh:i64=gld_nth(dc,0,"meshes",0)
25 gv_check("explicit material table retained and only nonempty primitives emitted",gli_array(dc,0,"materials",0)==3&&gli_array(dc,mesh,"primitives",0)==2,c)
26 gv_check("position and normal bytes preserved exactly",mp_same(cx[8] as *u8,dc[8] as *u8,nv*24)==1,c)
27 var exact:i64=1;var m:i64=0;let dv:*i64=sys_mmap(GLD_VIEW_WORDS*8) as *i64;let ds:*i64=dc[5] as *i64
28 while m<2{let p:i64=gld_nth(dc,mesh,"primitives",m);if gld_int(dc,p,"material",-1)!=m{exact=0};if gltf_accessor_view(dc,gld_int(dc,p,"indices",-1),ds[2],dv)!=0{return 5}
29 var cursor:i64=0;i=0;while i<nf{if labels[i]==m{var k:i64=0;while k<3{if gll_ru32(dc[8] as *u8,dv[0]+cursor*dv[2])!=faces[i*3+k]{exact=0};cursor=cursor+1;k=k+1}};i=i+1};if cursor!=dv[1]{exact=0};m=m+1}
30 gv_check("every triangle and winding preserved in stable per-material order",exact,c)
31 let w:*i64=sys_mmap(32) as *i64;var rc:i64=gltf_render_static_descriptor(dc,0,w);let descriptorSize:i64=w[2];let descriptor:*u8=sys_mmap(descriptorSize)
32 w[0]=descriptor as i64;w[1]=descriptorSize;w[2]=0;w[3]=0;rc=rc+gltf_render_static_descriptor(dc,0,w)
33 gv_check("multipart static descriptor exact two-pass byte count",rc==0&&w[2]==descriptorSize&&w[3]==0,c)
34 if atomic_rewrite_checked("knowledge/gates/multipart-material-t345.json",descriptor,descriptorSize)!=0{return 6}
35 // Refusal attempts all target the existing valid output; none may mutate it.
36 var refused:i64=1;labels[0]=-1;if write_glb_material_parts(vertices,faces,nv,nf,r,path)!=-2{refused=0};labels[0]=3;if write_glb_material_parts(vertices,faces,nv,nf,r,path)!=-2{refused=0};labels[0]=0
37 r.face_count=nf-1;if write_glb_material_parts(vertices,faces,nv,nf,r,path)!=-2{refused=0};r.face_count=nf
38 r.material_words=3*GL_MAT_WORDS-1;if write_glb_material_parts(vertices,faces,nv,nf,r,path)!=-2{refused=0};r.material_words=3*GL_MAT_WORDS
39 r.material_count=0;if write_glb_material_parts(vertices,faces,nv,nf,r,path)!=-2{refused=0};r.material_count=3
40 r.face_material=0 as *i64;if write_glb_material_parts(vertices,faces,nv,nf,r,path)!=-2{refused=0};r.face_material=labels
41 mats[GL_MAT_R]=GL_MAT_LINEAR_Q+1;if write_glb_material_parts(vertices,faces,nv,nf,r,path)!=-2{refused=0};mats[GL_MAT_R]=0
42 let first:i64=faces[0];faces[0]=nv;if write_glb_material_parts(vertices,faces,nv,nf,r,path)!=-2{refused=0};faces[0]=first
43 let after:*u8=sys_read_file(path,ln);gv_check("missing/count/out-of-range material and index refusals leave file unchanged",refused==1&&ln[0]==size&&mp_same(data,after,size)==1,c)
44 gv_check("atomic missing-directory failure remains explicit",write_glb_material_parts(vertices,faces,nv,nf,r,"knowledge/gates/multipart-no-directory-t345/out.glb")==GL_MAT_IO_RC_BASE+AR_CHECK_OPEN,c)
45 // Corrupt the actual final primitive index in memory only; native descriptor must inspect every part.
46 let save:i64=gll_ru32(dc[8] as *u8,dv[0]);gl_wr32(dc[8] as *u8,dv[0],nv);w[0]=0;w[1]=0;w[2]=0;w[3]=0
47 gv_check("out-of-range index in later primitive rejected before descriptor emission",gltf_render_static_descriptor(dc,0,w)==-2&&w[2]==0,c);gl_wr32(dc[8] as *u8,dv[0],save)
48 w[0]=0;w[1]=0;w[2]=0;w[3]=0;glw_s(w,"abc");glw_i(w,-17);let chars:*u8=sys_mmap(6);chars[5]=90 as u8;w[0]=chars as i64;w[1]=5;w[2]=0;w[3]=0;glw_s(w,"abc");glw_n(w,17)
49 gv_check("shared writer exact fit and guard byte",w[2]==5&&w[3]==0&&chars[5]==90 as u8,c);glw_s(w,"x");let stuck:i64=w[2];glw_s(w,"ignored")
50 gv_check("shared writer overflow sticky without truncation masquerading as success",w[3]!=0&&w[2]==stuck&&chars[5]==90 as u8,c)
51 gv_puts("artifact=knowledge/gates/multipart-material-t345.glb descriptor=knowledge/gates/multipart-material-t345.json vertices=");gv_num(nv);gv_puts(" triangles=");gv_num(nf);gv_puts(" materials=3 used=2 fixturePalette=synthetic-boundary-not-skin\n")
52
53 // Existing one-primitive descriptor output must remain byte-for-byte identical.
54 let golden:*u8=sys_read_file("knowledge/gates/connected-body-static-descriptor-t338.json",ln);let goldenSize:i64=ln[0]
55 w[0]=0;w[1]=0;w[2]=0;w[3]=0;let oldRc:i64=gltf_render_static_descriptor(cx,0,w);let oldDescSize:i64=w[2];let oldDesc:*u8=sys_mmap(oldDescSize);w[0]=oldDesc as i64;w[1]=oldDescSize;w[2]=0;w[3]=0
56 gv_check("legacy single-primitive descriptor byte parity",oldRc==0&&gltf_render_static_descriptor(cx,0,w)==0&&oldDescSize==goldenSize&&mp_same(oldDesc,golden,goldenSize)==1,c)
57 // A later primitive may not silently switch to another vertex stream under this bounded static contract.
58 let later:i64=gld_nth(dc,mesh,"primitives",1);let span:*i64=dc[4] as *i64
59 if gli_member(dc,later,"attributes")!=1{return 7};let attrib:i64=span[0];if gli_member(dc,attrib,"NORMAL")!=1{return 7};let normalByte:*u8=(dc[0]+span[0]) as *u8;let normalSaved:u8=normalByte[0];normalByte[0]=48 as u8
60 w[0]=0;w[1]=0;w[2]=0;w[3]=0;gv_check("later primitive with mismatched vertex accessor refuses before output",gltf_render_static_descriptor(dc,0,w)==-2&&w[2]==0,c);normalByte[0]=normalSaved
61 // The fixture count deliberately exceeds the old 8192-byte JSON buffer; it is not a runtime limit.
62 let manyCount:i64=60;let many:*i64=sys_mmap(manyCount*GL_MAT_WORDS*8) as *i64
63 i=0;while i<manyCount*GL_MAT_WORDS{many[i]=mats[i%GL_MAT_WORDS];i=i+1};i=0;while i<nf{labels[i]=i%manyCount;i=i+1}
64 r.materials=many;r.material_count=manyCount;r.material_words=manyCount*GL_MAT_WORDS
65 let manyPath:*u8="knowledge/gates/multipart-many-t345.glb";let manyWritten:i64=write_glb_material_parts(vertices,faces,nv,nf,r,manyPath);let manyData:*u8=sys_read_file(manyPath,ln);let manyCx:*i64=sys_mmap(GLD_CONTEXT_WORDS*8) as *i64
66 if manyWritten<=0||gltf_view_open(manyData,ln[0],manyCx)!=0{return 8};let manyMesh:i64=gld_nth(manyCx,0,"meshes",0)
67 w[0]=0;w[1]=0;w[2]=0;w[3]=0;let manyRc:i64=gltf_render_static_descriptor(manyCx,0,w);let manyDescSize:i64=w[2];let manyDesc:*u8=sys_mmap(manyDescSize);w[0]=manyDesc as i64;w[1]=manyDescSize;w[2]=0;w[3]=0
68 gv_check("two-pass JSON above former fixed buffer and 60 material parts",gll_ru32(manyData,12)>K_MAGIC_8192&&gli_array(manyCx,manyMesh,"primitives",0)==manyCount&&manyRc==0&&gltf_render_static_descriptor(manyCx,0,w)==0&&w[2]==manyDescSize,c)
69 if atomic_rewrite_checked("knowledge/gates/multipart-many-t345.json",manyDesc,manyDescSize)!=0{return 9};gltf_view_close(manyCx)
70 gltf_view_close(dc);gltf_view_close(cx);return gv_verdict("GLTF-MULTIPART",c,"generic material preservation; synthetic diagnostic palette; no anatomical/material calibration claim")
71}