nx_gltf_skin_material_gate_t340.nx source
↩ module page · 61 lines · 6027 B
1import "nx_char_asset.nx"
2import "nx_gltf_render_descriptor_candidate_t181.nx"
3import "nx_gate_verdict.nx"
4func sm_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}
5func sm_scalar(cx:*i64,parent:i64,key:*u8,q:i64,out:*i64)->i64{
6 if gli_member(cx,parent,key)!=1{return -1};let sp:*i64=cx[4] as *i64
7 return gld_number_fixed((cx[0]+sp[0]) as *u8,sp[1]-sp[0],q,out)
8}
9func main()->i64{
10 let c:*i64=gv_ctr();let ln:*i64=sys_mmap(16) as *i64
11 let src:*u8=sys_read_file("knowledge/gates/connected-body-sdf-domain-t337.glb",ln);let sourceBytes:i64=ln[0]
12 let cx:*i64=sys_mmap(GLD_CONTEXT_WORDS*8) as *i64
13 if gltf_view_open(src,sourceBytes,cx)!=0{return 1}
14 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
15 if gltf_accessor_view(cx,0,st[2],pv)!=0||gltf_accessor_view(cx,2,st[2],iv)!=0{return 2}
16 let nv:i64=pv[1];let nf:i64=iv[1]/3;let vertices:*i64=sys_mmap(nv*3*8) as *i64;let faces:*i64=sys_mmap(nf*3*8) as *i64
17 var i:i64=0;while i<nv{var j:i64=0;while j<3{if gld_view_float(cx,pv,i,j,1,(vertices as i64+(i*3+j)*8) as *i64)!=0{return 3};j=j+1};i=i+1}
18 i=0;while i<nf*3{faces[i]=gll_ru32(cx[8] as *u8,iv[0]+i*iv[2]);i=i+1}
19 let legacy:*u8="knowledge/gates/skin-material-legacy-t340.glb"
20 let oldBytes:i64=write_glb(vertices,faces,nv,nf,legacy);let old:*u8=sys_read_file(legacy,ln)
21 gv_check("legacy write_glb actual connected body remains byte-identical",oldBytes==sourceBytes&&ln[0]==sourceBytes&&sm_same(src,old,sourceBytes)==1,c)
22 let m:*i64=sys_mmap(GL_MAT_WORDS*8) as *i64;m[GL_MAT_R]=0;m[GL_MAT_G]=0;m[GL_MAT_B]=0;m[GL_MAT_METALLIC]=0;m[GL_MAT_ROUGHNESS]=GL_MAT_RATIO_Q
23 var refused:i64=1
24 if write_glb_material(vertices,faces,nv,nf,0 as *i64,GL_MAT_WORDS,legacy)!=-2{refused=0}
25 if write_glb_material(vertices,faces,nv,nf,m,GL_MAT_WORDS-1,legacy)!=-2{refused=0}
26 if write_glb_material(vertices,faces,nv,nf,m,GL_MAT_WORDS+1,legacy)!=-2{refused=0}
27 i=0;while i<GL_MAT_WORDS{let saved:i64=m[i];m[i]=-1;if write_glb_material(vertices,faces,nv,nf,m,GL_MAT_WORDS,legacy)!=-2{refused=0};var top:i64=GL_MAT_RATIO_Q;if i<=GL_MAT_B{top=GL_MAT_LINEAR_Q};m[i]=top+1;if write_glb_material(vertices,faces,nv,nf,m,GL_MAT_WORDS,legacy)!=-2{refused=0};m[i]=saved;i=i+1}
28 if char_write_glb_skin_recipe(vertices,faces,nv,nf,-1,NTB_TORSO,legacy)!=-2{refused=0}
29 if char_write_glb_skin_recipe(vertices,faces,nv,nf,SI_GENE_MAX+1,NTB_TORSO,legacy)!=-2{refused=0}
30 if char_write_glb_skin_recipe(vertices,faces,nv,nf,0,-1,legacy)!=-2{refused=0}
31 if char_write_glb_skin_recipe(vertices,faces,nv,nf,0,NTB_GENS+1,legacy)!=-2{refused=0}
32 let after:*u8=sys_read_file(legacy,ln)
33 gv_check("missing/count/range material and recipe refusals preserve output",refused==1&&ln[0]==sourceBytes&&sm_same(src,after,sourceBytes)==1,c)
34 m[GL_MAT_METALLIC]=0;var writefail:i64=write_glb_material(vertices,faces,nv,nf,m,GL_MAT_WORDS,"knowledge/gates/skin-material-no-directory-t340/out.glb")
35 gv_check("missing parent atomic write refuses before commit",writefail==GL_MAT_IO_RC_BASE+AR_CHECK_OPEN,c)
36 let license:*i64=sys_mmap(8*8) as *i64
37 consent_init(license,PROV_SCAN,0,LIC_CLOTHED,USE_GAME,0,0,0)
38 let denied:i64=char_export_existing_mesh_recipe_gated(vertices,faces,nv,nf,license,0,0,0,USE_GAME,0,NTB_TORSO,legacy)
39 let deniedBytes:*u8=sys_read_file(legacy,ln)
40 gv_check("original consent refusal leaves existing output unchanged",denied==-1&&ln[0]==sourceBytes&&sm_same(src,deniedBytes,sourceBytes)==1,c)
41 consent_init(license,PROV_SYNTH,0,LIC_ARTISTIC,USE_GAME,0,0,0)
42 // Boundary fixtures qualify the declared recipe domain; neither is a selected release identity.
43 var endpoint:i64=0;while endpoint<2{let hue:i64=endpoint*SI_GENE_MAX;var region:i64=NTB_FACE
44 while region<=NTB_GENS{
45 let path:*u8=sys_mmap(256);var p:i64=gl_cat(path,0,"knowledge/gates/skin-material-h");p=gl_num(path,p,hue);p=gl_cat(path,p,"-r");p=gl_num(path,p,region);p=gl_cat(path,p,"-t340.glb")
46 let bytes:i64=char_export_existing_mesh_recipe_gated(vertices,faces,nv,nf,license,0,0,0,USE_GAME,hue,region,path);let b:*u8=sys_read_file(path,ln);let dc:*i64=sys_mmap(GLD_CONTEXT_WORDS*8) as *i64
47 var ok:i64=1;if bytes<=0||gltf_view_open(b,ln[0],dc)!=0{return 4}
48 let mesh:i64=gld_nth(dc,0,"meshes",0);let prim:i64=gld_nth(dc,mesh,"primitives",0);if gld_int(dc,prim,"material",-1)!=0{ok=0}
49 let mat:i64=gld_nth(dc,0,"materials",0);if gli_member(dc,mat,"pbrMetallicRoughness")!=1{return 5};let ds:*i64=dc[4] as *i64;let pbr:i64=ds[0]
50 let vals:*i64=sys_mmap(4*8) as *i64;let rgb:*i64=sys_mmap(3*8) as *i64;let scalar:*i64=sys_mmap(8) as *i64;ntb_albedo_genome(hue,region,rgb)
51 if gld_array_fixed(dc,pbr,"baseColorFactor",GL_MAT_LINEAR_Q,vals,4)!=1{ok=0}
52 i=0;while i<3{if vals[i]!=si_linear_of_byte(rgb[i]){ok=0};i=i+1};if vals[3]!=GL_MAT_LINEAR_Q{ok=0}
53 if sm_scalar(dc,pbr,"metallicFactor",GL_MAT_RATIO_Q,scalar)!=0||scalar[0]!=0{ok=0}
54 if sm_scalar(dc,pbr,"roughnessFactor",GL_MAT_RATIO_Q,scalar)!=0||scalar[0]!=ntb_rough_of_region(region){ok=0}
55 let w:*i64=sys_mmap(32) as *i64;if gltf_render_static_descriptor(dc,0,w)!=0{ok=0};let n:i64=w[2];let buf:*u8=sys_mmap(n);w[0]=buf as i64;w[1]=n;w[2]=0;w[3]=0;if gltf_render_static_descriptor(dc,0,w)!=0||w[2]!=n{ok=0}
56 p=gl_cat(path,p,".json");let fd:i64=sys_openat_wr(path,MODE_0644);if fd<0{return 6};let wrote:i64=sys_write(fd,buf,n);sys_close(fd);if wrote!=n{ok=0}
57 gv_puts("recipe hue=");gv_num(hue);gv_puts(" region=");gv_num(region);gv_puts(" linearRGB_e5=");i=0;while i<3{gv_num(vals[i]);gv_puts(" ");i=i+1};gv_puts(" roughness_permil=");gv_num(ntb_rough_of_region(region));gv_puts(" sourceF0_permil=");gv_num(ntb_f0_skin());gv_puts(" glTF_baseline_F0=0.04 whole_surface_model=1 calibrated=0\n")
58 gv_check("actual exported material round-trip and native static descriptor",ok,c);gltf_view_close(dc);region=region+1
59 };endpoint=endpoint+1}
60 gltf_view_close(cx);return gv_verdict("SCALAR-SKIN-EXPORT",c,"explicit recipe; uncalibrated whole-surface dielectric approximation; no release identity selected")
61}