code wiki / _hdl_build / nx_explodelab_meshes_gate.nx

nx_explodelab_meshes_gate.nx source

↩ module page · 127 lines · 5453 B

1// nx_explodelab_meshes_gate.nx -- gate the GENERATED real-geometry module for /explodelab: each kind loads into 2// the ex3 world (viewer caps 4096v/8192t), counts match the baked tables, coords fit the viewer's world scale 3// (|v| <= 3400), TRUE dims table exact (nut 20x15x3mm / 787 thou; rod 7874 thou), all 5 parts together fit the 4// caps with instance headroom, deterministic. expect_exit: 0 license_tier: ORIGINAL 5import "nx_explodelab_meshes.nx" 6 7func mg2_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 8func mg2_putn(v: i64) -> i64 { 9 let bb: *u8 = sys_mmap(28) 10 var m: i64 = v 11 if m < 0 { mg2_puts("-" as *u8); m = 0 - m } 12 let t: *u8 = sys_mmap(28) 13 var k: i64 = 0 14 if m == 0 { t[0] = 48 as u8; k = 1 } 15 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 16 var i: i64 = 0 17 while i < k { bb[i] = t[k - 1 - i]; i = i + 1 } 18 sys_write(1, bb, k) 19 return 0 20} 21func mg2_tooth(name: *u8, pass: i64, fails: *i64) -> i64 { 22 mg2_puts(" " as *u8); mg2_puts(name); mg2_puts(" -> " as *u8) 23 if pass == 1 { mg2_puts("PASS\n" as *u8); return 0 } 24 mg2_puts("FAIL\n" as *u8) 25 fails[0] = fails[0] + 1 26 return 0 27} 28func mg2_world(e: *i64) -> i64 { 29 let lv: *i64 = sys_mmap(131072) as *i64 30 let ix: *i64 = sys_mmap(196608) as *i64 31 let hm: *i64 = sys_mmap(2048) as *i64 32 let dr: *i64 = sys_mmap(2048) as *i64 33 let dp: *i64 = sys_mmap(512) as *i64 34 let vs: *i64 = sys_mmap(512) as *i64 35 let vc: *i64 = sys_mmap(512) as *i64 36 let sc: *i64 = sys_mmap(64) as *i64 37 return ex3_init(e, lv, ix, hm, dr, dp, vs, vc, 4096, 8192, 64, sc) 38} 39 40func main() -> i64 { 41 mg2_puts("=== nx_explodelab_meshes_gate -- REAL baked geometry loads into the viewer world ===\n" as *u8) 42 let fails: *i64 = sys_mmap(8) as *i64 43 fails[0] = 0 44 let e: *i64 = sys_mmap(256) as *i64 45 mg2_world(e) 46 let out2: *i64 = sys_mmap(16) as *i64 47 let out4: *i64 = sys_mmap(32) as *i64 48 49 // load all 5 kinds, check per-kind deltas vs baked counts + coord bounds 50 var allok: i64 = 1 51 var boundok: i64 = 1 52 var kind: i64 = 1 53 while kind <= 5 { 54 let v0: i64 = e[1] 55 let t0: i64 = e[3] 56 ex3_part_begin(e, 0, 0, 0, 0, 16384, 0, 1) 57 exm_load(e, kind, 0, 0, 0, 4285000000) 58 exm_counts(kind, out2) 59 if e[1] - v0 != out2[0] { allok = 0 } 60 if e[3] - t0 != out2[1] { allok = 0 } 61 // coord bounds (viewer world scale) 62 let lv: *i64 = e[0] as *i64 63 var vi: i64 = v0 64 while vi < e[1] { 65 var k: i64 = 0 66 while k < 3 { 67 var c: i64 = lv[vi * 4 + k] 68 if c < 0 { c = 0 - c } 69 if c > 3400 { boundok = 0 } 70 k = k + 1 71 } 72 vi = vi + 1 73 } 74 mg2_puts(" kind " as *u8); mg2_putn(kind) 75 mg2_puts(": dv=" as *u8); mg2_putn(e[1] - v0) 76 mg2_puts(" dt=" as *u8); mg2_putn(e[3] - t0) 77 mg2_puts("\n" as *u8) 78 kind = kind + 1 79 } 80 let ig1: i64 = mg2_tooth("T1 all 5 kinds load; per-kind vert/tri deltas == baked exm_counts" as *u8, allok, fails) 81 let ig2: i64 = mg2_tooth("T2 every coordinate within the viewer world scale (|v| <= 3400)" as *u8, boundok, fails) 82 83 var t3: i64 = 0 84 if e[1] == 1449 { if e[3] == 1648 { if e[1] < 4096 { if e[3] < 8192 { t3 = 1 } } } } 85 mg2_puts(" totals: verts=" as *u8); mg2_putn(e[1]); mg2_puts("/4096 tris=" as *u8); mg2_putn(e[3]); mg2_puts("/8192\n" as *u8) 86 let ig3: i64 = mg2_tooth("T3 full unique set = 1449v/1648t, fits viewer caps with instance headroom" as *u8, t3, fails) 87 88 // T4 TRUE dims: nut 20x15x3mm exact fx + 787 thou; rod maxext 7874 thou (200mm) 89 var t4: i64 = 0 90 exm_dims(1, out4) 91 if out4[0] == 5120 { if out4[1] == 3840 { if out4[2] == 768 { if out4[3] == 787 { 92 exm_dims(3, out4) 93 if out4[3] == 7874 { t4 = 1 } 94 } } } } 95 let ig4: i64 = mg2_tooth("T4 baked TRUE dims: nut 20.00x15.00x3.00mm = 787 thou; rod = 7874 thou EXACT" as *u8, t4, fails) 96 97 // T5 determinism: fresh world, reload, same totals + vert checksum 98 let e2: *i64 = sys_mmap(256) as *i64 99 mg2_world(e2) 100 kind = 1 101 while kind <= 5 { 102 ex3_part_begin(e2, 0, 0, 0, 0, 16384, 0, 1) 103 exm_load(e2, kind, 0, 0, 0, 4285000000) 104 kind = kind + 1 105 } 106 var s1: i64 = 0 107 var s2: i64 = 0 108 let lv1: *i64 = e[0] as *i64 109 let lv2: *i64 = e2[0] as *i64 110 var vi2: i64 = 0 111 while vi2 < e[1] { 112 s1 = s1 + lv1[vi2 * 4] + 3 * lv1[vi2 * 4 + 1] + 7 * lv1[vi2 * 4 + 2] 113 s2 = s2 + lv2[vi2 * 4] + 3 * lv2[vi2 * 4 + 1] + 7 * lv2[vi2 * 4 + 2] 114 vi2 = vi2 + 1 115 } 116 var t5: i64 = 0 117 if e2[1] == e[1] { if e2[3] == e[3] { if s1 == s2 { t5 = 1 } } } 118 let ig5: i64 = mg2_tooth("T5 deterministic" as *u8, t5, fails) 119 120 mg2_puts("\nREAL FILE-TRUE GEOMETRY BAKED FOR THE VIEWER: the actual as1 nut/bolt/rod/plate/bracket (53/53 faces,\n" as *u8) 121 mg2_puts("welded, centered, 32 units/mm) + TRUE mm/thou dims tables. NEXT: swap mp_* stand-ins in the wasm\n" as *u8) 122 mg2_puts("surface for exm_load + dims labels, re-pack, V8-validate, ship.\n" as *u8) 123 mg2_puts("\nfails=" as *u8); mg2_putn(fails[0]); mg2_puts("\n" as *u8) 124 if fails[0] == 0 { mg2_puts("GREEN -- baked real geometry 5/5 (loads, counts, scale, dims, deterministic)\n" as *u8); return 0 } 125 mg2_puts("RED\n" as *u8) 126 return 1 127}