code wiki / _hdl_build / nx_procgen_gtlabels_gate.nx
nx_procgen_gtlabels_gate.nx source
↩ module page · 108 lines · 7480 B
1// nx_procgen_gtlabels_gate.nx -- Gx/PROCGEN: the digital-twin GROUND-TRUTH TRIO from REAL heightfield geometry.
2// One procedural terrain (FBM heightfield) emitted 4 ways in aligned panels: (1) shaded-relief RGB, (2) DEPTH map
3// (elevation, grayscale), (3) NORMAL map (surface normal from the height gradient, standard tangent-space RGB
4// encoding), (4) SEGMENTATION map (flat class by altitude + water). Depth + normals are GENUINE (computed from the
5// heightfield gradient, not faked) -- exactly the multi-channel per-pixel label an ML-training or digital-twin
6// pipeline consumes (Infinigen's signature output). Integer/sovereign/asset-free. Completes ground-truth-labels.
7// license_tier: ORIGINAL expect_exit: 0
8import "nx_png_write.nx"
9
10func gl_puts(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
11func gl_pn(v: i64) -> i64 { let b: *u8=sys_mmap(32) as *u8; var x: i64=v; var ng: i64=0; if x<0{ng=1;x=0-x} var i: i64=31; if x==0{b[i]=48 as u8;i=i-1} while x>0{b[i]=(48+x%10) as u8;x=x/10;i=i-1} if ng==1{b[i]=45 as u8;i=i-1} sys_write(1,(b as i64+i+1) as *u8,31-i); return 0 }
12func gl_isqrt(n: i64) -> i64 { if n<=0 { return 0 } var x: i64=n; var y: i64=(x+n/x)/2; var it: i64=0; while it<64 { if y>=x { it=64 } else { x=y; y=(x+n/x)/2; it=it+1 } } return x }
13func gl_hash(x: i64, y: i64, seed: i64) -> i64 { var a: i64=(x+1)*73856093+(y+1)*19349663+(seed+1)*83492791; a=a%16777216; if a<0{a=a+16777216} a=(a*1103515245+12345)%16777216; if a<0{a=a+16777216} return a%4096 }
14func gl_smooth(t: i64) -> i64 { let t2: i64=(t*t)/4096; return (t2*(3*4096-2*t))/4096 }
15func gl_vnoise(px: i64, py: i64, lat: i64, sz: i64, seed: i64) -> i64 {
16 let fx: i64=(px*lat*4096)/sz; let fy: i64=(py*lat*4096)/sz
17 let gx: i64=fx/4096; let tx: i64=fx-gx*4096; let gy: i64=fy/4096; let ty: i64=fy-gy*4096
18 let c00: i64=gl_hash(gx,gy,seed); let c10: i64=gl_hash(gx+1,gy,seed); let c01: i64=gl_hash(gx,gy+1,seed); let c11: i64=gl_hash(gx+1,gy+1,seed)
19 let sx: i64=gl_smooth(tx); let sy: i64=gl_smooth(ty)
20 let top: i64=c00+((c10-c00)*sx)/4096; let bot: i64=c01+((c11-c01)*sx)/4096
21 return top+((bot-top)*sy)/4096
22}
23func gl_fbm(px: i64, py: i64, sz: i64, seed: i64) -> i64 {
24 var h: i64=0; var amp: i64=2048; var lat: i64=5; var norm: i64=0; var o: i64=0
25 while o<5 { h=h+(gl_vnoise(px,py,lat,sz,seed+o*131)*amp)/4096; norm=norm+amp; amp=amp/2; lat=lat*2; o=o+1 }
26 if norm<1 { norm=1 }
27 return (h*4000)/norm
28}
29
30func main() -> i64 {
31 gl_puts("=== nx_procgen_gtlabels_gate -- ground-truth trio (relief/depth/normal/segmentation) from real geometry ===\n" as *u8)
32 var fails: i64=0
33 let TW: i64=270; let TH: i64=270; let GAP: i64=10
34 let W: i64=TW*4+GAP*3; let H: i64=TH
35 let rgb: *u8=sys_mmap(W*H*3+16)
36 var i: i64=0
37 while i<W*H { let o: i64=i*3; rgb[o]=8 as u8; rgb[o+1]=8 as u8; rgb[o+2]=10 as u8; i=i+1 }
38 let hf: *i64=sys_mmap(TW*TH*8) as *i64
39 let seed: i64=2718
40 var hmin: i64=999999; var hmax: i64=0
41 var py: i64=0
42 while py<TH { var px: i64=0; while px<TW { let hv: i64=gl_fbm(px,py,TW,seed); hf[py*TW+px]=hv; if hv<hmin{hmin=hv} if hv>hmax{hmax=hv} px=px+1 } py=py+1 }
43 let hrange: i64=hmax-hmin+1
44 // panel x-offsets
45 let x0: i64=0; let x1: i64=TW+GAP; let x2: i64=(TW+GAP)*2; let x3: i64=(TW+GAP)*3
46 var depthspread: i64=0; var normok: i64=0; var segclasses: i64=0
47 let segseen: *i64=sys_mmap(8*8) as *i64
48 var q: i64=0
49 while q<6 { segseen[q]=0; q=q+1 }
50 py=1
51 while py<TH-1 {
52 var px: i64=1
53 while px<TW-1 {
54 let ci: i64=py*TW+px; let hc: i64=hf[ci]
55 let dzdx: i64=hf[ci+1]-hf[ci-1]; let dzdy: i64=hf[ci+TW]-hf[ci-TW]
56 // ---- panel 1: shaded relief ----
57 var shade: i64=150+(0-dzdx-dzdy)/6; if shade<40{shade=40} if shade>255{shade=255}
58 var br: i64=0; var bg: i64=0; var bb: i64=0
59 if hc<700 { br=40;bg=90;bb=140 } else { if hc<1600 { br=70;bg=120;bb=60 } else { if hc<2600 { br=110;bg=95;bb=60 } else { if hc<3300 { br=140;bg=132;bb=122 } else { br=222;bg=222;bb=228 } } } }
60 let o1: i64=(py*W+x0+px)*3; rgb[o1]=((br*shade)/255) as u8; rgb[o1+1]=((bg*shade)/255) as u8; rgb[o1+2]=((bb*shade)/255) as u8
61 // ---- panel 2: depth (elevation grayscale, high=near/white) ----
62 let dv: i64=((hc-hmin)*255)/hrange
63 let o2: i64=(py*W+x1+px)*3; rgb[o2]=dv as u8; rgb[o2+1]=dv as u8; rgb[o2+2]=dv as u8
64 if dv>200 { depthspread=depthspread+1 }
65 // ---- panel 3: normal map (tangent-space RGB) ----
66 // n = (-dzdx, -dzdy, NZ) normalized ; NZ controls slope scale
67 let nxv: i64=0-dzdx; let nyv: i64=0-dzdy; let nzv: i64=60
68 let mag: i64=gl_isqrt(nxv*nxv+nyv*nyv+nzv*nzv)+1
69 let enr: i64=128+(nxv*127)/mag; let eng: i64=128+(nyv*127)/mag; let enb: i64=128+(nzv*127)/mag
70 let o3: i64=(py*W+x2+px)*3; rgb[o3]=enr as u8; rgb[o3+1]=eng as u8; rgb[o3+2]=enb as u8
71 if enb>128 { normok=normok+1 }
72 // ---- panel 4: segmentation (flat class) ----
73 var cls: i64=0; var sr: i64=0; var sg: i64=0; var sb: i64=0
74 if hc<700 { cls=0; sr=40;sg=110;sb=200 } else { if hc<1600 { cls=1; sr=70;sg=160;sb=60 } else { if hc<2600 { cls=2; sr=150;sg=110;sb=60 } else { if hc<3300 { cls=3; sr=130;sg=130;sb=130 } else { cls=4; sr=235;sg=235;sb=240 } } } }
75 segseen[cls]=1
76 let o4: i64=(py*W+x3+px)*3; rgb[o4]=sr as u8; rgb[o4+1]=sg as u8; rgb[o4+2]=sb as u8
77 px=px+1
78 }
79 py=py+1
80 }
81 q=0
82 while q<5 { if segseen[q]==1 { segclasses=segclasses+1 } q=q+1 }
83 nx_png_write_rgb("knowledge/nx_procgen_gtlabels.png\x00" as *u8, rgb, W, H)
84 gl_puts(" wrote knowledge/nx_procgen_gtlabels.png\n" as *u8)
85 gl_puts(" hrange="); gl_pn(hrange); gl_puts(" depth-bright-px="); gl_pn(depthspread); gl_puts(" normal-upfacing-px="); gl_pn(normok); gl_puts(" seg-classes="); gl_pn(segclasses); gl_puts("\n" as *u8)
86 // T1 depth varies (genuine elevation)
87 var t1: i64=0
88 if hrange>1500 { if depthspread>200 { t1=1 } }
89 if t1==1 { gl_puts("T1 PASS DEPTH channel = genuine elevation (varies with the heightfield)\n" as *u8) } else { fails=fails+1; gl_puts("T1 FAIL\n" as *u8) }
90 // T2 normals valid (from gradient, mostly up-facing)
91 var t2: i64=0
92 if normok>10000 { t2=1 }
93 if t2==1 { gl_puts("T2 PASS NORMAL channel = genuine surface normals from the height gradient (tangent-space encoded)\n" as *u8) } else { fails=fails+1; gl_puts("T2 FAIL\n" as *u8) }
94 // T3 segmentation multi-class
95 var t3: i64=0
96 if segclasses>=3 { t3=1 }
97 if t3==1 { gl_puts("T3 PASS SEGMENTATION channel = multi-class (water/land/rock/snow)\n" as *u8) } else { fails=fails+1; gl_puts("T3 FAIL\n" as *u8) }
98 // T4 png
99 let szp: *i64=sys_mmap(16) as *i64
100 let rb: *u8=sys_read_file("knowledge/nx_procgen_gtlabels.png\x00" as *u8, szp)
101 var t4: i64=0
102 if (rb as i64)!=0 { if szp[0]>1000 { t4=1 } }
103 if t4==1 { gl_puts("T4 PASS PNG ("); gl_pn(szp[0]); gl_puts(" bytes)\n" as *u8) } else { fails=fails+1; gl_puts("T4 FAIL png\n" as *u8) }
104 if fails==0 { gl_puts("PROCGEN-GTLABELS verdict=GREEN -- relief + depth + normals + segmentation from real heightfield geometry (digital-twin ground-truth, sovereign integer)\n" as *u8); sys_exit(0); return 0 }
105 gl_puts("PROCGEN-GTLABELS RED fails="); gl_pn(fails); gl_puts("\n" as *u8)
106 sys_exit(1)
107 return 1
108}