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}