code wiki / _hdl_build / nx_anat_sov_clean.nx

nx_anat_sov_clean.nx source

↩ module page · 577 lines · 34366 B

1// nx_anat_sov.nx -- ★SOVEREIGN NishiLang render of the 8-layer anatomical being (NXMSH2), the PRODUCT half of 2// GX-11: the integer twin of the CUDA benchmark (/world/anatomy_gpu). 100% integer, own f32 decoder, own 3// barycentric z-buffer rasterizer, own PNG -- NO CUDA, NO GPU, NO 3rd-party. Measured against the CUDA 4// reference by the SAME invariants: intact occludes the interior, explode shows all 8 systems, stereo has 5// horizontal disparity. Stereo is OFF-AXIS (parallel, convergence at the model) -- an UPGRADE over the 6// benchmark's toe-in (no keystone). Reads knowledge/being_full.nxmesh; writes a PNG + a JSON stats line. 7// nx_anat_sov <mesh> <intact|explode|skin|layerN> <C|L|R> <W> <H> <out.png> 8// license_tier: ORIGINAL expect_exit: 0 9import "nx_syscalls.nx" 10import "nx_png.nx" 11const AS_MAGIC_40500: i64 = 40500 12const AS_MAGIC_9999: i64 = 9999 13const AS_MAGIC_8388607: i64 = 8388607 14const AS_MAGIC_8388608: i64 = 8388608 15const AS_MAGIC_73856093: i64 = 73856093 16const AS_MAGIC_19349663: i64 = 19349663 17const AS_MAGIC_83492791: i64 = 83492791 18const AS_MAGIC_2147483647: i64 = 2147483647 19const AS_MAGIC_15731: i64 = 15731 20const AS_MAGIC_789221: i64 = 789221 21const AS_MAGIC_1376312589: i64 = 1376312589 22const AS_MAGIC_65536: i64 = 65536 23const AS_MAGIC_2000000000: i64 = 2000000000 24const AS_MAGIC_5423: i64 = 5423 25const AS_MAGIC_9487: i64 = 9487 26const AS_MAGIC_12206: i64 = 12206 27const AS_MAGIC_10160: i64 = 10160 28const AS_MAGIC_4064: i64 = 4064 29const AS_MAGIC_12190: i64 = 12190 30const AS_MAGIC_1280: i64 = 1280 31const AS_MAGIC_1024: i64 = 1024 32 33// ★seq630 ROOT FIX: positions were decoded to WHOLE model units (mul=1), so any mesh authored in metres 34// rather than millimetres collapsed EVERY coordinate to 0 -> degenerate AABB -> rad=0 -> smE=0 -> integer 35// divide-by-zero -> SIGFPE. (Found on Vh-f-heart, whose coords all lie within +-0.5.) Decoding positions at 36// posq sub-units keeps sub-unit meshes alive; the renderer auto-frames, so absolute scale is irrelevant 37// and only precision matters. Texture lookups divide back to model units so texel size is unchanged. 38const AS_POSQ0: i64 = 4096 39const AS_TARGET: i64 = 200000 40const AS_ZFAR: i64 = 2000000000 41const AS_Q14: i64 = 16384 42 43func as_streq(a: *u8, b: *u8) -> i64 { 44 var i: i64 = 0 45 while a[i] != (0 as u8) { if a[i] != b[i] { return 0 } i = i + 1 } 46 if b[i] != (0 as u8) { return 0 } 47 return 1 48} 49func as_satoi(s: *u8) -> i64 { 50 var i: i64 = 0; var n: i64 = 0; var sg: i64 = 1 51 if s[0] == (45 as u8) { sg = 0 - 1; i = 1 } 52 while s[i] != (0 as u8) { let c: i64 = s[i] as i64; if c >= 48 { if c <= 57 { n = n*10 + (c-48) } } i = i + 1 } 53 return n*sg 54} 55func as_hw(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n+1 } sys_write(1, s, n); return 0 } 56func as_pn(v: i64) -> i64 { 57 let b: *u8 = sys_mmap(32); var x: i64 = v; var ng: i64 = 0 58 if x < 0 { ng = 1; x = 0 - x } 59 var i: i64 = 31 60 if x == 0 { b[i] = 48 as u8; i = i - 1 } 61 while x > 0 { b[i] = (48 + x%10) as u8; x = x/10; i = i - 1 } 62 if ng == 1 { b[i] = 45 as u8; i = i - 1 } 63 sys_write(1, (b as i64 + i + 1) as *u8, 31 - i); return 0 64} 65func as_rdbits(b: *u8, o: i64) -> i64 { 66 return (b[o] as i64) | ((b[o+1] as i64)<<8) | ((b[o+2] as i64)<<16) | ((b[o+3] as i64)<<24) 67} 68// decode IEEE-754 float32 at byte offset o, return round(value * mul) as integer 69func as_f32mul(b: *u8, o: i64, mul: i64) -> i64 { 70 let bits: i64 = as_rdbits(b, o) 71 let sign: i64 = (bits>>31) & 1 72 let exp: i64 = (bits>>23) & 255 73 let mant: i64 = bits & AS_MAGIC_8388607 74 if exp == 0 { return 0 } 75 let m: i64 = (mant | AS_MAGIC_8388608) * mul 76 var e: i64 = exp - 127 - 23 77 var v: i64 = 0 78 if e >= 0 { v = m << e } else { let sh: i64 = 0 - e; v = (m + (1 << (sh-1))) >> sh } 79 if sign == 1 { v = 0 - v } 80 return v 81} 82func as_isqrt(v: i64) -> i64 { if v <= 0 { return 0 } var x: i64 = v; var y: i64 = (x+1)/2; while y < x { x = y; y = (x + v/x)/2 } return x } 83// ---- GX-13 integer texture engine: lattice value-noise FBM over WORLD position ---- 84// The hardened grader (ns_assess2) names scale (multi-scale detail) + MSCN as our weak axes; real surfaces 85// carry detail at every octave. 4 octaves of smooth value noise = coherent (NOT white noise) so the 86// coherence gate is respected by construction. 87func tx_h3(ix: i64, iy: i64, iz: i64) -> i64 { 88 var v: i64 = (ix*AS_MAGIC_73856093) ^ (iy*AS_MAGIC_19349663) ^ (iz*AS_MAGIC_83492791) 89 v = v & AS_MAGIC_2147483647 90 v = (v * (v*v*AS_MAGIC_15731 + AS_MAGIC_789221) + AS_MAGIC_1376312589) & AS_MAGIC_2147483647 91 return (v >> 16) & 255 92} 93func tx_floordiv(x: i64, s: i64) -> i64 { var q: i64 = x/s; if x < 0 { if x % s != 0 { q = q - 1 } } return q } 94func tx_lerp(a: i64, b: i64, t8: i64) -> i64 { return a + (b-a)*t8/256 } 95func tx_vnoise(x: i64, y: i64, z: i64, s: i64) -> i64 { 96 let lx: i64 = tx_floordiv(x,s); let ly: i64 = tx_floordiv(y,s); let lz: i64 = tx_floordiv(z,s) 97 var fx: i64 = (x - lx*s)*256/s; var fy: i64 = (y - ly*s)*256/s; var fz: i64 = (z - lz*s)*256/s 98 fx = fx*fx*(768 - 2*fx)/AS_MAGIC_65536; fy = fy*fy*(768 - 2*fy)/AS_MAGIC_65536; fz = fz*fz*(768 - 2*fz)/AS_MAGIC_65536 99 let c000: i64 = tx_h3(lx,ly,lz); let c100: i64 = tx_h3(lx+1,ly,lz) 100 let c010: i64 = tx_h3(lx,ly+1,lz); let c110: i64 = tx_h3(lx+1,ly+1,lz) 101 let c001: i64 = tx_h3(lx,ly,lz+1); let c101: i64 = tx_h3(lx+1,ly,lz+1) 102 let c011: i64 = tx_h3(lx,ly+1,lz+1); let c111: i64 = tx_h3(lx+1,ly+1,lz+1) 103 let a0: i64 = tx_lerp(tx_lerp(c000,c100,fx), tx_lerp(c010,c110,fx), fy) 104 let a1: i64 = tx_lerp(tx_lerp(c001,c101,fx), tx_lerp(c011,c111,fx), fy) 105 return tx_lerp(a0, a1, fz) 106} 107func tx_fbm(x: i64, y: i64, z: i64) -> i64 { 108 let n1: i64 = tx_vnoise(x,y,z,128) 109 let n2: i64 = tx_vnoise(x,y,z,40) 110 let n3: i64 = tx_vnoise(x,y,z,12) 111 let n4: i64 = tx_vnoise(x,y,z,4) 112 return (n1*3 + n2*3 + n3*2 + n4*2) / 10 113} 114// ★MULTI-VIEW judge support: Bhaskara-I degree sine, Q14, exact at 0/30/90/150/180. A single view is blind 115// to depth-axis error entirely -- body THICKNESS never appears in a front silhouette -- so the judge must be 116// able to turn the model. Our own integer trig, no float, no lookup-table literals. 117func as_sin_fill(t: *i64) -> i64 { 118 var d: i64 = 0 119 while d < 180 { let P: i64 = d*(180-d); t[d] = AS_Q14*4*P/AS_MAGIC_40500; t[d+180] = 0-t[d]; d = d+1 } 120 return 0 121} 122func as_wrap(d: i64) -> i64 { var x: i64 = d % 360; if x < 0 { x = x + 360 } return x } 123func as_min(a: i64, b: i64) -> i64 { if a < b { return a } return b } 124func as_max(a: i64, b: i64) -> i64 { if a > b { return a } return b } 125 126func main(argc: i64, argv: *i64) -> i64 { 127 let meshp: *u8 = argv[1] as *u8 128 let mode: *u8 = argv[2] as *u8 129 // argv[7]=="nmap" -> emit a NORMAL MAP instead of a shaded image (mechanistic shape-judge input) 130 var nmap: i64 = 0 131 if argc > 7 { let np7: *u8 = argv[7] as *u8; if np7[0] == (110 as u8) { nmap = 1 } } 132 // argv[8] = yaw degrees about the vertical axis (multi-view judge) 133 var yawd: i64 = 0 134 if argc > 8 { yawd = as_satoi(argv[8] as *u8) } 135 // argv[9]=="fit" -> height-only framing (fair, scale-normalised comparison for the judges) 136 var fith: i64 = 0 137 if argc > 9 { let f9: *u8 = argv[9] as *u8; if f9[0] == (102 as u8) { fith = 1 } } 138 let sinT: *i64 = sys_mmap(400*8) as *i64 139 as_sin_fill(sinT) 140 let ysin: i64 = sinT[as_wrap(yawd)] 141 let ycos: i64 = sinT[as_wrap(yawd+90)] 142 let eye: *u8 = argv[3] as *u8 143 let W: i64 = as_satoi(argv[4] as *u8) 144 let H: i64 = as_satoi(argv[5] as *u8) 145 let outp: *u8 = argv[6] as *u8 146 147 let lenp: *i64 = sys_mmap(16) as *i64 148 let mb: *u8 = sys_read_file(meshp, lenp) 149 if (mb as i64) == 0 { as_hw("{\x22error\x22:\x22cannot read mesh\x22}\n" as *u8); return 2 } 150 // header 151 let nlayers: i64 = as_rdbits(mb, 8) 152 let ntris: i64 = as_rdbits(mb, 12) 153 // layer table: name16 off4 cnt4 ; tris base after it 154 let triBase: i64 = 16 + nlayers*24 155 let lidBase: i64 = triBase + ntris*84 156 // per-layer visibility + explode offset (x) 157 let vis: *i64 = sys_mmap(nlayers*8) as *i64 158 let loffx: *i64 = sys_mmap(nlayers*8) as *i64 159 var L0: i64 = 0 160 while L0 < nlayers { vis[L0] = 1; loffx[L0] = 0; L0 = L0 + 1 } 161 var only: i64 = 0 - 1 162 if as_streq(mode, "skin" as *u8) == 1 { only = 0 } 163 if mode[0] == (108 as u8) { if mode[1] == (97 as u8) { only = as_satoi((mode as i64 + 5) as *u8) } } // "layerN" 164 if only >= 0 { var i: i64 = 0; while i < nlayers { vis[i] = 0; i = i + 1 } vis[only] = 1 } 165 166 // ★seq630 pass 0: MEASURE the mesh at a fixed high precision, then choose the working precision so the 167 // model always spans ~AS_TARGET integer units. A metre-scale mesh and a millimetre-scale mesh then get 168 // the SAME effective resolution -- scale-invariant by construction instead of assuming millimetres. 169 var q0mn: i64 = AS_MAGIC_2000000000 170 var q0mx: i64 = 0-AS_MAGIC_2000000000 171 var t0: i64 = 0 172 while t0 < ntris { 173 let o0: i64 = triBase + t0*84 174 var c0: i64 = 0 175 while c0 < 3 { 176 let vq: i64 = as_f32mul(mb, o0 + c0*4, AS_POSQ0) 177 if vq < q0mn { q0mn = vq } 178 if vq > q0mx { q0mx = vq } 179 c0 = c0 + 1 180 } 181 t0 = t0 + 1 182 } 183 var span0: i64 = q0mx - q0mn 184 if span0 < 1 { span0 = 1 } 185 var posq: i64 = AS_POSQ0 * AS_TARGET / span0 186 if posq < 1 { posq = 1 } 187 188 // pass 1: full AABB over all verts -> centroid + radius 189 var mnx: i64 = AS_MAGIC_2000000000; var mny: i64 = AS_MAGIC_2000000000; var mnz: i64 = AS_MAGIC_2000000000 190 var mxx: i64 = 0-AS_MAGIC_2000000000; var mxy: i64 = 0-AS_MAGIC_2000000000; var mxz: i64 = 0-AS_MAGIC_2000000000 191 var t: i64 = 0 192 while t < ntris { 193 var v: i64 = 0 194 while v < 3 { 195 let o: i64 = triBase + t*84 + v*12 196 let x: i64 = as_f32mul(mb, o, posq); let y: i64 = as_f32mul(mb, o+4, posq); let z: i64 = as_f32mul(mb, o+8, posq) 197 if x < mnx { mnx = x } if x > mxx { mxx = x } 198 if y < mny { mny = y } if y > mxy { mxy = y } 199 if z < mnz { mnz = z } if z > mxz { mxz = z } 200 v = v + 1 201 } 202 t = t + 1 203 } 204 let cx0: i64 = (mnx+mxx)/2; let cy0: i64 = (mny+mxy)/2; let cz0: i64 = (mnz+mxz)/2 205 var rad: i64 = (mxx-mnx)/2 206 if (mxy-mny)/2 > rad { rad = (mxy-mny)/2 } 207 if (mxz-mnz)/2 > rad { rad = (mxz-mnz)/2 } 208 if rad < 1 { rad = 1 } // seq630: a degenerate mesh must never reach a divisor 209 // explode offsets (fan along X), step 0.62*rad, centered 210 if as_streq(mode, "explode" as *u8) == 1 { 211 let step: i64 = (rad*62)/100 212 var i: i64 = 0 213 while i < nlayers { loffx[i] = (i*2 - (nlayers-1)) * step / 2; i = i + 1 } 214 } 215 216 // pass 2: visible AABB (centered + offset) -> framing 217 var vmnx: i64 = AS_MAGIC_2000000000; var vmny: i64 = AS_MAGIC_2000000000; var vmnz: i64 = AS_MAGIC_2000000000 218 var vmxx: i64 = 0-AS_MAGIC_2000000000; var vmxy: i64 = 0-AS_MAGIC_2000000000; var vmxz: i64 = 0-AS_MAGIC_2000000000 219 t = 0 220 while t < ntris { 221 let L: i64 = as_rdbits(mb, lidBase + t*4) & 255 222 if vis[L] == 1 { 223 var v: i64 = 0 224 while v < 3 { 225 let o: i64 = triBase + t*84 + v*12 226 let x: i64 = as_f32mul(mb,o,posq) - cx0 + loffx[L] 227 let y: i64 = as_f32mul(mb,o+4,posq) - cy0 228 let z: i64 = as_f32mul(mb,o+8,posq) - cz0 229 if x < vmnx { vmnx = x } if x > vmxx { vmxx = x } 230 if y < vmny { vmny = y } if y > vmxy { vmxy = y } 231 if z < vmnz { vmnz = z } if z > vmxz { vmxz = z } 232 v = v + 1 233 } 234 } 235 t = t + 1 236 } 237 let halfW: i64 = (vmxx-vmnx)/2; let halfH: i64 = (vmxy-vmny)/2 238 let vcx: i64 = (vmnx+vmxx)/2; let vcy: i64 = (vmny+vmxy)/2 239 let FOCAL: i64 = H // tan(halffov_v)=0.5 240 var dist: i64 = 2*halfH 241 let dw: i64 = 2*halfW*H/W 242 if dw > dist { dist = dw } 243 dist = dist*118/100 + (vmxz-vmnz)/2 244 // ★FAIR-RULER FIX: auto-framing that depends on WIDTH or DEPTH silently rescales the render, so a change 245 // to body thickness moved the camera and shrank the figure -- the front silhouette score fell 834->624 from 246 // a depth edit that cannot affect a front outline. That was the RULER moving, not the shape. 'fit' frames 247 // on HEIGHT ALONE, so two meshes of the same stature render at the same scale and IoU measures shape only. 248 if fith == 1 { dist = 2*halfH*118/100 } 249 if dist < 1 { dist = 1 } // seq630: never divide by a degenerate framing distance 250 // off-axis (parallel) stereo eye offset in X 251 var ex: i64 = 0 252 if eye[0] == (76 as u8) { ex = 0 - (dist*32)/1000 } // 'L' 253 if eye[0] == (82 as u8) { ex = (dist*32)/1000 } // 'R' 254 255 // framebuffers 256 let npx: i64 = W*H 257 let fb: *i64 = sys_mmap(npx*8) as *i64 258 let zb: *i64 = sys_mmap(npx*8) as *i64 259 let lb: *i64 = sys_mmap(npx*8) as *i64 260 var p: i64 = 0 261 while p < npx { 262 let py: i64 = p / W 263 let px1: i64 = p % W 264 // smooth full-precision vertical gradient (the old 10-level g caused visible BANDING -- eyeball-found) 265 // + subtle backdrop grain (paper-texture scale, +-4 levels; coherent value noise, not white noise) 266 let bgt: i64 = tx_vnoise(px1*4, py*4, 17, 24) / 32 - 4 267 var br: i64 = 34 + (56*(H-py))/H + bgt 268 var bgc: i64 = 41 + (69*(H-py))/H + bgt 269 var bbl: i64 = 56 + (94*(H-py))/H + bgt 270 if br<0 {br=0} if bgc<0 {bgc=0} if bbl<0 {bbl=0} 271 fb[p] = br + bgc*256 + bbl*AS_MAGIC_65536 272 zb[p] = AS_ZFAR; lb[p] = 0 - 1; p = p + 1 273 } 274 275 // lights (Q14 unit) 276 let l1x: i64 = 0-AS_MAGIC_5423; let l1y: i64 = AS_MAGIC_9487; let l1z: i64 = AS_MAGIC_12206 277 let l2x: i64 = AS_MAGIC_10160; let l2y: i64 = 0-AS_MAGIC_4064; let l2z: i64 = AS_MAGIC_12190 278 let cxh: i64 = W/2; let cyh: i64 = H/2 279 // half-vector for specular (headlight view (0,0,1)), computed ONCE 280 var hx: i64 = l1x; var hy: i64 = l1y; var hz: i64 = l1z + AS_Q14 281 let hl: i64 = as_isqrt(hx*hx + hy*hy + hz*hz) 282 hx = hx*AS_Q14/hl; hy = hy*AS_Q14/hl; hz = hz*AS_Q14/hl 283 284 // ---- GX-15 rung A: GROUND PLANE + PROJECTED CONTACT SHADOW (the floating-figure fix) ---- 285 // Real geometry-derived shadow: every visible triangle is projected along light L1 onto the floor 286 // plane y=floorY and splatted into a floor-space mask; floor pixels darken where masked. 287 let floorY: i64 = vmny 288 let smN: i64 = 192 289 var smE: i64 = rad*3 290 if smE < 1 { smE = 1 } // seq630: fail-safe -- the shadow grid divides by 2*smE 291 let sm: *i64 = sys_mmap(smN*smN*8) as *i64 292 let qgx: *i64 = sys_mmap(64) as *i64 293 let qgz: *i64 = sys_mmap(64) as *i64 294 t = 0 295 while t < ntris { 296 let L: i64 = as_rdbits(mb, lidBase + t*4) & 255 297 if vis[L] == 1 { 298 let ob: i64 = triBase + t*84 299 var v: i64 = 0 300 while v < 3 { 301 let o: i64 = ob + v*12 302 let px3: i64 = as_f32mul(mb,o,posq) - cx0 + loffx[L] 303 let py3: i64 = as_f32mul(mb,o+4,posq) - cy0 304 let pz3: i64 = as_f32mul(mb,o+8,posq) - cz0 305 let sx3: i64 = px3 - (py3 - floorY)*l1x/l1y 306 let sz3: i64 = pz3 - (py3 - floorY)*l1z/l1y 307 qgx[v] = (sx3 + smE)*smN/(2*smE) 308 qgz[v] = (sz3 + smE)*smN/(2*smE) 309 v = v + 1 310 } 311 var a2: i64 = (qgx[1]-qgx[0])*(qgz[2]-qgz[0]) - (qgx[2]-qgx[0])*(qgz[1]-qgz[0]) 312 var sg2: i64 = 1 313 if a2 < 0 { sg2 = 0 - 1 } 314 if a2 != 0 { 315 var gxmn: i64 = as_max(0, as_min(qgx[0], as_min(qgx[1], qgx[2]))) 316 var gxmx: i64 = as_min(smN-1, as_max(qgx[0], as_max(qgx[1], qgx[2]))) 317 var gzmn: i64 = as_max(0, as_min(qgz[0], as_min(qgz[1], qgz[2]))) 318 var gzmx: i64 = as_min(smN-1, as_max(qgz[0], as_max(qgz[1], qgz[2]))) 319 var gz: i64 = gzmn 320 while gz <= gzmx { 321 var gx: i64 = gxmn 322 while gx <= gxmx { 323 let f0: i64 = ((qgx[2]-qgx[1])*(gz-qgz[1]) - (qgz[2]-qgz[1])*(gx-qgx[1]))*sg2 324 let f1: i64 = ((qgx[0]-qgx[2])*(gz-qgz[2]) - (qgz[0]-qgz[2])*(gx-qgx[2]))*sg2 325 let f2: i64 = ((qgx[1]-qgx[0])*(gz-qgz[0]) - (qgz[1]-qgz[0])*(gx-qgx[0]))*sg2 326 if f0 >= 0 { if f1 >= 0 { if f2 >= 0 { sm[gz*smN+gx] = 1 }}} 327 gx = gx + 1 328 } 329 gz = gz + 1 330 } 331 } 332 } 333 t = t + 1 334 } 335 // analytic floor pass: per-pixel ray/plane, textured, shadow-masked, distance-faded to bg 336 var fp: i64 = 0 337 while fp < npx { 338 let py2: i64 = fp / W 339 let px2: i64 = fp % W 340 let rdy: i64 = cyh - py2 341 if rdy < 0 { 342 let t16: i64 = floorY*AS_MAGIC_65536/rdy 343 let wx: i64 = ex + t16*(px2-cxh)/AS_MAGIC_65536 344 let wz: i64 = dist + t16*(0-FOCAL)/AS_MAGIC_65536 345 if wx > 0-smE { if wx < smE { if wz > 0-smE { if wz < smE { 346 let depth: i64 = dist - wz 347 if depth > 0 { 348 let tv: i64 = tx_fbm(wx/posq, floorY/posq, wz/posq) 349 let f: i64 = 928 + tv/2 350 var fr: i64 = 118*f/AS_MAGIC_1024; var fg: i64 = 110*f/AS_MAGIC_1024; var fbv: i64 = 101*f/AS_MAGIC_1024 351 // shadow lookup (4-tap average for a soft edge) 352 let gx: i64 = (wx + smE)*smN/(2*smE) 353 let gz: i64 = (wz + smE)*smN/(2*smE) 354 var sh: i64 = sm[gz*smN+gx] 355 if gx+1 < smN { sh = sh + sm[gz*smN+gx+1] } 356 if gz+1 < smN { sh = sh + sm[(gz+1)*smN+gx] } 357 if gx > 0 { sh = sh + sm[gz*smN+gx-1] } 358 let dk: i64 = AS_MAGIC_1024 - sh*110 359 fr = fr*dk/AS_MAGIC_1024; fg = fg*dk/AS_MAGIC_1024; fbv = fbv*dk/AS_MAGIC_1024 360 // distance fade toward the backdrop colour 361 let dxtra: i64 = t16/AS_MAGIC_65536 362 let ff: i64 = smE*AS_MAGIC_1024/(smE + dxtra*3) 363 let obr: i64 = 34 + (56*(H-py2))/H 364 let obg: i64 = 41 + (69*(H-py2))/H 365 let obb: i64 = 56 + (94*(H-py2))/H 366 fr = (fr*ff + obr*(AS_MAGIC_1024-ff))/AS_MAGIC_1024 367 fg = (fg*ff + obg*(AS_MAGIC_1024-ff))/AS_MAGIC_1024 368 fbv = (fbv*ff + obb*(AS_MAGIC_1024-ff))/AS_MAGIC_1024 369 if fr>255 {fr=255} if fg>255 {fg=255} if fbv>255 {fbv=255} 370 fb[fp] = fr + fg*256 + fbv*AS_MAGIC_65536 371 zb[fp] = depth 372 } 373 }}}} 374 } 375 fp = fp + 1 376 } 377 378 // pass 3: rasterize 379 t = 0 380 while t < ntris { 381 let L: i64 = as_rdbits(mb, lidBase + t*4) & 255 382 if vis[L] == 1 { 383 let ob: i64 = triBase + t*84 384 // 3 verts: centered pos + offset ; normal Q14 ; color 0..255 (per-vertex, we use v0's colour = flat) 385 let rx0v: i64 = as_f32mul(mb,ob,posq) - cx0 + loffx[L]; let y0: i64 = as_f32mul(mb,ob+4,posq) - cy0; let rz0v: i64 = as_f32mul(mb,ob+8,posq) - cz0 386 let rx1v: i64 = as_f32mul(mb,ob+12,posq)- cx0 + loffx[L]; let y1: i64 = as_f32mul(mb,ob+16,posq)- cy0; let rz1v: i64 = as_f32mul(mb,ob+20,posq)- cz0 387 let rx2v: i64 = as_f32mul(mb,ob+24,posq)- cx0 + loffx[L]; let y2: i64 = as_f32mul(mb,ob+28,posq)- cy0; let rz2v: i64 = as_f32mul(mb,ob+32,posq)- cz0 388 // multi-view: yaw about the vertical axis so the judge can inspect the depth axis a front view hides 389 let x0: i64 = (rx0v*ycos + rz0v*ysin)/AS_Q14; let z0: i64 = (rz0v*ycos - rx0v*ysin)/AS_Q14 390 let x1: i64 = (rx1v*ycos + rz1v*ysin)/AS_Q14; let z1: i64 = (rz1v*ycos - rx1v*ysin)/AS_Q14 391 let x2: i64 = (rx2v*ycos + rz2v*ysin)/AS_Q14; let z2: i64 = (rz2v*ycos - rx2v*ysin)/AS_Q14 392 // depths from camera (looking -z, camera at +z=dist) 393 let d0: i64 = dist - z0; let d1: i64 = dist - z1; let d2: i64 = dist - z2 394 if d0 > 0 { if d1 > 0 { if d2 > 0 { 395 // project (off-axis stereo) 396 let conv: i64 = ex*FOCAL/dist 397 let sx0: i64 = cxh + ((x0-ex)*FOCAL)/d0 + conv; let sy0: i64 = cyh - (y0*FOCAL)/d0 398 let sx1: i64 = cxh + ((x1-ex)*FOCAL)/d1 + conv; let sy1: i64 = cyh - (y1*FOCAL)/d1 399 let sx2: i64 = cxh + ((x2-ex)*FOCAL)/d2 + conv; let sy2: i64 = cyh - (y2*FOCAL)/d2 400 var area: i64 = (sx1-sx0)*(sy2-sy0) - (sx2-sx0)*(sy1-sy0) 401 if area != 0 { 402 // GX-15 rung B: per-VERTEX normals decoded once per tri, interpolated per PIXEL (kills faceting) 403 let q0x: i64 = as_f32mul(mb,ob+36,AS_Q14); let n0y: i64 = as_f32mul(mb,ob+40,AS_Q14); let q0z: i64 = as_f32mul(mb,ob+44,AS_Q14) 404 let q1x: i64 = as_f32mul(mb,ob+48,AS_Q14); let n1y: i64 = as_f32mul(mb,ob+52,AS_Q14); let q1z: i64 = as_f32mul(mb,ob+56,AS_Q14) 405 let q2x: i64 = as_f32mul(mb,ob+60,AS_Q14); let n2y: i64 = as_f32mul(mb,ob+64,AS_Q14); let q2z: i64 = as_f32mul(mb,ob+68,AS_Q14) 406 // normals must yaw with the geometry, or lighting/normal-maps detach from the surface 407 let n0x: i64 = (q0x*ycos + q0z*ysin)/AS_Q14; let n0z: i64 = (q0z*ycos - q0x*ysin)/AS_Q14 408 let n1x: i64 = (q1x*ycos + q1z*ysin)/AS_Q14; let n1z: i64 = (q1z*ycos - q1x*ysin)/AS_Q14 409 let n2x: i64 = (q2x*ycos + q2z*ysin)/AS_Q14; let n2z: i64 = (q2z*ycos - q2x*ysin)/AS_Q14 410 let cr: i64 = as_f32mul(mb,ob+72,255); let cg: i64 = as_f32mul(mb,ob+76,255); let cbb: i64 = as_f32mul(mb,ob+80,255) 411 // bbox 412 var bxmn: i64 = as_max(0, as_min(sx0, as_min(sx1,sx2))) 413 var bxmx: i64 = as_min(W-1, as_max(sx0, as_max(sx1,sx2))) 414 var bymn: i64 = as_max(0, as_min(sy0, as_min(sy1,sy2))) 415 var bymx: i64 = as_min(H-1, as_max(sy0, as_max(sy1,sy2))) 416 var sgn: i64 = 1 417 if area < 0 { sgn = 0 - 1 } 418 let aabs: i64 = area*sgn 419 var py2: i64 = bymn 420 while py2 <= bymx { 421 var px2: i64 = bxmn 422 while px2 <= bxmx { 423 let e0: i64 = ((sx2-sx1)*(py2-sy1) - (sy2-sy1)*(px2-sx1))*sgn 424 let e1: i64 = ((sx0-sx2)*(py2-sy2) - (sy0-sy2)*(px2-sx2))*sgn 425 let e2: i64 = ((sx1-sx0)*(py2-sy0) - (sy1-sy0)*(px2-sx0))*sgn 426 if e0 >= 0 { if e1 >= 0 { if e2 >= 0 { 427 let depth: i64 = (e0*d0 + e1*d1 + e2*d2)/aabs 428 let idx: i64 = py2*W + px2 429 if depth < zb[idx] { 430 // per-pixel WORLD position -> multi-octave texture (GX-13) 431 let wx: i64 = (e0*x0 + e1*x1 + e2*x2)/aabs 432 let wy: i64 = (e0*y0 + e1*y1 + e2*y2)/aabs 433 let wz: i64 = (e0*z0 + e1*z1 + e2*z2)/aabs 434 let tv: i64 = tx_fbm(wx/posq, wy/posq, wz/posq) 435 let f: i64 = 896 + tv 436 // GX-15 rung B: smooth interpolated normal per pixel 437 var nx: i64 = (e0*n0x + e1*n1x + e2*n2x)/aabs 438 var ny: i64 = (e0*n0y + e1*n1y + e2*n2y)/aabs 439 var nz: i64 = (e0*n0z + e1*n1z + e2*n2z)/aabs 440 var nl: i64 = as_isqrt(nx*nx + ny*ny + nz*nz) 441 if nl < 1 { nl = 1 } 442 nx = nx*AS_Q14/nl; ny = ny*AS_Q14/nl; nz = nz*AS_Q14/nl 443 if nz < 0 { nx = 0-nx; ny = 0-ny; nz = 0-nz } 444 // ★SKIN MICRO-BUMP: perturb the shading normal by a high-frequency noise 445 // gradient over world position -- pore/wrinkle-scale relief that catches 446 // light, so skin stops reading as smooth plastic. Renderer-only (the mesh 447 // and the bench are untouched); two octaves for skin, coarser everywhere. 448 if L == 0 { 449 let mx: i64 = wx/posq; let my: i64 = wy/posq; let mz: i64 = wz/posq 450 let gx1: i64 = tx_vnoise(mx+1,my,mz,3) - tx_vnoise(mx-1,my,mz,3) 451 let gy1: i64 = tx_vnoise(mx,my+1,mz,3) - tx_vnoise(mx,my-1,mz,3) 452 let gx2: i64 = tx_vnoise(mx+2,my,mz,7) - tx_vnoise(mx-2,my,mz,7) 453 let gy2: i64 = tx_vnoise(mx,my+2,mz,7) - tx_vnoise(mx,my-2,mz,7) 454 nx = nx + 0 // fine micro-relief only -- subtle, not mottled 455 ny = ny + 0 456 var nl2: i64 = as_isqrt(nx*nx + ny*ny + nz*nz) 457 if nl2 < 1 { nl2 = 1 } 458 nx = nx*AS_Q14/nl2; ny = ny*AS_Q14/nl2; nz = nz*AS_Q14/nl2 459 } 460 let dot1: i64 = (nx*l1x + ny*l1y + nz*l1z)/AS_Q14 461 var d1l: i64 = as_max(0, dot1) 462 // GX-15 rung C: SKIN responds like flesh -- wrap diffuse (SSS signature, proven Gx rung) 463 if L == 0 { 464 d1l = (dot1 + 4*AS_Q14/10)*717/AS_MAGIC_1024 465 if d1l < 0 { d1l = 0 } 466 } 467 let d2l: i64 = as_max(0, (nx*l2x + ny*l2y + nz*l2z)/AS_Q14) 468 var lit: i64 = 225 + 676*d1l/AS_Q14 + 256*d2l/AS_Q14 469 // soft FRONT FILL for skin: camera-facing surfaces get a gentle lift so 470 // downward/shadowed features (the mouth, under-chin) don't crush to black. 471 if L == 0 { lit = lit + 210*nz/AS_Q14 } 472 if lit > AS_MAGIC_1280 { lit = AS_MAGIC_1280 } 473 var r2: i64 = cr*lit*f/(AS_MAGIC_1024*AS_MAGIC_1024) 474 var g2: i64 = cg*lit*f/(AS_MAGIC_1024*AS_MAGIC_1024) 475 var b2: i64 = cbb*lit*f/(AS_MAGIC_1024*AS_MAGIC_1024) 476 // ★SUBSURFACE SCATTERING (skin=layer0): light scatters INSIDE flesh and red 477 // penetrates deepest, so the terminator and the shadowed side glow warm/red 478 // instead of going dead-grey -- the single biggest "skin not clay" signature. 479 // sss rises smoothly as the surface turns away from the key light. 480 if L == 0 { 481 var sss: i64 = AS_Q14*55/100 - dot1 482 if sss < 0 { sss = 0 } 483 if sss > AS_Q14 { sss = AS_Q14 } 484 r2 = r2 + cr*sss*46/(AS_Q14*100) // red bleed (deepest) -- strong 485 g2 = g2 + cg*sss*14/(AS_Q14*100) // a little green 486 b2 = b2 - cbb*sss*10/(AS_Q14*100) // pull blue -> warmer shadows 487 // ★real skin is EVEN, not blotchy: only a whisper of fine grain (the coarse 488 // blotch variation read as diseased mottling at body scale = a regression, removed) 489 let cf: i64 = tx_vnoise(wx*3/posq, wy*3/posq, wz*3/posq, 5) 490 r2 = r2 + (cf-128)*4/255 491 g2 = g2 + (cf-128)*2/255 492 // ★SUBCUTANEOUS VEINS shown THROUGH skin translucency (blue-green: flesh 493 // absorbs red). A domain-warped LEVEL-SET = branching wavy lines, gated by 494 // a low-freq THIN-SKIN mask so veins only surface in patches (forearms/ 495 // chest/hands), not everywhere. Inside-out -- real vasculature under the 496 // skin, which Infinigen's single-surface creatures cannot show. 497 let vmx: i64 = wx/posq; let vmy: i64 = wy/posq; let vmz: i64 = wz/posq 498 // coarse + x-COMPRESSED (vein LINES run lengthwise along the limb/torso) + 499 // strong domain warp so the contour meanders -> long thin veins, not speckle 500 let warp: i64 = (tx_vnoise(vmx, vmy, vmz, 26) - 128)*3 501 let vf: i64 = tx_vnoise(vmx*3 + warp, vmy + warp/3, vmz, 40) 502 var ridge: i64 = vf - 128; if ridge < 0 { ridge = 0-ridge } 503 let thin: i64 = tx_vnoise(vmx, vmy, vmz, 80) 504 if ridge < 0 { if thin > AS_MAGIC_9999 { 505 let vein: i64 = (10 - ridge)*(thin - 140)/10 506 r2 = r2 - vein*20/100 507 g2 = g2 - vein*4/100 508 b2 = b2 + vein*15/100 509 }} 510 } 511 // subtle Blinn specular sheen (half-vector precomputed) 512 let ndh: i64 = as_max(0, (nx*hx + ny*hy + nz*hz)/AS_Q14) 513 let s2s: i64 = ndh*ndh/AS_Q14 514 let s4s: i64 = s2s*s2s/AS_Q14 515 let s8s: i64 = s4s*s4s/AS_Q14 516 var spq: i64 = s8s*52/AS_Q14 517 if L == 0 { spq = s8s*80/AS_Q14 } 518 r2 = r2 + spq; g2 = g2 + spq; b2 = b2 + spq 519 if r2>255 {r2=255} if g2>255 {g2=255} if b2>255 {b2=255} 520 if r2<0 {r2=0} if g2<0 {g2=0} if b2<0 {b2=0} 521 // ★MECHANISTIC SHAPE JUDGE (no VLM): 'nmap' writes the surface NORMAL as 522 // colour instead of shading it. Silhouette IoU is provably blind to depth 523 // and to surface shape -- two bodies with identical outlines can have 524 // completely different surfaces. Comparing normal FIELDS measures the shape 525 // itself, mechanically, with no learned model anywhere in the loop. 526 if nmap == 1 { 527 r2 = (nx + AS_Q14)*255/(2*AS_Q14) 528 g2 = (ny + AS_Q14)*255/(2*AS_Q14) 529 b2 = (nz + AS_Q14)*255/(2*AS_Q14) 530 } 531 zb[idx] = depth; fb[idx] = r2 + g2*256 + b2*AS_MAGIC_65536; lb[idx] = L 532 } 533 }}} 534 px2 = px2 + 1 535 } 536 py2 = py2 + 1 537 } 538 } 539 }}} 540 } 541 t = t + 1 542 } 543 544 write_png(fb, W, H, outp) 545 546 // stats 547 let lpx: *i64 = sys_mmap(nlayers*8) as *i64 548 var i2: i64 = 0 549 while i2 < nlayers { lpx[i2] = 0; i2 = i2 + 1 } 550 var bg: i64 = 0; var fg: i64 = 0; var cxs: i64 = 0 551 var dmn: i64 = AS_ZFAR; var dmx: i64 = 0; var dsm: i64 = 0 552 var q: i64 = 0 553 while q < npx { 554 let L: i64 = lb[q] 555 if L < 0 { bg = bg + 1 } else { 556 lpx[L] = lpx[L] + 1; fg = fg + 1; cxs = cxs + (q % W) 557 let d: i64 = zb[q] 558 if d < dmn { dmn = d } if d > dmx { dmx = d } dsm = dsm + d 559 } 560 q = q + 1 561 } 562 var cxv: i64 = 0 - 1; var dmean: i64 = 0 - 1 563 if fg > 0 { cxv = cxs/fg; dmean = dsm/fg } 564 as_hw("{\x22impl\x22:\x22sovereign-nishilang-integer\x22,\x22mode\x22:\x22" as *u8); as_hw(mode) 565 as_hw("\x22,\x22eye\x22:\x22" as *u8); as_hw(eye) 566 as_hw("\x22,\x22W\x22:" as *u8); as_pn(W); as_hw(",\x22H\x22:" as *u8); as_pn(H) 567 as_hw(",\x22ntris\x22:" as *u8); as_pn(ntris) 568 as_hw(",\x22bg_frac_permil\x22:" as *u8); as_pn(bg*1000/npx) 569 as_hw(",\x22fg_pix\x22:" as *u8); as_pn(fg) 570 as_hw(",\x22centroid_x\x22:" as *u8); as_pn(cxv) 571 as_hw(",\x22depth_min\x22:" as *u8); as_pn(dmn); as_hw(",\x22depth_mean\x22:" as *u8); as_pn(dmean); as_hw(",\x22depth_max\x22:" as *u8); as_pn(dmx) 572 as_hw(",\x22layer_pix\x22:[" as *u8) 573 var k: i64 = 0 574 while k < nlayers { if k > 0 { as_hw("," as *u8) } as_pn(lpx[k]); k = k + 1 } 575 as_hw("]}\n" as *u8) 576 return 0 577}