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}