code wiki / (root) / nx_gltf_render_descriptor_gate_candidate_t217.nx

nx_gltf_render_descriptor_gate_candidate_t217.nx source

↩ module page · 155 lines · 13349 B

1// nx_gltf_render_descriptor_gate_candidate_t217.nx -- Tests GLTF material loading with custom fixtures and validation checks. 2import "nx_gltf_render_descriptor_candidate_t181.nx" 3import "nx_fs_create_lib.nx" 4static gmc_failed:i64 5static gmc_tested:i64 6func gmc_check(ok:i64,label:*u8)->i64{ 7 gmc_tested=gmc_tested+1;fsx_puts(label);if ok==1{fsx_puts(" PASS\n")}else{gmc_failed=gmc_failed+1;fsx_puts(" FAIL\n")};return ok 8} 9func gmc_contains(s:*u8,n:i64,needle:*u8)->i64{ 10 let m:i64=gll_slen(needle);if m>n{return 0};var i:i64=0 11 while i<=n-m{var j:i64=0;while j<m{if s[i+j]!=needle[j]{break};j=j+1};if j==m{return 1};i=i+1};return 0 12} 13func gmc_material(cx:*i64,index:i64,needle:*u8,accept:i64)->i64{ 14 let w:*i64=sys_mmap_try(32) as *i64;if (w as i64)<=0{return 0};var i:i64=0;while i<4{w[i]=0;i=i+1} 15 let rc:i64=gpd_material(w,cx,index) 16 if accept==0{sys_munmap_direct(w as *u8,32);if rc!=0{return 1};return 0} 17 if rc!=0||w[3]!=0||w[2]<=0{sys_munmap_direct(w as *u8,32);return 0} 18 let n:i64=w[2];let out:*u8=sys_mmap_try(n);if (out as i64)<=0{sys_munmap_direct(w as *u8,32);return 0} 19 w[0]=out as i64;w[1]=n;w[2]=0;w[3]=0 20 var ok:i64=0;if gpd_material(w,cx,index)==0{if w[3]==0&&w[2]==n{ok=gmc_contains(out,n,needle)}} 21 sys_munmap_direct(out,n);sys_munmap_direct(w as *u8,32);return ok 22} 23// Minimal GLB fixtures use normative header/chunk extents and one four-byte BIN. 24// Their material numbers are boundary examples, not production policy thresholds. 25func gmc_fixture(material:*u8,needle:*u8,accept:i64,label:*u8)->i64{ 26 let pre:*u8="{\"asset\":{\"version\":\"2.0\"},\"buffers\":[{\"byteLength\":4}],\"materials\":[" 27 let post:*u8="]}";let pn:i64=gll_slen(pre);let mn:i64=gll_slen(material);let en:i64=gll_slen(post) 28 let jn:i64=pn+mn+en;let padded:i64=gll_align4(jn);let total:i64=12+8+padded+8+4 29 let src:*u8=sys_mmap_try(total);if (src as i64)<=0{return gmc_check(0,label)} 30 glp_u32(src,0,1179937895);glp_u32(src,4,2);glp_u32(src,8,total);glp_u32(src,12,padded);glp_u32(src,16,1313821514) 31 var i:i64=0;while i<pn{src[20+i]=pre[i];i=i+1};i=0;while i<mn{src[20+pn+i]=material[i];i=i+1};i=0;while i<en{src[20+pn+mn+i]=post[i];i=i+1};i=jn;while i<padded{src[20+i]=32 as u8;i=i+1} 32 glp_u32(src,20+padded,4);glp_u32(src,24+padded,5130562);glp_u32(src,28+padded,0) 33 let cx:*i64=sys_mmap_try(GLD_CONTEXT_WORDS*8) as *i64;if (cx as i64)<=0{sys_munmap_direct(src,total);return gmc_check(0,label)} 34 var ok:i64=0;if gltf_view_open(src,total,cx)==0{ok=gmc_material(cx,0,needle,accept);gltf_view_close(cx)} 35 sys_munmap_direct(cx as *u8,GLD_CONTEXT_WORDS*8);sys_munmap_direct(src,total);return gmc_check(ok,label) 36} 37// Valid skinned triangle with independent typed accessors; COLOR_0 is optional by fixture variant. 38// Numeric extents below describe these fixture bytes, not renderer admission limits. 39func gmc_geometry_color(present:i64)->i64{ 40 let before:*u8="{\"asset\":{\"version\":\"2.0\"},\"buffers\":[{\"byteLength\":260}],\"bufferViews\":[{\"buffer\":0,\"byteOffset\":0,\"byteLength\":36},{\"buffer\":0,\"byteOffset\":36,\"byteLength\":12},{\"buffer\":0,\"byteOffset\":48,\"byteLength\":48},{\"buffer\":0,\"byteOffset\":96,\"byteLength\":24},{\"buffer\":0,\"byteOffset\":120,\"byteLength\":36},{\"buffer\":0,\"byteOffset\":156,\"byteLength\":48},{\"buffer\":0,\"byteOffset\":204,\"byteLength\":48},{\"buffer\":0,\"byteOffset\":252,\"byteLength\":6}],\"accessors\":[{\"bufferView\":0,\"componentType\":5126,\"count\":3,\"type\":\"VEC3\",\"min\":[0,0,0],\"max\":[1,1,0]},{\"bufferView\":1,\"componentType\":5121,\"count\":3,\"type\":\"VEC4\"},{\"bufferView\":2,\"componentType\":5126,\"count\":3,\"type\":\"VEC4\"},{\"bufferView\":3,\"componentType\":5126,\"count\":3,\"type\":\"VEC2\"},{\"bufferView\":4,\"componentType\":5126,\"count\":3,\"type\":\"VEC3\"},{\"bufferView\":5,\"componentType\":5126,\"count\":3,\"type\":\"VEC4\"},{\"bufferView\":6,\"componentType\":5126,\"count\":3,\"type\":\"VEC4\"},{\"bufferView\":7,\"componentType\":5123,\"count\":3,\"type\":\"SCALAR\"}],\"materials\":[{\"pbrMetallicRoughness\":{\"metallicFactor\":0}}],\"meshes\":[{\"primitives\":[{\"attributes\":{\"POSITION\":0,\"JOINTS_0\":1,\"WEIGHTS_0\":2,\"TEXCOORD_0\":3,\"NORMAL\":4,\"TANGENT\":5" 41 var color:*u8="";if present==1{color=",\"COLOR_0\":6"} 42 let after:*u8="},\"indices\":7,\"material\":0}]}],\"nodes\":[{\"mesh\":0,\"skin\":0},{}],\"skins\":[{\"joints\":[1]}],\"scenes\":[{\"nodes\":[0,1]}],\"scene\":0}" 43 let bn:i64=gll_slen(before);let cn:i64=gll_slen(color);let an:i64=gll_slen(after) 44 let jn:i64=bn+cn+an;let padded:i64=gll_align4(jn);let total:i64=28+padded+260 45 let src:*u8=sys_mmap_try(total);if (src as i64)<=0{return -1} 46 glp_u32(src,0,1179937895);glp_u32(src,4,2);glp_u32(src,8,total);glp_u32(src,12,padded);glp_u32(src,16,1313821514) 47 var i:i64=0;while i<bn{src[20+i]=before[i];i=i+1};i=0;while i<cn{src[20+bn+i]=color[i];i=i+1};i=0;while i<an{src[20+bn+cn+i]=after[i];i=i+1};i=jn;while i<padded{src[20+i]=32 as u8;i=i+1} 48 glp_u32(src,20+padded,260);glp_u32(src,24+padded,5130562) 49 let bin:*u8=src+28+padded;i=0;while i<260{bin[i]=0 as u8;i=i+1} 50 glp_u32(bin,12,1065353216);glp_u32(bin,28,1065353216) 51 i=0;while i<3{ 52 glp_u32(bin,48+i*16,1065353216) 53 glp_u32(bin,120+i*12+8,1065353216) 54 glp_u32(bin,156+i*16,1065353216);glp_u32(bin,156+i*16+12,1065353216) 55 glp_u32(bin,204+i*16,1048576000);glp_u32(bin,204+i*16+4,1056964608) 56 glp_u32(bin,204+i*16+8,1061158912);glp_u32(bin,204+i*16+12,1065353216) 57 i=i+1 58 };bin[254]=1 as u8;bin[256]=2 as u8 59 let cx:*i64=sys_mmap_try(GLD_CONTEXT_WORDS*8) as *i64 60 if (cx as i64)<=0{sys_munmap_direct(src,total);return -1} 61 let opened:i64=gltf_view_open(src,total,cx) 62 gmc_check(opened==0,"geometry fixture native GLB opens") 63 if opened!=0{sys_munmap_direct(cx as *u8,GLD_CONTEXT_WORDS*8);sys_munmap_direct(src,total);return -1} 64 let view:*i64=sys_mmap_try(GLD_VIEW_WORDS*8) as *i64;let state:*i64=cx[5] as *i64 65 if (view as i64)<=0{return -1} 66 let vr:i64=gltf_accessor_view(cx,6,state[2],view) 67 gmc_check(vr==0&&view[1]==3&&view[3]==5126&&view[5]==4,"COLOR accessor is real float VEC4 three vertices") 68 sys_munmap_direct(view as *u8,GLD_VIEW_WORDS*8) 69 let w:*i64=sys_mmap_try(32) as *i64;if (w as i64)<=0{return -1};i=0;while i<4{w[i]=0;i=i+1} 70 let sizing:i64=gltf_render_descriptor(cx,0,0,w);let n:i64=w[2] 71 gmc_check(sizing==0&&w[3]==0&&n>0,"geometry descriptor sizing succeeds") 72 if sizing!=0||w[3]!=0||n<=0{return -1} 73 let out:*u8=sys_mmap_try(n);if (out as i64)<=0{return -1} 74 w[0]=out as i64;w[1]=n;w[2]=0;w[3]=0 75 let emitted:i64=gltf_render_descriptor(cx,0,0,w) 76 gmc_check(emitted==0&&w[3]==0&&w[2]==n,"geometry descriptor actual bytes match sizing") 77 var path:*u8="knowledge/gates/color-absent-descriptor-t217.json" 78 if present==0{ 79 gmc_check(gmc_contains(out,n,"\"vertexColorInput\":null"),"absent COLOR_0 remains explicit null") 80 gmc_check(gmc_contains(out,n,"\"litGeometryEligible\":true"),"absent COLOR_0 admits geometry lighting") 81 gmc_check(gmc_contains(out,n,"\"litGeometryReason\":\"vertex-color-absent\""),"absent COLOR_0 has precise admission reason") 82 }else{ 83 path="knowledge/gates/color-present-descriptor-t217.json" 84 gmc_check(gmc_contains(out,n,"\"vertexColorInput\":6"),"present COLOR_0 accessor reference retained") 85 gmc_check(gmc_contains(out,n,"\"litGeometryEligible\":false"),"present unrendered COLOR_0 refuses geometry lighting") 86 gmc_check(gmc_contains(out,n,"\"litGeometryReason\":\"linear-vertex-color-not-rendered\""),"present COLOR_0 has precise unsupported reason") 87 } 88 gmc_check(gmc_contains(out,n,"\"litEligible\":true"),"scalar material admission stays independent of geometry") 89 let saved:i64=fxc_create(path,out,n) 90 if saved==FXC_EXISTS{ 91 let sz:*i64=sys_mmap_try(8) as *i64;if (sz as i64)<=0{return -1} 92 let prior:*u8=sys_read_file(path,sz);var same:i64=0 93 if (prior as i64)>0{if sz[0]==n{same=1;i=0;while i<n{if prior[i]!=out[i]{same=0};i=i+1}};sys_free_file(prior,sz[0])} 94 sys_munmap_direct(sz as *u8,8);gmc_check(same,"retained geometry descriptor equals native output") 95 }else{gmc_check(saved==n,"geometry descriptor retained from actual native output")} 96 gltf_view_close(cx);sys_munmap_direct(cx as *u8,GLD_CONTEXT_WORDS*8) 97 sys_munmap_direct(src,total);sys_munmap_direct(out,n);sys_munmap_direct(w as *u8,32);return 0 98} 99 100func main(argc:i64,argv:*i64)->i64{ 101 if argc!=3{fsx_puts("usage: source.glb new-descriptor.json\n");return 2} 102 gmc_check(gmc_geometry_color(0)==0,"COLOR_0 absent fixture completes") 103 gmc_check(gmc_geometry_color(1)==0,"COLOR_0 present fixture completes") 104 gmc_fixture("{}","\"metallicFactor\":1",1,"absent metallic defaults one") 105 gmc_fixture("{}","\"roughnessFactor\":1",1,"absent roughness defaults one") 106 gmc_fixture("{}","\"emissiveFactor\":[0,0,0]",1,"absent emission defaults zero") 107 gmc_fixture("{\"pbrMetallicRoughness\":{\"metallicFactor\":0,\"roughnessFactor\":1}}","\"metallicFactor\":0",1,"explicit dielectric preserved") 108 gmc_fixture("{\"pbrMetallicRoughness\":{\"metallicFactor\":-0}}","\"metallicFactor\":-0",1,"signed zero preserved") 109 gmc_fixture("{\"pbrMetallicRoughness\":{\"roughnessFactor\":1e0}}","\"roughnessFactor\":1e0",1,"exponent one preserved") 110 gmc_fixture("{\"pbrMetallicRoughness\":{\"metallicFactor\":-1e-100}}","",0,"negative subprecision refuses") 111 gmc_fixture("{\"pbrMetallicRoughness\":{\"roughnessFactor\":1.00000000000000000001}}","",0,"above-one subprecision refuses") 112 gmc_fixture("{\"pbrMetallicRoughness\":{\"metallicFactor\":\"0\"}}","",0,"string metallic refuses") 113 gmc_fixture("{\"pbrMetallicRoughness\":{\"roughnessFactor\":null}}","",0,"null roughness refuses") 114 gmc_fixture("{\"pbrMetallicRoughness\":{\"baseColorFactor\":[1,1,1]}}","",0,"short base factor refuses") 115 gmc_fixture("{\"pbrMetallicRoughness\":{\"baseColorFactor\":[1,1,1,1.01]}}","",0,"out of range base alpha refuses") 116 gmc_fixture("{\"emissiveFactor\":[0.2,0,1]}","\"emissiveFactor\":[0.2,0,1]",1,"explicit emission preserved") 117 gmc_fixture("{\"emissiveFactor\":[0,0]}","",0,"short emission refuses") 118 gmc_fixture("{\"emissiveFactor\":[0,0,0,0]}","",0,"long emission refuses") 119 gmc_fixture("{\"emissiveFactor\":[0,-1e-100,0]}","",0,"negative emission refuses") 120 gmc_fixture("{\"emissiveFactor\":[0,\"1\",0]}","",0,"string emission refuses") 121 gmc_fixture("{\"emissiveFactor\":[0,1.00000000000000000001,0]}","",0,"above-one emission refuses") 122 gmc_fixture("{\"normalTexture\":{\"index\":0,\"scale\":0.5}}","\"litEligible\":false",1,"normalTexture blocked from lit without data loss") 123 gmc_fixture("{\"normalTexture\":{\"index\":0,\"scale\":0.5}}","\"normalTexture\":{\"index\":0,\"scale\":0.5}",1,"normalTexture metadata retained") 124 gmc_fixture("{\"occlusionTexture\":{\"index\":0,\"strength\":0.7}}","\"litEligible\":false",1,"occlusionTexture blocked from lit without data loss") 125 gmc_fixture("{\"occlusionTexture\":{\"index\":0,\"strength\":0.7}}","\"occlusionTexture\":{\"index\":0,\"strength\":0.7}",1,"occlusionTexture metadata retained") 126 gmc_fixture("{\"emissiveTexture\":{\"index\":0}}","\"litEligible\":false",1,"emissiveTexture blocked from lit without data loss") 127 gmc_fixture("{\"emissiveTexture\":{\"index\":0}}","\"emissiveTexture\":{\"index\":0}",1,"emissiveTexture metadata retained") 128 gmc_fixture("{\"pbrMetallicRoughness\":{\"metallicRoughnessTexture\":{\"index\":0}}}","\"litEligible\":false",1,"metallicRoughnessTexture blocked from lit without data loss") 129 gmc_fixture("{\"pbrMetallicRoughness\":{\"metallicRoughnessTexture\":{\"index\":0}}}","\"metallicRoughnessTexture\":{\"index\":0}",1,"metallicRoughnessTexture metadata retained") 130 let ln:*i64=sys_mmap_try(8) as *i64;if (ln as i64)<=0{return 3} 131 let src:*u8=sys_read_file(argv[1] as *u8,ln);if (src as i64)<=0{return 3} 132 let cx:*i64=sys_mmap_try(GLD_CONTEXT_WORDS*8) as *i64;if (cx as i64)<=0{return 3} 133 if gltf_view_open(src,ln[0],cx)!=0{return 4} 134 let count:i64=gli_array(cx,0,"materials",0);gmc_check(count==14,"representative source has fourteen materials") 135 var i:i64=0;while i<count{ 136 gmc_check(gmc_material(cx,i,"\"metallicFactor\":0",1),"source dielectric preserved") 137 gmc_check(gmc_material(cx,i,"\"roughnessFactor\":1",1),"source roughness preserved") 138 gmc_check(gmc_material(cx,i,"\"factor\":[0.4452008817533644,0.4452008817533644,0.4452008817533644,1]",1),"source exact factor preserved") 139 gmc_check(gmc_material(cx,i,"\"emissiveFactor\":[0,0,0]",1),"source absent emission remains zero") 140 i=i+1 141 } 142 if gmc_failed!=0{fsx_puts("MATERIAL-CONTRACT failed=");fsx_putn(gmc_failed);fsx_puts(" tested=");fsx_putn(gmc_tested);fsx_puts("\n");return 5} 143 let w:*i64=sys_mmap_try(32) as *i64;if (w as i64)<=0{return 3};i=0;while i<4{w[i]=0;i=i+1} 144 if gltf_render_descriptor(cx,0,0,w)!=0{return 6};let n:i64=w[2] 145 let out:*u8=sys_mmap_try(n);if (out as i64)<=0{return 3};w[0]=out as i64;w[1]=n;w[2]=0;w[3]=0 146 if gltf_render_descriptor(cx,0,0,w)!=0{return 6};if w[2]!=n||w[3]!=0{return 6} 147 let written:i64=fxc_create(argv[2] as *u8,out,n) 148 if written==FXC_EXISTS{ 149 let prior:*u8=sys_read_file(argv[2] as *u8,ln);if (prior as i64)<=0{return 7};if ln[0]!=n{return 7} 150 i=0;while i<n{if prior[i]!=out[i]{return 7};i=i+1};sys_free_file(prior,ln[0]) 151 }else{if written!=n{return 7}} 152 fsx_puts("MATERIAL-CONTRACT passed=");fsx_putn(gmc_tested);fsx_puts(" descriptor_bytes=");fsx_putn(n);fsx_puts("\n") 153 gltf_view_close(cx);sys_munmap_direct(cx as *u8,GLD_CONTEXT_WORDS*8);sys_munmap_direct(out,n);sys_munmap_direct(w as *u8,32) 154 return 0 155}