code wiki / _hdl_build / nx_t2mesh_gate.nx

nx_t2mesh_gate.nx source

↩ module page · 111 lines · 6000 B

1// nx_t2mesh_gate.nx -- prove the t2mesh GENERATOR emits MANY different objects from text (not hand-crafted). 2// T1 each prompt -> a valid CLOSED mesh (F~=2V). T2 different prompts -> DIFFERENT geometry (>=6 distinct vert 3// counts of 8 = the generator actually varies, not one blob). T3 'person' -> the pioneer benchmark body. 4// Writes knowledge/t2m_*.stl (the EMITTED objects). GREEN = the ecosystem EMITS objects from prompts. 5// license_tier: ORIGINAL expect_exit: 0 6import "nx_syscalls.nx" 7import "nx_sdfrender.nx" 8import "nx_meshgen.nx" 9import "nx_t2mesh.nx" 10 11func hw(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 12func hwf(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 } 13func pn(v: i64) -> i64 { 14 let b: *u8 = sys_mmap(32) as *u8 15 var x: i64 = v; 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 stlnum(fd: i64, v: i64) -> i64 { 25 let b: *u8 = sys_mmap(32) as *u8 26 var x: i64 = v; var neg: i64 = 0 27 if x < 0 { neg = 1; x = 0 - x } 28 var i: i64 = 31 29 if x == 0 { b[i] = 48 as u8; i = i - 1 } 30 while x > 0 { b[i] = (48 + x % 10) as u8; x = x / 10; i = i - 1 } 31 if neg == 1 { b[i] = 45 as u8; i = i - 1 } 32 sys_write(fd, (b as i64 + i + 1) as *u8, 31 - i); sys_write(fd, " " as *u8, 1); return 0 33} 34func wstl(vbuf: *i64, fbuf: *i64, nf: i64, path: *u8) -> i64 { 35 let fd: i64 = sys_openat_wr(path, 0x1a4) 36 if fd < 0 { return 0 - 1 } 37 hwf(fd, "solid nishi_t2m\n" as *u8) 38 var t: i64 = 0 39 while t < nf { 40 let a: i64 = fbuf[t * 3]; let b: i64 = fbuf[t * 3 + 1]; let c: i64 = fbuf[t * 3 + 2] 41 hwf(fd, "facet normal 0 0 0\nouter loop\nvertex " as *u8) 42 stlnum(fd, vbuf[a*3]); stlnum(fd, vbuf[a*3+1]); stlnum(fd, vbuf[a*3+2]) 43 hwf(fd, "\nvertex " as *u8) 44 stlnum(fd, vbuf[b*3]); stlnum(fd, vbuf[b*3+1]); stlnum(fd, vbuf[b*3+2]) 45 hwf(fd, "\nvertex " as *u8) 46 stlnum(fd, vbuf[c*3]); stlnum(fd, vbuf[c*3+1]); stlnum(fd, vbuf[c*3+2]) 47 hwf(fd, "\nendloop\nendfacet\n" as *u8) 48 t = t + 1 49 } 50 hwf(fd, "endsolid nishi_t2m\n" as *u8); sys_close(fd); return 0 51} 52 53func emit_one(base: i64, F: *i64, cv: *i64, vb: *i64, fb: *i64, out: *i64, prompt: *u8, stl: *u8, failp: *i64) -> i64 { 54 t2m_prompt(base, prompt) 55 let id: i64 = t2m_id_of(prompt) 56 mg_build(base, F, cv, vb, fb, out) 57 let nv: i64 = out[0]; let nf: i64 = out[1] 58 hw(" '"); hw(prompt); hw("' -> "); hw(t2m_name(id)); hw(": verts="); pn(nv); hw(" tris="); pn(nf) 59 var ok: i64 = 1 60 if nv < 400 { ok = 0 } 61 if nf < nv * 3 / 2 { ok = 0 } 62 if nf > nv * 5 / 2 { ok = 0 } 63 if ok == 1 { hw(" [closed]\n" as *u8) } else { hw(" [BAD]\n" as *u8); failp[0] = failp[0] + 1 } 64 wstl(vb, fb, nf, stl) 65 return nv 66} 67 68func main() -> i64 { 69 let base: i64 = sys_mmap(sdf_bytes()) as i64 70 let F: *i64 = sys_mmap((MG_N + 1) * (MG_N + 1) * (MG_N + 1) * 8) as *i64 71 let cv: *i64 = sys_mmap(MG_N * MG_N * MG_N * 8) as *i64 72 let vb: *i64 = sys_mmap(MG_MAXV * 3 * 8) as *i64 73 let fb: *i64 = sys_mmap(MG_MAXF * 3 * 8) as *i64 74 let out: *i64 = sys_mmap(16) as *i64 75 let nvs: *i64 = sys_mmap(16 * 8) as *i64 76 let failp: *i64 = sys_mmap(8) as *i64; failp[0] = 0 77 hw("=== nx_t2mesh_gate -- the ecosystem EMITS objects from TEXT (batch, our own code) ===\n" as *u8) 78 79 nvs[0] = emit_one(base, F, cv, vb, fb, out, "a red rubber ball" as *u8, "knowledge/t2m_ball.stl" as *u8, failp) 80 nvs[1] = emit_one(base, F, cv, vb, fb, out, "a snowman in the yard" as *u8, "knowledge/t2m_snowman.stl" as *u8, failp) 81 nvs[2] = emit_one(base, F, cv, vb, fb, out, "a heavy dumbbell" as *u8, "knowledge/t2m_dumbbell.stl" as *u8, failp) 82 nvs[3] = emit_one(base, F, cv, vb, fb, out, "a tall oak tree" as *u8, "knowledge/t2m_tree.stl" as *u8, failp) 83 nvs[4] = emit_one(base, F, cv, vb, fb, out, "a mushroom" as *u8, "knowledge/t2m_mushroom.stl" as *u8, failp) 84 nvs[5] = emit_one(base, F, cv, vb, fb, out, "a glass bottle" as *u8, "knowledge/t2m_bottle.stl" as *u8, failp) 85 nvs[6] = emit_one(base, F, cv, vb, fb, out, "an Elara person figure" as *u8, "knowledge/t2m_person.stl" as *u8, failp) 86 nvs[7] = emit_one(base, F, cv, vb, fb, out, "a desert cactus" as *u8, "knowledge/t2m_cactus.stl" as *u8, failp) 87 88 var fails: i64 = failp[0] 89 // T1 90 if fails == 0 { hw("T1 PASS every prompt -> a valid CLOSED mesh (8/8)\n" as *u8) } 91 else { hw("T1 FAIL "); pn(fails); hw(" bad meshes\n" as *u8) } 92 // T2 distinct vert counts -> the generator VARIES by prompt 93 var distinct: i64 = 0 94 var a: i64 = 0 95 while a < 8 { 96 var seen: i64 = 0 97 var b: i64 = 0 98 while b < a { if nvs[b] == nvs[a] { seen = 1 } b = b + 1 } 99 if seen == 0 { distinct = distinct + 1 } 100 a = a + 1 101 } 102 if distinct >= 6 { hw("T2 PASS generator VARIES: "); pn(distinct); hw("/8 distinct vert counts -> different objects, not one blob\n" as *u8) } 103 else { hw("T2 FAIL only "); pn(distinct); hw(" distinct\n" as *u8); fails = fails + 1 } 104 // T3 person -> pioneer body (~3358 verts) 105 if nvs[6] > 2800 { if nvs[6] < 3900 { hw("T3 PASS 'person' -> the pioneer benchmark body (verts="); pn(nvs[6]); hw(", matches sdf_body)\n" as *u8) } else { hw("T3 FAIL person verts off\n" as *u8); fails = fails + 1 } } 106 else { hw("T3 FAIL person verts="); pn(nvs[6]); hw("\n" as *u8); fails = fails + 1 } 107 108 if fails == 0 { hw("GATE GREEN: t2mesh v0 EMITS many distinct objects from text -> meshes (knowledge/t2m_*.stl). The ecosystem generates; the pioneer is the benchmark, not the product.\n" as *u8) } 109 else { hw("GATE RED fails="); pn(fails); hw("\n" as *u8) } 110 return fails 111}