code wiki / _hdl_build / nx_step_tess_gate.nx
nx_step_tess_gate.nx source
↩ module page · 153 lines · 7403 B
1// nx_step_tess_gate.nx -- benchmark PLANAR-FACE TESSELLATION on the real as1 STEP file (cadtwin P3a geometry).
2// Teeth: (T1) real tessellation volume on the 53-face model; (T2) EXACT integer area conservation on every face
3// (signed ear-area sum == polygon shoelace -- any ear-clip bug is a mismatch, no silent bad geometry); (T3) every
4// tessellated loop lies ON its declared plane (residual bound); (T4) KNOWN-FACE ground truth: face #423 (plane
5// y=0, origin (10,0,0), normal (0,-1,0)) -> exactly 4 loop verts incl. (20,0,0), all y==0 EXACT, 2 triangles;
6// (T5) compose: mesh -> STL write -> STL read round-trip; (T6) deterministic. Curved surfaces/holes/chord edges
7// COUNTED honestly. expect_exit: 0 license_tier: ORIGINAL
8import "nx_step_tess.nx"
9
10func tg_tooth(name: *u8, pass: i64, fails: *i64) -> i64 {
11 sp_puts(" " as *u8); sp_puts(name); sp_puts(" -> " as *u8)
12 if pass == 1 { sp_puts("PASS\n" as *u8); return 0 }
13 sp_puts("FAIL\n" as *u8)
14 fails[0] = fails[0] + 1
15 return 0
16}
17// build a fresh tess ctx (st stays shared); mesh+counters reset
18func tg_ctx(tt: *i64, st: *i64, mesh: i64, c: *i64) -> i64 {
19 var i: i64 = 0
20 while i < 16 { c[i] = 0; i = i + 1 }
21 m3_init(mesh)
22 tt[0] = st as i64
23 tt[1] = mesh
24 tt[2] = c as i64
25 tt[9] = 0
26 return 0
27}
28
29func main() -> i64 {
30 sp_puts("=== nx_step_tess_gate -- planar-face tessellation (real triangles) from the as1 STEP B-rep ===\n" as *u8)
31 let fails: *i64 = sys_mmap(8) as *i64
32 fails[0] = 0
33 let buf: *u8 = sys_mmap(4194304)
34 let aid: *i64 = sys_mmap(524288) as *i64
35 let anm: *i64 = sys_mmap(524288) as *i64
36 let anl: *i64 = sys_mmap(524288) as *i64
37 let aao: *i64 = sys_mmap(524288) as *i64
38 let aal: *i64 = sys_mmap(524288) as *i64
39 let st: *i64 = sys_mmap(256) as *i64
40 let n: i64 = sp_read_file("knowledge/fetched/step_as1.stp" as *u8, buf, 4194304)
41 if n <= 0 { sp_puts("MISSING step_as1.stp -- run nx_step_sample_fetch\nRED\n" as *u8); return 1 }
42 sp_init(st, buf, n, aid, anm, anl, aao, aal)
43 let cnt: i64 = sp_scan(st)
44
45 // tess ctx buffers (allocated ONCE, outside all loops)
46 let tt: *i64 = sys_mmap(128) as *i64
47 let c: *i64 = sys_mmap(128) as *i64
48 let mesh: i64 = sys_mmap(m3_bytes()) as i64
49 tt[3] = sys_mmap(768) as i64 // refs (96 ids)
50 tt[4] = sys_mmap(1536) as i64 // loop 3D (64 verts)
51 tt[5] = sys_mmap(1024) as i64 // loop 2D
52 tt[6] = sys_mmap(512) as i64 // alive
53 tt[7] = sys_mmap(128) as i64 // plane block + tri scratch @96
54 tt[8] = sys_mmap(16) as i64 // out2
55 tg_ctx(tt, st, mesh, c)
56
57 let ntess: i64 = sgt_tessellate(tt)
58 sp_puts("entities=" as *u8); sp_putn(cnt)
59 sp_puts(" faces=" as *u8); sp_putn(c[0])
60 sp_puts(" planar=" as *u8); sp_putn(c[1])
61 sp_puts(" tessellated=" as *u8); sp_putn(c[2])
62 sp_puts(" tris=" as *u8); sp_putn(c[7])
63 sp_puts("\n skipped: curved-surface=" as *u8); sp_putn(c[4])
64 sp_puts(" multi-bound(holes/rims)=" as *u8); sp_putn(c[3])
65 sp_puts(" degenerate=" as *u8); sp_putn(c[8])
66 sp_puts(" chord-approx edges=" as *u8); sp_putn(c[5])
67 sp_puts("\n AREA-MISMATCHES=" as *u8); sp_putn(c[6])
68 sp_puts(" max plane residual (fx256)=" as *u8); sp_putn(tt[9]); sp_puts("\n" as *u8)
69
70 var t1: i64 = 0
71 if c[0] == 53 { if c[1] >= 15 { if c[2] >= 8 { if c[7] >= 20 { t1 = 1 } } } }
72 let ig1: i64 = tg_tooth("T1 real volume: 53 faces walked, >=15 planar, >=8 tessellated, >=20 tris" as *u8, t1, fails)
73
74 var t2: i64 = 0
75 if c[6] == 0 { if c[2] > 0 { t2 = 1 } }
76 let ig2: i64 = tg_tooth("T2 EXACT area conservation on every tessellated face (ear sum == shoelace)" as *u8, t2, fails)
77
78 var t3: i64 = 0
79 if tt[9] <= 300 { t3 = 1 }
80 let ig3: i64 = tg_tooth("T3 every tessellated loop lies ON its declared plane (residual <= 300)" as *u8, t3, fails)
81
82 // T4 KNOWN-FACE ground truth: face #423 alone (plane y=0)
83 let mesh2: i64 = sys_mmap(m3_bytes()) as i64
84 let c2: *i64 = sys_mmap(128) as *i64
85 tg_ctx(tt, st, mesh2, c2)
86 let fidx: i64 = sp_find(st, 423)
87 var t4: i64 = 0
88 if fidx >= 0 {
89 let okf: i64 = sgt_face(tt, fidx)
90 let h2: *i64 = m3_hdr(mesh2)
91 if okf == 1 { if c2[7] == 2 { if h2[0] == 4 {
92 var ally0: i64 = 1
93 var has20: i64 = 0
94 var vi: i64 = 0
95 while vi < 4 {
96 let v: *i64 = m3_vert(mesh2, vi)
97 if v[1] != 0 { ally0 = 0 }
98 if v[0] == 5120 { if v[1] == 0 { if v[2] == 0 { has20 = 1 } } }
99 vi = vi + 1
100 }
101 if ally0 == 1 { if has20 == 1 { t4 = 1 } }
102 } } }
103 sp_puts(" face#423: tessellated=" as *u8); sp_putn(okf)
104 sp_puts(" verts=" as *u8); sp_putn(h2[0])
105 sp_puts(" tris=" as *u8); sp_putn(c2[7]); sp_puts(" (expect 4 verts / 2 tris, all y==0, incl (5120,0,0))\n" as *u8)
106 }
107 let ig4: i64 = tg_tooth("T4 known face #423: exact y=0 plane, 4 verts incl (20,0,0), 2 tris" as *u8, t4, fails)
108
109 // T5 compose: STL write -> read round-trip on the full tessellation
110 let wr: i64 = m3_write_stl(mesh, "knowledge/step_tess.stl" as *u8)
111 let mesh3b: i64 = sys_mmap(m3_bytes()) as i64
112 let rd: i64 = m3_read_stl(mesh3b, "knowledge/step_tess.stl" as *u8)
113 let h: *i64 = m3_hdr(mesh)
114 let h3: *i64 = m3_hdr(mesh3b)
115 var t5: i64 = 0
116 if wr >= 0 { if rd >= 0 { if h3[1] == h[1] { if h[1] == c[7] { t5 = 1 } } } }
117 sp_puts(" STL round-trip: wrote tris=" as *u8); sp_putn(h[1]); sp_puts(" read-back tris=" as *u8); sp_putn(h3[1]); sp_puts("\n" as *u8)
118 let ig5: i64 = tg_tooth("T5 compose: tessellation -> STL write -> STL read round-trip" as *u8, t5, fails)
119
120 // T6 determinism
121 let mesh4: i64 = sys_mmap(m3_bytes()) as i64
122 let c4: *i64 = sys_mmap(128) as *i64
123 tg_ctx(tt, st, mesh4, c4)
124 let ntess2: i64 = sgt_tessellate(tt)
125 var sum1: i64 = 0
126 var sum2: i64 = 0
127 let hh: *i64 = m3_hdr(mesh)
128 let h4: *i64 = m3_hdr(mesh4)
129 var vi2: i64 = 0
130 while vi2 < hh[0] {
131 let va: *i64 = m3_vert(mesh, vi2)
132 sum1 = sum1 + va[0] + va[1] * 3 + va[2] * 7
133 vi2 = vi2 + 1
134 }
135 vi2 = 0
136 while vi2 < h4[0] {
137 let vb: *i64 = m3_vert(mesh4, vi2)
138 sum2 = sum2 + vb[0] + vb[1] * 3 + vb[2] * 7
139 vi2 = vi2 + 1
140 }
141 var t6: i64 = 0
142 if ntess2 == ntess { if c4[7] == c[7] { if h4[0] == hh[0] { if sum1 == sum2 { t6 = 1 } } } }
143 let ig6: i64 = tg_tooth("T6 deterministic" as *u8, t6, fails)
144
145 sp_puts("\nP3a GEOMETRY: the STEP file's OWN topology walked to real triangles (ear-clip handles the L-bracket's\n" as *u8)
146 sp_puts("concave faces; exact-area invariant self-checks every face). HONEST v1 scope: single-bound planar faces;\n" as *u8)
147 sp_puts("holes/rims + cylinders/B-splines counted+skipped; curved edges chord-approximated (counted). NEXT: hole\n" as *u8)
148 sp_puts("bridging (multi-bound), curved-surface tessellation -> full from-file geometry for /explodelab.\n" as *u8)
149 sp_puts("\nfails=" as *u8); sp_putn(fails[0]); sp_puts("\n" as *u8)
150 if fails[0] == 0 { sp_puts("GREEN -- planar-face tessellation 6/6 (real B-rep -> real triangles, exact invariants)\n" as *u8); return 0 }
151 sp_puts("RED\n" as *u8)
152 return 1
153}