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}