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}