code wiki / _hdl_build / nx_persongen_render_gate.nx
nx_persongen_render_gate.nx source
↩ module page · 153 lines · 7998 B
1// nx_persongen_render_gate.nx -- ★"BASE NOW" step 1 (operator chose Hybrid): render a GENERATED person (no photo)
2// through our anisotropic Gaussian splatter with PROCEDURAL SKIN -- regional subsurface warmth (lips/nose/cheeks
3// redder, forehead lighter, under-eye shadow) + per-vertex pore noise -- so the skin is NOT flat clay. This
4// attacks the #1 photoreal cue (skin) sovereignly, no photo, no trained net. Honest: a step toward realism, not
5// yet DAZ-photoreal (finer geometry + specular/normal maps + neural detail are the remaining rungs).
6// T1 a generated person renders through the splatter (coherent face)
7// T2 ★the skin has real VARIATION (per-Gaussian colour variance >> a flat-tone baseline) = not clay
8// T3 determinism + PNG knowledge/nx_persongen_skin.png (3 views of one generated person, procedural skin)
9// license_tier: ORIGINAL expect_exit: 0
10import "nx_syscalls.nx"
11import "nx_persongen.nx"
12import "nx_meshgen.nx"
13import "nx_gsplat.nx"
14import "nx_png.nx"
15
16func hw(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
17func 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 }
18func lum(px: i64) -> i64 { return (px&255)+((px>>8)&255)+((px>>16)&255) }
19func iabs(v: i64) -> i64 { if v<0 { return 0-v } return v }
20
21// procedural skin colour at a face vertex: base tone + regional subsurface + per-vertex pore noise. Frame: y up
22// (chin -676, lips ~-330..-442, nose tip -120, eye +178, brow +322); -z toward camera (prominence).
23func skin_at(sr: i64, sg: i64, sb: i64, x: i64, y: i64, z: i64, outc: *i64) -> i64 {
24 var cr: i64 = sr; var cg: i64 = sg; var cb: i64 = sb
25 // subsurface warmth where tissue is thin/vascular
26 if y < 0-300 { if y > 0-470 { if iabs(x) < 175 { cr = cr + 26; cg = cg - 6; cb = cb - 2 } } } // lips (redder)
27 if iabs(x) < 95 { if y < 40 { if y > 0-170 { cr = cr + 12; cb = cb - 4 } } } // nose (warm)
28 if iabs(x) > 195 { if iabs(x) < 380 { if iabs(y) < 110 { cr = cr + 14; cg = cg + 2; cb = cb + 2 } } } // cheek blush
29 if y > 360 { cr = cr + 6; cg = cg + 6; cb = cb + 8 } // forehead (lighter/cooler sheen)
30 if y > 80 { if y < 165 { if iabs(x) > 175 { if iabs(x) < 330 { cr = cr - 12; cg = cg - 12; cb = cb - 8 } } } } // under-eye shadow
31 // per-vertex pore/micro noise (deterministic hash)
32 var h: i64 = x*7 + y*13 + z*17 + x*y/32 + y*z/32
33 if h < 0 { h = 0 - h }
34 let pore: i64 = (h % 19) - 9
35 cr = cr + pore; cg = cg + pore*3/4; cb = cb + pore/2
36 if cr<0{cr=0} if cr>255{cr=255}
37 if cg<0{cg=0} if cg>255{cg=255}
38 if cb<0{cb=0} if cb>255{cb=255}
39 outc[0]=cr; outc[1]=cg; outc[2]=cb
40 return 0
41}
42
43func render_person(base: i64, gauss: *i64, nv: i64, vbuf: *i64, sr: i64, sg: i64, sb: i64) -> i64 {
44 let oc: *i64 = sys_mmap(32) as *i64
45 var vi: i64 = 0
46 while vi < nv {
47 let x: i64 = vbuf[vi*3]; let y: i64 = vbuf[vi*3+1]; let z: i64 = vbuf[vi*3+2]
48 let e: i64 = 12
49 let gx: i64 = sdf_eval(base,x+e,y,z)-sdf_eval(base,x-e,y,z)
50 let gy: i64 = sdf_eval(base,x,y+e,z)-sdf_eval(base,x,y-e,z)
51 let gz: i64 = sdf_eval(base,x,y,z+e)-sdf_eval(base,x,y,z-e)
52 let gl: i64 = gs_isqrt(gx*gx+gy*gy+gz*gz)
53 var nx: i64 = 0; var ny: i64 = 256; var nz: i64 = 0
54 if gl>0 { nx=gx*256/gl; ny=gy*256/gl; nz=gz*256/gl }
55 skin_at(sr, sg, sb, x, y, z, oc)
56 gs_set_aniso(gauss, vi, x, y, z, nx, ny, nz, 34, oc[0], oc[1], oc[2], 235)
57 vi = vi + 1
58 }
59 return 0
60}
61
62func main() -> i64 {
63 hw("=== nx_persongen_render_gate -- generated person + PROCEDURAL SKIN via our splatter (base-now step 1) ===\n" as *u8)
64 var fails: i64 = 0
65 let W: i64 = gs_w()
66 let H: i64 = gs_h()
67 let npx: i64 = W*H
68 let base: i64 = sys_mmap(sdf_bytes()) as i64
69 let F: *i64 = sys_mmap((MG_N+1)*(MG_N+1)*(MG_N+1)*8) as *i64
70 let cubevi: *i64 = sys_mmap(MG_N*MG_N*MG_N*8) as *i64
71 let vbuf: *i64 = sys_mmap(MG_MAXV*3*8) as *i64
72 let fbuf: *i64 = sys_mmap(MG_MAXF*3*8) as *i64
73 let mo: *i64 = sys_mmap(16) as *i64
74 let skin: *i64 = sys_mmap(8*8) as *i64
75 let idv: *i64 = sys_mmap(8*8) as *i64
76
77 persongen_build(base, 42, skin, idv)
78 mg_build(base, F, cubevi, vbuf, fbuf, mo)
79 let nv: i64 = mo[0]
80 hw(" generated person seed=42, skin base=("); pn(skin[0]); hw(","); pn(skin[1]); hw(","); pn(skin[2]); hw(") verts="); pn(nv); hw("\n" as *u8)
81
82 let gauss: *i64 = sys_mmap(nv*12*8) as *i64
83 render_person(base, gauss, nv, vbuf, skin[0], skin[1], skin[2])
84
85 // skin colour variance across gaussians (proves non-flat skin)
86 var mr: i64 = 0
87 var vi: i64 = 0
88 while vi < nv { mr = mr + gauss[vi*12+7]; vi=vi+1 }
89 mr = mr / nv
90 var varr: i64 = 0
91 vi = 0
92 while vi < nv { let d: i64 = gauss[vi*12+7]-mr; varr = varr + d*d; vi=vi+1 }
93 varr = varr / nv
94 hw(" skin red-channel variance across face: "); pn(varr); hw(" (flat clay would be ~0)\n" as *u8)
95 var t2: i64 = 0
96 if varr > 40 { t2 = 1 }
97 if t2 == 1 { hw("T2 PASS skin has real variation (subsurface + pores) -- not flat clay\n" as *u8) }
98 else { fails=fails+1; hw("T2 FAIL skin too flat var="); pn(varr); hw("\n" as *u8) }
99
100 // scratch
101 let fb: *i64 = sys_mmap(npx*8) as *i64
102 let acc: *i64 = sys_mmap(npx*3*8) as *i64
103 let trans: *i64 = sys_mmap(npx*8) as *i64
104 let depth: *i64 = sys_mmap(nv*8) as *i64
105 let sxb: *i64 = sys_mmap(nv*8) as *i64
106 let syb: *i64 = sys_mmap(nv*8) as *i64
107 let pa: *i64 = sys_mmap(nv*8) as *i64
108 let pb: *i64 = sys_mmap(nv*8) as *i64
109 let pc: *i64 = sys_mmap(nv*8) as *i64
110 let pdet: *i64 = sys_mmap(nv*8) as *i64
111 let order: *i64 = sys_mmap(nv*8) as *i64
112 let count: *i64 = sys_mmap((gs_nb()+2)*8) as *i64
113 let explut: *i64 = sys_mmap(gs_expn()*8) as *i64
114 gs_build_explut(explut)
115
116 // 3 views -> gallery
117 let GW: i64 = W*3
118 let gal: *i64 = sys_mmap(GW*H*8) as *i64
119 let yaws: *i64 = sys_mmap(3*8) as *i64
120 yaws[0]=200-3000; yaws[1]=200; yaws[2]=200+3000
121 var head0: i64 = 0
122 var v: i64 = 0
123 while v < 3 {
124 gs_render_aniso(gauss, nv, yaws[v], 4, fb, acc, trans, depth, sxb, syb, pa, pb, pc, pdet, order, count, explut, 26, 28, 44)
125 if v == 1 { var k: i64=0; while k<npx { if lum(fb[k])>130 { head0=head0+1 } k=k+1 } }
126 var y: i64 = 0
127 while y < H { var x: i64=0; while x<W { gal[y*GW + v*W + x] = fb[y*W+x]; x=x+1 } y=y+1 }
128 v = v + 1
129 }
130 var t1: i64 = 0
131 if head0 > 8000 { t1 = 1 }
132 if t1 == 1 { hw("T1 PASS the generated person renders through the splatter (coherent face)\n" as *u8) }
133 else { fails=fails+1; hw("T1 FAIL head="); pn(head0); hw("\n" as *u8) }
134
135 write_png(gal, GW, H, "knowledge/nx_persongen_skin.png" as *u8)
136
137 // determinism
138 let fb2: *i64 = sys_mmap(npx*8) as *i64
139 gs_render_aniso(gauss, nv, 200, 4, fb2, acc, trans, depth, sxb, syb, pa, pb, pc, pdet, order, count, explut, 26, 28, 44)
140 gs_render_aniso(gauss, nv, 200, 4, fb, acc, trans, depth, sxb, syb, pa, pb, pc, pdet, order, count, explut, 26, 28, 44)
141 var diff: i64 = 0
142 var k2: i64 = 0
143 while k2 < npx { if fb[k2]!=fb2[k2] { diff=diff+1 } k2=k2+1 }
144 var t3: i64 = 0
145 if diff == 0 { t3 = 1 }
146 if t3 == 1 { hw("T3 PASS deterministic + PNG knowledge/nx_persongen_skin.png (3 views, procedural skin)\n" as *u8) }
147 else { fails=fails+1; hw("T3 FAIL diff="); pn(diff); hw("\n" as *u8) }
148
149 if fails == 0 { hw("PERSONGEN-SKIN-GATE 3/3 verdict=GREEN -- a GENERATED person (no photo) rendered with PROCEDURAL SKIN (subsurface + pores) via our splatter -- base-now step 1 toward photoreal, sovereign\n" as *u8); sys_exit(0); return 0 }
150 hw("PERSONGEN-SKIN-GATE RED fails="); pn(fails); hw("\n" as *u8)
151 sys_exit(1)
152 return 1
153}