code wiki / (root) / nx_vessel_csg_test.nx

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}