code wiki / _hdl_build / nx_gsplat_aniso_gate.nx
nx_gsplat_aniso_gate.nx source
↩ module page · 120 lines · 6784 B
1// nx_gsplat_aniso_gate.nx -- ★ANISOTROPIC surface splatting (the defining 3DGS feature). Oriented ellipse splats
2// (surfels aligned to the surface normal) instead of isotropic blobs -> smooth coverage, no dotty grid.
3// T1 ★ANISOTROPY: an EDGE-ON surfel (normal in the screen plane) renders a THIN, elongated ellipse; a FACE-ON
4// surfel (normal toward camera) renders a round splat -- the aspect ratios differ sharply (orientation is real)
5// T2 the anatomical mesh, splatted as surface-aligned surfels, covers the face densely (no isotropic-grid holes)
6// + eyeball PNG knowledge/nx_gsplat_face_aniso.png
7// T3 determinism
8// license_tier: ORIGINAL expect_exit: 0
9import "nx_syscalls.nx"
10import "nx_faceanat.nx"
11import "nx_meshgen.nx"
12import "nx_gsplat.nx"
13import "nx_png.nx"
14
15func hw(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
16func 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 }
17func lum(px: i64) -> i64 { return (px & 255) + ((px >> 8) & 255) + ((px >> 16) & 255) }
18
19func main() -> i64 {
20 hw("=== nx_gsplat_aniso_gate -- anisotropic surface splatting (oriented ellipse surfels) ===\n" as *u8)
21 var fails: i64 = 0
22 let W: i64 = gs_w()
23 let H: i64 = gs_h()
24 let npx: i64 = W*H
25 let NGX: i64 = 6000
26 let gauss: *i64 = sys_mmap(NGX*12*8) as *i64
27 let fb: *i64 = sys_mmap(npx*8) as *i64
28 let acc: *i64 = sys_mmap(npx*3*8) as *i64
29 let trans: *i64 = sys_mmap(npx*8) as *i64
30 let depth: *i64 = sys_mmap(NGX*8) as *i64
31 let sxb: *i64 = sys_mmap(NGX*8) as *i64
32 let syb: *i64 = sys_mmap(NGX*8) as *i64
33 let pa: *i64 = sys_mmap(NGX*8) as *i64
34 let pb: *i64 = sys_mmap(NGX*8) as *i64
35 let pc: *i64 = sys_mmap(NGX*8) as *i64
36 let pdet: *i64 = sys_mmap(NGX*8) as *i64
37 let order: *i64 = sys_mmap(NGX*8) as *i64
38 let count: *i64 = sys_mmap((gs_nb()+2)*8) as *i64
39 let explut: *i64 = sys_mmap(gs_expn()*8) as *i64
40 gs_build_explut(explut)
41
42 // measure the non-bg bounding box of the splat
43 // T1a EDGE-ON: normal = +x (in the screen plane) -> tangent plane holds z(depth)+y -> thin vertical ellipse
44 gs_set_aniso(gauss, 0, 0, 0, 0, 256, 0, 0, 140, 240, 240, 240, 256)
45 gs_render_aniso(gauss, 1, 0, 4, fb, acc, trans, depth, sxb, syb, pa, pb, pc, pdet, order, count, explut, 26, 28, 44)
46 var exminx: i64 = W; var exmaxx: i64 = 0; var exminy: i64 = H; var exmaxy: i64 = 0
47 var pi: i64 = 0
48 while pi < npx { if lum(fb[pi]) > 200 { let px: i64=pi%W; let py: i64=pi/W; if px<exminx{exminx=px} if px>exmaxx{exmaxx=px} if py<exminy{exminy=py} if py>exmaxy{exmaxy=py} } pi=pi+1 }
49 let ew: i64 = exmaxx - exminx
50 let eh: i64 = exmaxy - exminy
51 // T1b FACE-ON: normal = -z (toward camera at yaw0) -> tangent plane = x-y -> round splat
52 gs_set_aniso(gauss, 0, 0, 0, 0, 0, 0, 0-256, 140, 240, 240, 240, 256)
53 gs_render_aniso(gauss, 1, 0, 4, fb, acc, trans, depth, sxb, syb, pa, pb, pc, pdet, order, count, explut, 26, 28, 44)
54 var fminx: i64 = W; var fmaxx: i64 = 0; var fminy: i64 = H; var fmaxy: i64 = 0
55 pi = 0
56 while pi < npx { if lum(fb[pi]) > 200 { let px: i64=pi%W; let py: i64=pi/W; if px<fminx{fminx=px} if px>fmaxx{fmaxx=px} if py<fminy{fminy=py} if py>fmaxy{fmaxy=py} } pi=pi+1 }
57 let fw: i64 = fmaxx - fminx
58 let fh: i64 = fmaxy - fminy
59 hw(" edge-on splat wxh="); pn(ew); hw("x"); pn(eh); hw(" face-on wxh="); pn(fw); hw("x"); pn(fh); hw("\n" as *u8)
60 var t1: i64 = 0
61 // edge-on: strongly elongated (height >> width); face-on: roughly round (w ~ h)
62 if eh > ew * 2 { if fw*10 > fh*7 { if fh*10 > fw*7 { t1 = 1 } } }
63 if t1 == 1 { hw("T1 PASS anisotropy: edge-on surfel = thin ellipse, face-on = round -> orientation is real\n" as *u8) }
64 else { fails=fails+1; hw("T1 FAIL aspect ratios\n" as *u8) }
65
66 // T2 the anatomical mesh as surface-aligned surfels
67 let base: i64 = sys_mmap(sdf_bytes()) as i64
68 let Fg: *i64 = sys_mmap((MG_N+1)*(MG_N+1)*(MG_N+1)*8) as *i64
69 let cubevi: *i64 = sys_mmap(MG_N*MG_N*MG_N*8) as *i64
70 let vbuf: *i64 = sys_mmap(MG_MAXV*3*8) as *i64
71 let fbuf: *i64 = sys_mmap(MG_MAXF*3*8) as *i64
72 let mo: *i64 = sys_mmap(16) as *i64
73 faceanat_build(base)
74 mg_build(base, Fg, cubevi, vbuf, fbuf, mo)
75 let nv: i64 = mo[0]
76 var vi: i64 = 0
77 while vi < nv {
78 let x: i64 = vbuf[vi*3]
79 let y: i64 = vbuf[vi*3+1]
80 let z: i64 = vbuf[vi*3+2]
81 let e: i64 = 12
82 var gx: i64 = sdf_eval(base, x+e, y, z) - sdf_eval(base, x-e, y, z)
83 var gy: i64 = sdf_eval(base, x, y+e, z) - sdf_eval(base, x, y-e, z)
84 var gz: i64 = sdf_eval(base, x, y, z+e) - sdf_eval(base, x, y, z-e)
85 let gl: i64 = gs_isqrt(gx*gx + gy*gy + gz*gz)
86 var nx: i64 = 0; var ny: i64 = 256; var nz: i64 = 0
87 if gl > 0 { nx = gx*256/gl; ny = gy*256/gl; nz = gz*256/gl }
88 var sh: i64 = 130 + (nx*(0-121) + ny*191 + nz*(0-121))/256 * 90 / 256
89 if sh < 70 { sh = 70 }
90 if sh > 255 { sh = 255 }
91 gs_set_aniso(gauss, vi, x, y, z, nx, ny, nz, 34, sh*236/255, sh*180/255, sh*156/255, 235)
92 vi = vi + 1
93 }
94 gs_render_aniso(gauss, nv, 200, 4, fb, acc, trans, depth, sxb, syb, pa, pb, pc, pdet, order, count, explut, 26, 28, 44)
95 var face: i64 = 0
96 pi = 0
97 while pi < npx { if lum(fb[pi]) > 130 { face = face + 1 } pi = pi + 1 }
98 hw(" aniso face: "); pn(nv); hw(" surfels -> "); pn(face); hw(" covered px\n" as *u8)
99 write_png(fb, W, H, "knowledge/nx_gsplat_face_aniso.png" as *u8)
100 var t2: i64 = 0
101 if face > 12000 { t2 = 1 }
102 if t2 == 1 { hw("T2 PASS surface-aligned surfels densely cover the face (PNG knowledge/nx_gsplat_face_aniso.png)\n" as *u8) }
103 else { fails=fails+1; hw("T2 FAIL coverage="); pn(face); hw("\n" as *u8) }
104
105 // T3 determinism
106 let fb2: *i64 = sys_mmap(npx*8) as *i64
107 gs_render_aniso(gauss, nv, 200, 4, fb2, acc, trans, depth, sxb, syb, pa, pb, pc, pdet, order, count, explut, 26, 28, 44)
108 var diff: i64 = 0
109 pi = 0
110 while pi < npx { if fb[pi] != fb2[pi] { diff = diff + 1 } pi = pi + 1 }
111 var t3: i64 = 0
112 if diff == 0 { t3 = 1 }
113 if t3 == 1 { hw("T3 PASS deterministic\n" as *u8) }
114 else { fails=fails+1; hw("T3 FAIL diff="); pn(diff); hw("\n" as *u8) }
115
116 if fails == 0 { hw("GSPLAT-ANISO-GATE 3/3 GREEN -- anisotropic surface splatting: oriented ellipse surfels, dense surface coverage, integer + deterministic (the defining 3DGS feature, sovereign)\n" as *u8); sys_exit(0); return 0 }
117 hw("GSPLAT-ANISO-GATE RED fails="); pn(fails); hw("\n" as *u8)
118 sys_exit(1)
119 return 1
120}