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}