code wiki / (root) / nx_nxa_texbake_gate.nx

nx_nxa_texbake_gate.nx source

↩ module page · 369 lines · 16035 B

1// nx_nxa_texbake_gate.nx -- GATE for texture-ladder rungs 2b+3+4 (debt 1786546859). Fixture ASSEMBLED AT 2// RUNTIME with joints at CONTROLLED anatomy (permil/laterality) so region classification is asserted EXACTLY. 3// Anti-vacuity: determinism vs seed-grain, palette discrimination across regions, EVENNESS (anti-blotch), 4// and seed-A-vs-seed-B textured renders must DIFFER (proves per-fragment sampling is load-bearing end-to-end). 5// Neg-control: bake without TEXC refuses named. Real asset behind gv_need writes the published artifacts. 6// license_tier: ORIGINAL expect_exit: 0 7import "nx_syscalls.nx" 8import "nx_nxa.nx" 9import "nx_nxa_texc_lib.nx" 10import "nx_nxa_texbake_lib.nx" 11import "nx_gate_verdict.nx" 12 13const GB_NV: i64 = 6 14const GB_NJ: i64 = 5 15const GB_RES: i64 = 128 16 17func gb_wfile(path: *u8, b: *u8, n: i64) -> i64 { 18 let fd: i64 = sys_openat_wr(path, 0x1a4) 19 if fd < 0 { return 0 } 20 sys_write(fd, b, n) 21 sys_close(fd) 22 return 1 23} 24// fixture: 6 verts spanning z 0..10000, 5 joints at controlled anatomy: 25// j0 root@0 (legs->LIMBS) j1 pelvis@580 mid (GENS) j2 chest@700 mid (TORSO) j3 head@950 (FACE) j4 hand@700 lateral (LIMBS) 26func gb_mkfix(path: *u8) -> i64 { 27 let vwl: i64 = 1 + GB_NV*3 28 let twl: i64 = 1 + 4*3 29 let swl: i64 = 1 + GB_NJ*8 30 let kwl: i64 = 1 + GB_NV*8 31 let ns: i64 = 4 32 let toclen: i64 = 32 + ns*32 33 let total: i64 = toclen + vwl*8 + twl*8 + swl*8 + kwl*8 34 let nb: *u8 = sys_mmap(total + 4096) 35 nt_wr64(nb, 0, nxa_magic()) 36 nt_wr64(nb, 8, 1) 37 nt_wr64(nb, 16, ns) 38 let vp: *i64 = sys_mmap(vwl*8 + 64) as *i64 39 vp[0] = GB_NV 40 vp[1] = 0; vp[2] = 0; vp[3] = 0 41 vp[4] = 0; vp[5] = 0; vp[6] = 10000 42 vp[7] = 0; vp[8] = 0-50; vp[9] = 5800 43 vp[10] = 0; vp[11] = 0-50; vp[12] = 7000 44 vp[13] = 2000; vp[14] = 0; vp[15] = 7000 45 vp[16] = 100; vp[17] = 50; vp[18] = 7000 46 let sp: *i64 = sys_mmap(swl*8 + 64) as *i64 47 sp[0] = GB_NJ 48 sp[1] = 0-1; sp[2] = 0; sp[3] = 0; sp[4] = 0; sp[5] = 0; sp[6] = 0; sp[7] = 0; sp[8] = 4096 49 sp[9] = 0; sp[10] = 0; sp[11] = 0; sp[12] = 5800; sp[13] = 0; sp[14] = 0; sp[15] = 0; sp[16] = 4096 50 sp[17] = 1; sp[18] = 0; sp[19] = 0; sp[20] = 7000; sp[21] = 0; sp[22] = 0; sp[23] = 0; sp[24] = 4096 51 sp[25] = 2; sp[26] = 0; sp[27] = 0; sp[28] = 9500; sp[29] = 0; sp[30] = 0; sp[31] = 0; sp[32] = 4096 52 sp[33] = 2; sp[34] = 2000; sp[35] = 0; sp[36] = 7000; sp[37] = 0; sp[38] = 0; sp[39] = 0; sp[40] = 4096 53 let tp: *i64 = sys_mmap(twl*8 + 64) as *i64 54 tp[0] = 4 55 tp[1] = 0; tp[2] = 2; tp[3] = 3 56 tp[4] = 2; tp[5] = 3; tp[6] = 4 57 tp[7] = 3; tp[8] = 4; tp[9] = 5 58 tp[10] = 1; tp[11] = 3; tp[12] = 5 59 let kp: *i64 = sys_mmap(kwl*8 + 64) as *i64 60 kp[0] = GB_NV 61 let own: *i64 = sys_mmap(8*8) as *i64 62 own[0] = 0 63 own[1] = 3 64 own[2] = 1 65 own[3] = 2 66 own[4] = 4 67 own[5] = 2 68 var r: i64 = 0 69 while r < GB_NV { 70 kp[1 + r*8] = own[r] 71 kp[1 + r*8 + 1] = 0 72 kp[1 + r*8 + 2] = 0 73 kp[1 + r*8 + 3] = 0 74 kp[1 + r*8 + 4] = 4096 75 kp[1 + r*8 + 5] = 0 76 kp[1 + r*8 + 6] = 0 77 kp[1 + r*8 + 7] = 0 78 r = r + 1 79 } 80 var wo: i64 = toclen 81 var ti: i64 = 0 82 nt_wr64(nb, 32 + ti*32, nxa_tag4("VERT" as *u8)) 83 nt_wr64(nb, 32 + ti*32 + 8, wo) 84 nt_wr64(nb, 32 + ti*32 + 16, vwl) 85 var k: i64 = 0 86 while k < vwl { nt_wr64(nb, wo + k*8, vp[k]); k = k + 1 } 87 nt_wr64(nb, 32 + ti*32 + 24, nxa_check2(1, ((nb as i64) + wo) as *i64, vwl)) 88 wo = wo + vwl*8 89 ti = ti + 1 90 nt_wr64(nb, 32 + ti*32, nxa_tag4("TRIS" as *u8)) 91 nt_wr64(nb, 32 + ti*32 + 8, wo) 92 nt_wr64(nb, 32 + ti*32 + 16, twl) 93 k = 0 94 while k < twl { nt_wr64(nb, wo + k*8, tp[k]); k = k + 1 } 95 nt_wr64(nb, 32 + ti*32 + 24, nxa_check2(1, ((nb as i64) + wo) as *i64, twl)) 96 wo = wo + twl*8 97 ti = ti + 1 98 nt_wr64(nb, 32 + ti*32, nxa_tag4("SKEL" as *u8)) 99 nt_wr64(nb, 32 + ti*32 + 8, wo) 100 nt_wr64(nb, 32 + ti*32 + 16, swl) 101 k = 0 102 while k < swl { nt_wr64(nb, wo + k*8, sp[k]); k = k + 1 } 103 nt_wr64(nb, 32 + ti*32 + 24, nxa_check2(1, ((nb as i64) + wo) as *i64, swl)) 104 wo = wo + swl*8 105 ti = ti + 1 106 nt_wr64(nb, 32 + ti*32, nxa_tag4("SKIN" as *u8)) 107 nt_wr64(nb, 32 + ti*32 + 8, wo) 108 nt_wr64(nb, 32 + ti*32 + 16, kwl) 109 k = 0 110 while k < kwl { nt_wr64(nb, wo + k*8, kp[k]); k = k + 1 } 111 nt_wr64(nb, 32 + ti*32 + 24, nxa_check2(1, ((nb as i64) + wo) as *i64, kwl)) 112 wo = wo + kwl*8 113 nt_wr64(nb, 24, nxa_check2(1, ((nb as i64) + 32) as *i64, ns*4)) 114 return gb_wfile(path, nb, wo) 115} 116func gb_flen(path: *u8, bout: *i64) -> i64 { 117 let lp: *i64 = sys_mmap(16) as *i64 118 let b: *u8 = sys_read_file(path, lp) 119 bout[0] = b as i64 120 return lp[0] 121} 122func gb_bytes_eq(a: *u8, b: *u8, n: i64) -> i64 { 123 var i: i64 = 0 124 var r: i64 = 1 125 while i < n { if a[i] != b[i] { r = 0; i = n } else { i = i + 1 } } 126 return r 127} 128 129func main() -> i64 { 130 let ctr: *i64 = gv_ctr() 131 gv_head("nx_nxa_texbake_gate -- texture ladder 2b+3+4: regions, albedo atlas, per-fragment textured render (debt 1786546859)" as *u8) 132 133 let pf: *u8 = "/tmp/ntb_fix.nxa" as *u8 134 let pt: *u8 = "/tmp/ntb_fixt.nxa" as *u8 135 gb_mkfix(pf) 136 gv_check("T1 pipeline precondition: nx_nxa_texc writes TEXC onto the fixture" as *u8, ntx_apply(pf, pt) == 0, ctr) 137 138 let bo: *i64 = sys_mmap(16) as *i64 139 let flen: i64 = gb_flen(pt, bo) 140 let fb2: *u8 = bo[0] as *u8 141 // T2 region classification EXACT on controlled anatomy 142 let regs: *i64 = sys_mmap(64*8) as *i64 143 let perms: *i64 = sys_mmap(64*8) as *i64 144 let nj: i64 = ntb_regions(fb2, flen, regs, perms) 145 gv_puts(" regions: j0=" as *u8); gv_num(regs[0]) 146 gv_puts(" j1=" as *u8); gv_num(regs[1]) 147 gv_puts(" j2=" as *u8); gv_num(regs[2]) 148 gv_puts(" j3=" as *u8); gv_num(regs[3]) 149 gv_puts(" j4=" as *u8); gv_num(regs[4]) 150 gv_puts("\n" as *u8) 151 var t2: i64 = 0 152 if nj == GB_NJ { if regs[0] == 2 { if regs[1] == 3 { if regs[2] == 1 { if regs[3] == 0 { if regs[4] == 2 { t2 = 1 } } } } } } 153 gv_check("T2 joint regions EXACT: root->limbs pelvis->gens chest->torso head->face lateral->limbs" as *u8, t2, ctr) 154 155 // T3-T5 bake: clean, deterministic, seed-grain live 156 let a7: *u8 = sys_mmap(GB_RES*GB_RES*3 + 64) 157 let a7b: *u8 = sys_mmap(GB_RES*GB_RES*3 + 64) 158 let a8: *u8 = sys_mmap(GB_RES*GB_RES*3 + 64) 159 let rc3: i64 = ntb_bake(fb2, flen, GB_RES, 7, a7) 160 gv_check("T3 bake runs clean on the fixture" as *u8, rc3 == 0, ctr) 161 ntb_bake(fb2, flen, GB_RES, 7, a7b) 162 gv_check("T4 bake is DETERMINISTIC: same seed -> byte-identical atlas" as *u8, gb_bytes_eq(a7, a7b, GB_RES*GB_RES*3), ctr) 163 ntb_bake(fb2, flen, GB_RES, 8, a8) 164 gv_check("T5 seed grain is LIVE: different seed -> different atlas" as *u8, 1 - gb_bytes_eq(a7, a8, GB_RES*GB_RES*3), ctr) 165 166 // T6 palette discrimination: face tile (j3) vs limbs tile (j4); grid(5)=3, tile=42px, centers 167 let tw: i64 = GB_RES/3 168 let fx: i64 = tw/2 169 let fy: i64 = tw + tw/2 170 let lx2: i64 = tw + tw/2 171 let ly2: i64 = tw + tw/2 172 let fr: i64 = a7[(fy*GB_RES + fx)*3] as i64 173 let lr: i64 = a7[(ly2*GB_RES + lx2)*3] as i64 174 var dd: i64 = fr - lr 175 if dd < 0 { dd = 0 - dd } 176 gv_puts(" face_r=" as *u8); gv_num(fr) 177 gv_puts(" limb_r=" as *u8); gv_num(lr) 178 gv_puts("\n" as *u8) 179 gv_check("T6 regions DISCRIMINATE: face and limb tiles differ in albedo" as *u8, dd >= 6, ctr) 180 181 // T7 EVENNESS (anti-blotch): 25 samples inside the chest tile (j2 -> tile x2 y0), spread max<=8 182 var rmin: i64 = 255 183 var rmax: i64 = 0 184 var sy: i64 = 0 185 while sy < 5 { 186 var sx: i64 = 0 187 while sx < 5 { 188 let px: i64 = 2*tw + 4 + sx*7 189 let py: i64 = 4 + sy*7 190 let rv: i64 = a7[(py*GB_RES + px)*3] as i64 191 if rv < rmin { rmin = rv } 192 if rv > rmax { rmax = rv } 193 sx = sx + 1 194 } 195 sy = sy + 1 196 } 197 gv_puts(" chest tile r spread=" as *u8); gv_num(rmax - rmin); gv_puts("\n" as *u8) 198 gv_check("T7 skin is EVEN: within-tile spread <= 8 (whisper grain, no blotch)" as *u8, rmax - rmin <= 8, ctr) 199 200 // T8 neg-control: baking the PRE-TEXC fixture refuses with the named missing-section code 201 let bo2: *i64 = sys_mmap(16) as *i64 202 let flen0: i64 = gb_flen(pf, bo2) 203 let rc8: i64 = ntb_bake(bo2[0] as *u8, flen0, GB_RES, 7, a8) 204 if rc8 != 0-4 { gv_puts(" detail: rc=" as *u8); gv_num(rc8); gv_puts("\n" as *u8) } 205 gv_check("T8 neg-control-no-texc: bake refuses named (run nx_nxa_texc first)" as *u8, rc8 == 0-4, ctr) 206 207 // T9 sampling is LOAD-BEARING end-to-end: seed-7 and seed-8 textured renders differ 208 let pv7: *u8 = "/tmp/ntb_v7.png" as *u8 209 let pv8: *u8 = "/tmp/ntb_v8.png" as *u8 210 let rv7: i64 = ntb_view(fb2, flen, 64, 7, pv7) 211 let rv8: i64 = ntb_view(fb2, flen, 64, 8, pv8) 212 var t9: i64 = 0 213 if rv7 == 0 { if rv8 == 0 { 214 let l7p: *i64 = sys_mmap(16) as *i64 215 let l8p: *i64 = sys_mmap(16) as *i64 216 let b7: *u8 = sys_read_file(pv7, l7p) 217 let b8: *u8 = sys_read_file(pv8, l8p) 218 if l7p[0] > 0 { if l8p[0] > 0 { 219 t9 = 1 220 if l7p[0] == l8p[0] { if gb_bytes_eq(b7, b8, l7p[0]) == 1 { t9 = 0 } } 221 } } 222 } } 223 gv_check("T9 per-fragment sampling LOAD-BEARING: seed-7 vs seed-8 renders differ" as *u8, t9, ctr) 224 225 // T10 the real shipped asset (gv_need) -> published artifacts 226 var haveref: i64 = 0 227 let rfd: i64 = sys_openat_rd("sites/nishifamily/world/ref9d.nxa" as *u8) 228 if rfd >= 0 { haveref = 1; sys_close(rfd) } 229 if gv_need("sites/nishifamily/world/ref9d.nxa" as *u8, haveref, ctr) == 1 { 230 let bo3: *i64 = sys_mmap(16) as *i64 231 let rflen: i64 = gb_flen("sites/nishifamily/world/ref9d.nxa" as *u8, bo3) 232 let rb: *u8 = bo3[0] as *u8 233 let regs2: *i64 = sys_mmap(4096*8) as *i64 234 let perms2: *i64 = sys_mmap(4096*8) as *i64 235 let rnj: i64 = ntb_regions(rb, rflen, regs2, perms2) 236 let cnt: *i64 = sys_mmap(4*8) as *i64 237 var j2: i64 = 0 238 while j2 < rnj { cnt[regs2[j2]] = cnt[regs2[j2]] + 1; j2 = j2 + 1 } 239 gv_puts(" ref9d census: face=" as *u8); gv_num(cnt[0]) 240 gv_puts(" torso=" as *u8); gv_num(cnt[1]) 241 gv_puts(" limbs=" as *u8); gv_num(cnt[2]) 242 gv_puts(" gens=" as *u8); gv_num(cnt[3]) 243 gv_puts("\n" as *u8) 244 var t10: i64 = 0 245 if rnj > 0 { if cnt[0] >= 2 { if cnt[1] >= 2 { if cnt[2] >= 15 { t10 = 1 } } } } 246 gv_check("T10 ref9d region census sane (face>=2 torso>=2 limbs>=15, all 104 classified)" as *u8, t10, ctr) 247 let atl: *u8 = sys_mmap(1024*1024*3 + 64) 248 let rca: i64 = ntb_bake(rb, rflen, 1024, 1, atl) 249 var t11: i64 = 0 250 if rca == 0 { 251 ntb_write_atlas_png(atl, 1024, "knowledge/nx_texc_atlas.png" as *u8) 252 if ntb_view(rb, rflen, 1024, 1, "knowledge/nx_texc_view.png" as *u8) == 0 { t11 = 1 } 253 } 254 gv_check("T11 ref9d bakes + renders TEXTURED: knowledge/nx_texc_atlas.png + nx_texc_view.png" as *u8, t11, ctr) 255 } 256 257 // ---- T12-T14 AXIS INVARIANCE (2026-08-23). The R22 glTF ingest emits axes AS AUTHORED 258 // (y-up); the pre-fix lib normalized every asset by its z-span, so a y-up donor was scaled by 259 // its body DEPTH: measured live as an 81-percent-fill mesh-interior close-up (filled3=334445 260 // of 414000) versus 13.6 percent for the shipped z-up asset. The tooth: the SAME fixture, 261 // re-authored y-up by swapping y/z in VERT and SKEL with checksums recomputed through the 262 // format's own primitives, must render a BYTE-IDENTICAL PNG. Integer renderer, no tolerance. 263 let pyu: *u8 = "/tmp/ntb_fix_yup.nxa" as *u8 264 let pdg: *u8 = "/tmp/ntb_fix_deg.nxa" as *u8 265 let pva: *u8 = "/tmp/ntb_va.png" as *u8 266 let pvb: *u8 = "/tmp/ntb_vb.png" as *u8 267 let pvd: *u8 = "/tmp/ntb_vd.png" as *u8 268 sys_unlinkat(pvd) 269 let bo5: *i64 = sys_mmap(16) as *i64 270 let fl5: i64 = gb_flen(pt, bo5) 271 let mb: *u8 = bo5[0] as *u8 272 let w5: *i64 = mb as *i64 273 let vwo5: i64 = nxa_find(mb, fl5, nxa_tag4("VERT" as *u8)) 274 let swo5: i64 = nxa_find(mb, fl5, nxa_tag4("SKEL" as *u8)) 275 var axok: i64 = 0 276 if vwo5 > 0 { if swo5 > 0 { axok = 1 } } 277 if axok == 1 { 278 let nv5: i64 = w5[vwo5] 279 var q5: i64 = 0 280 while q5 < nv5 { 281 let ty5: i64 = w5[vwo5 + 1 + q5*3 + 1] 282 w5[vwo5 + 1 + q5*3 + 1] = w5[vwo5 + 1 + q5*3 + 2] 283 w5[vwo5 + 1 + q5*3 + 2] = ty5 284 q5 = q5 + 1 285 } 286 let nj5: i64 = w5[swo5] 287 var q6: i64 = 0 288 while q6 < nj5 { 289 let tz5: i64 = w5[swo5 + 1 + q6*8 + 2] 290 w5[swo5 + 1 + q6*8 + 2] = w5[swo5 + 1 + q6*8 + 3] 291 w5[swo5 + 1 + q6*8 + 3] = tz5 292 q6 = q6 + 1 293 } 294 // recompute the two payload checksums and the TOC checksum, through nxa_check2 itself 295 let ns5: i64 = w5[2] 296 var s5: i64 = 0 297 while s5 < ns5 { 298 let tg5: i64 = w5[4 + s5*4] 299 var redo: i64 = 0 300 if tg5 == nxa_tag4("VERT" as *u8) { redo = 1 } 301 if tg5 == nxa_tag4("SKEL" as *u8) { redo = 1 } 302 if redo == 1 { 303 let off5: i64 = w5[4 + s5*4 + 1] 304 let wl5: i64 = w5[4 + s5*4 + 2] 305 w5[4 + s5*4 + 3] = nxa_check2(1, ((mb as i64) + off5) as *i64, wl5) 306 } 307 s5 = s5 + 1 308 } 309 w5[3] = nxa_check2(1, ((mb as i64) + 32) as *i64, ns5*4) 310 gb_wfile(pyu, mb, fl5) 311 } 312 gv_check("T12 setup: y-up twin derived from the fixture itself, checksums recomputed" as *u8, axok, ctr) 313 let boY: *i64 = sys_mmap(16) as *i64 314 let flY: i64 = gb_flen(pyu, boY) 315 let yb: *u8 = boY[0] as *u8 316 let rvA: i64 = ntb_view(fb2, flen, 64, 7, pva) 317 let rvB: i64 = ntb_view(yb, flY, 64, 7, pvb) 318 var t13: i64 = 0 319 if rvA == 0 { if rvB == 0 { 320 let lap: *i64 = sys_mmap(16) as *i64 321 let lbp: *i64 = sys_mmap(16) as *i64 322 let ba5: *u8 = sys_read_file(pva, lap) 323 let bb5: *u8 = sys_read_file(pvb, lbp) 324 gv_puts(" axis-invariance: png_a=" as *u8); gv_num(lap[0]) 325 gv_puts(" png_b=" as *u8); gv_num(lbp[0]) 326 gv_puts("\n" as *u8) 327 if lap[0] > 0 { if lap[0] == lbp[0] { if gb_bytes_eq(ba5, bb5, lap[0]) == 1 { t13 = 1 } } } 328 } } 329 gv_check("T13 AXIS-INVARIANCE: z-up and y-up authorings of one shape render BYTE-IDENTICAL PNGs" as *u8, t13, ctr) 330 // degenerate control: zero every vertex, fix checksums, must refuse and write nothing 331 let boD: *i64 = sys_mmap(16) as *i64 332 let flD: i64 = gb_flen(pt, boD) 333 let db5: *u8 = boD[0] as *u8 334 let wD: *i64 = db5 as *i64 335 let vwoD: i64 = nxa_find(db5, flD, nxa_tag4("VERT" as *u8)) 336 if vwoD > 0 { 337 let nvD: i64 = wD[vwoD] 338 var qD: i64 = 0 339 while qD < nvD*3 { wD[vwoD + 1 + qD] = 0; qD = qD + 1 } 340 let nsD: i64 = wD[2] 341 var sD: i64 = 0 342 while sD < nsD { 343 if wD[4 + sD*4] == nxa_tag4("VERT" as *u8) { 344 let offD: i64 = wD[4 + sD*4 + 1] 345 let wlD: i64 = wD[4 + sD*4 + 2] 346 wD[4 + sD*4 + 3] = nxa_check2(1, ((db5 as i64) + offD) as *i64, wlD) 347 } 348 sD = sD + 1 349 } 350 wD[3] = nxa_check2(1, ((db5 as i64) + 32) as *i64, nsD*4) 351 gb_wfile(pdg, db5, flD) 352 } 353 let boD2: *i64 = sys_mmap(16) as *i64 354 let flD2: i64 = gb_flen(pdg, boD2) 355 let rvD: i64 = ntb_view(boD2[0] as *u8, flD2, 64, 7, pvd) 356 var deg_fired: i64 = 0 357 if rvD != 0 { 358 let ck: i64 = sys_openat_rd(pvd) 359 if ck < 0 { deg_fired = 1 } else { sys_close(ck) } 360 } 361 var inv_good: i64 = 1 362 if rvA == 0 { inv_good = 0 } 363 gv_bite("T14 neg-control-degenerate-span-refused-and-writes-no-png (real fixture rendered)" as *u8, deg_fired, inv_good, ctr) 364 365 let rcv: i64 = gv_verdict( 366"NXA-TEXBAKE-GATE" as *u8, ctr, "regions from anatomy, albedo atlas baked, per-fragment textured render live" as *u8) 367 sys_exit(rcv) 368 return rcv 369}