code wiki / (root) / nx_gltf_multipart_gate_t345.nx

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}