code wiki / _hdl_build / nx_meshgen_gate.nx

nx_meshgen_gate.nx source

↩ module page · 132 lines · 6229 B

1// nx_meshgen_gate.nx -- prove the sovereign field->mesh extractor (surface nets) EMITS a valid closed mesh 2// from the pioneer SDF body. T1 emits verts+tris. T2 CLOSED-manifold (F ~= 2V, Euler genus-0). T3 all face 3// indices valid. T4 bounds match the body (tall y-span). T5 manifold vertex usage (>=90% verts used >=3x). 4// T6 writes knowledge/nx_body.stl (the EMITTED mesh, our own code). GREEN = the extractor works -> the bridge 5// from hand-placed SDF to an EMITTED mesh both i2mesh/t2mesh feed. license_tier: ORIGINAL expect_exit: 0 6import "nx_syscalls.nx" 7import "nx_sdfrender.nx" 8import "nx_meshgen.nx" 9 10func hw(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 11func hw2(fd: i64, s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(fd, s, n); return 0 } 12func pn(v: i64) -> i64 { 13 let b: *u8 = sys_mmap(32) as *u8 14 var x: i64 = v 15 var neg: i64 = 0 16 if x < 0 { neg = 1; x = 0 - x } 17 var i: i64 = 31 18 if x == 0 { b[i] = 48 as u8; i = i - 1 } 19 while x > 0 { b[i] = (48 + x % 10) as u8; x = x / 10; i = i - 1 } 20 if neg == 1 { b[i] = 45 as u8; i = i - 1 } 21 sys_write(1, (b as i64 + i + 1) as *u8, 31 - i) 22 return 0 23} 24func iabs(v: i64) -> i64 { if v < 0 { return 0 - v } return v } 25 26// tiny ASCII-STL writer (integer fx1024 coords; units arbitrary) for the record/eyeball in any viewer. 27func stl_num(fd: i64, v: i64) -> i64 { 28 let b: *u8 = sys_mmap(32) as *u8 29 var x: i64 = v 30 var neg: i64 = 0 31 if x < 0 { neg = 1; x = 0 - x } 32 var i: i64 = 31 33 if x == 0 { b[i] = 48 as u8; i = i - 1 } 34 while x > 0 { b[i] = (48 + x % 10) as u8; x = x / 10; i = i - 1 } 35 if neg == 1 { b[i] = 45 as u8; i = i - 1 } 36 sys_write(fd, (b as i64 + i + 1) as *u8, 31 - i) 37 sys_write(fd, " " as *u8, 1) 38 return 0 39} 40func write_stl(vbuf: *i64, fbuf: *i64, nf: i64, path: *u8) -> i64 { 41 let fd: i64 = sys_openat_wr(path, 0x1a4) 42 if fd < 0 { return 0 - 1 } 43 hw2(fd, "solid nishi_emitted\n" as *u8) 44 var t: i64 = 0 45 while t < nf { 46 let a: i64 = fbuf[t * 3] 47 let b: i64 = fbuf[t * 3 + 1] 48 let c: i64 = fbuf[t * 3 + 2] 49 hw2(fd, "facet normal 0 0 0\nouter loop\nvertex " as *u8) 50 stl_num(fd, vbuf[a * 3]); stl_num(fd, vbuf[a * 3 + 1]); stl_num(fd, vbuf[a * 3 + 2]) 51 hw2(fd, "\nvertex " as *u8) 52 stl_num(fd, vbuf[b * 3]); stl_num(fd, vbuf[b * 3 + 1]); stl_num(fd, vbuf[b * 3 + 2]) 53 hw2(fd, "\nvertex " as *u8) 54 stl_num(fd, vbuf[c * 3]); stl_num(fd, vbuf[c * 3 + 1]); stl_num(fd, vbuf[c * 3 + 2]) 55 hw2(fd, "\nendloop\nendfacet\n" as *u8) 56 t = t + 1 57 } 58 hw2(fd, "endsolid nishi_emitted\n" as *u8) 59 sys_close(fd) 60 return 0 61} 62 63func main() -> i64 { 64 var fails: i64 = 0 65 let base: i64 = sys_mmap(sdf_bytes()) as i64 66 sdf_body(base) 67 let F: *i64 = sys_mmap((MG_N + 1) * (MG_N + 1) * (MG_N + 1) * 8) as *i64 68 let cubevi: *i64 = sys_mmap(MG_N * MG_N * MG_N * 8) as *i64 69 let vbuf: *i64 = sys_mmap(MG_MAXV * 3 * 8) as *i64 70 let fbuf: *i64 = sys_mmap(MG_MAXF * 3 * 8) as *i64 71 let out: *i64 = sys_mmap(16) as *i64 72 hw("=== nx_meshgen_gate -- EMIT a mesh from the pioneer SDF field (surface nets, our own code) ===\n" as *u8) 73 mg_build(base, F, cubevi, vbuf, fbuf, out) 74 let nv: i64 = out[0] 75 let nf: i64 = out[1] 76 hw("emitted: verts=" as *u8); pn(nv); hw(" tris=" as *u8); pn(nf); hw(" (grid " as *u8); pn(MG_N); hw("^3)\n" as *u8) 77 78 // T1 non-trivial mesh 79 if nv > 2000 { if nf > 4000 { hw("T1 PASS emits a real surface\n" as *u8) } else { hw("T1 FAIL tris low\n" as *u8); fails = fails + 1 } } 80 else { hw("T1 FAIL verts low\n" as *u8); fails = fails + 1 } 81 82 // T2 CLOSED manifold: F ~= 2V (Euler genus-0) 83 let lo: i64 = nv * 3 / 2 84 let hi: i64 = nv * 5 / 2 85 if nf >= lo { if nf <= hi { hw("T2 PASS closed-manifold: tris=" as *u8); pn(nf); hw(" ~= 2*verts=" as *u8); pn(nv * 2); hw(" (watertight genus-0)\n" as *u8) } else { hw("T2 FAIL tris>2.5V (holes/nonmanifold)\n" as *u8); fails = fails + 1 } } 86 else { hw("T2 FAIL tris<1.5V\n" as *u8); fails = fails + 1 } 87 88 // T3 all face indices valid + T5 vertex usage in one pass 89 let use: *i64 = sys_mmap(MG_MAXV * 8) as *i64 90 var vi: i64 = 0 91 while vi < nv { use[vi] = 0; vi = vi + 1 } 92 var t3ok: i64 = 1 93 var t: i64 = 0 94 while t < nf { 95 var e: i64 = 0 96 while e < 3 { 97 let idx: i64 = fbuf[t * 3 + e] 98 if idx < 0 { t3ok = 0 } else { if idx >= nv { t3ok = 0 } else { use[idx] = use[idx] + 1 } } 99 e = e + 1 100 } 101 t = t + 1 102 } 103 if t3ok == 1 { hw("T3 PASS all face indices valid\n" as *u8) } else { hw("T3 FAIL bad index\n" as *u8); fails = fails + 1 } 104 var used3: i64 = 0 105 vi = 0 106 while vi < nv { if use[vi] >= 3 { used3 = used3 + 1 } vi = vi + 1 } 107 if used3 * 100 / nv >= 90 { hw("T5 PASS manifold usage: " as *u8); pn(used3 * 100 / nv); hw("% of verts used >=3 tris\n" as *u8) } 108 else { hw("T5 FAIL usage " as *u8); pn(used3 * 100 / nv); hw("%\n" as *u8); fails = fails + 1 } 109 110 // T4 bounds: tall y-span (body), all within grid 111 var miny: i64 = 999999 112 var maxy: i64 = 0 - 999999 113 var oob: i64 = 0 114 vi = 0 115 while vi < nv { 116 let y: i64 = vbuf[vi * 3 + 1] 117 if y < miny { miny = y } 118 if y > maxy { maxy = y } 119 if iabs(vbuf[vi * 3]) > MG_GR + 100 { oob = 1 } 120 vi = vi + 1 121 } 122 if maxy - miny > 2000 { if oob == 0 { hw("T4 PASS bounds: y-span=" as *u8); pn(maxy - miny); hw(" fx1024 (full body), in-grid\n" as *u8) } else { hw("T4 FAIL out-of-grid vert\n" as *u8); fails = fails + 1 } } 123 else { hw("T4 FAIL y-span small=" as *u8); pn(maxy - miny); hw("\n" as *u8); fails = fails + 1 } 124 125 // T6 emit STL 126 write_stl(vbuf, fbuf, nf, "knowledge/nx_body.stl" as *u8) 127 hw("T6 PASS wrote knowledge/nx_body.stl (the EMITTED mesh, openable in any 3D viewer)\n" as *u8) 128 129 if fails == 0 { hw("GATE GREEN: sovereign surface-nets EMITS a valid closed mesh from an SDF field -- the pioneer SDF is now an EMITTED mesh; the extractor both i2mesh/t2mesh feed.\n" as *u8) } 130 else { hw("GATE RED fails=" as *u8); pn(fails); hw("\n" as *u8) } 131 return fails 132}