nx_vessel_csg_test.nx source
↩ module page · 43 lines · 1710 B
1// nx_vessel_csg_test.nx -- smoke for nx_vessel_csg (C1).
2//
3// Proves the vessel is a correct hollow cup via cheap field-sampling +
4// inside-count (no OOM-prone meshing):
5// - the cavity is hollow (1), the wall is solid (2), the base is solid (3),
6// outside is empty (4)
7// - the hollow cup contains strictly less material than the solid
8// cylinder it was cut from (5-6)
9// Exit code = failed assertion number; 0 = all pass.
10
11import "nx_syscalls.nx"
12import "nx_sdf.nx"
13import "nx_csg.nx"
14import "nx_csg_scene.nx"
15import "nx_vessel_csg.nx"
16
17func main() -> i64 {
18 let q: i64 = 16384
19 // 84 mm outer radius, 4 mm wall, 200 mm tall, 5 mm base
20 let s: *NxCsgScene = nx_vessel_csg_build(84, 4, 200, 5)
21
22 if nx_csg_scene_field(s, 0, 0, 20 * q) < 0 { return 1 } // cavity: hollow
23 if nx_csg_scene_field(s, 82 * q, 0, 0) >= 0 { return 2 } // wall: solid
24 if nx_csg_scene_field(s, 0, 0, (0 - 97) * q) >= 0 { return 3 } // base: solid
25 if nx_csg_scene_field(s, 90 * q, 0, 0) < 0 { return 4 } // outside: empty
26
27 // hollow check: vessel has fewer inside points than the solid cylinder
28 let solid: *NxCsgScene = nx_csg_scene_new(1)
29 let oc: *NxSdfPrim = nx_sdf_make(NX_SDF_CYL, 0, 0, 0, 84 * q, 100 * q, 0)
30 nx_csg_scene_add(solid, oc, NX_CSG_UNION, 0)
31
32 let lo: i64 = (0 - 90) * q
33 let hi: i64 = 90 * q
34 let loz: i64 = (0 - 105) * q
35 let hiz: i64 = 105 * q
36 let step: i64 = 4 * q
37 let cnt_v: i64 = nx_csg_scene_count_inside(s, lo, lo, loz, hi, hi, hiz, step)
38 let cnt_s: i64 = nx_csg_scene_count_inside(solid, lo, lo, loz, hi, hi, hiz, step)
39 if cnt_v <= 0 { return 5 }
40 if cnt_v >= cnt_s { return 6 }
41
42 return 0
43}