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}