code wiki / (root) / nx_collision_aabb_test.nx

nx_collision_aabb_test.nx source

↩ module page · 73 lines · 2676 B

1// nx_collision_aabb_test.nx -- smoke for nx_collision_aabb. 2 3import "nx_syscalls.nx" 4import "nx_q14_math.nx" 5import "nx_collision_aabb.nx" 6 7func main() -> i64 { 8 // AABB from voxel (3,3,3): (3,3,3)..(4,4,4) in Q14 9 let v: *NxAabb = nx_aabb_from_voxel(3, 3, 3) 10 if v.min_x_q14 != 3 * NX_Q14 { return 1 } 11 if v.max_x_q14 != 4 * NX_Q14 { return 2 } 12 13 // Player AABB at (3.5, 3.5, 3.5) sized 0.5 14 let player: *NxAabb = nx_aabb_new( 15 3 * NX_Q14 + NX_Q14 / 2 - NX_Q14 / 4, 16 3 * NX_Q14 + NX_Q14 / 2 - NX_Q14 / 4, 17 3 * NX_Q14 + NX_Q14 / 2 - NX_Q14 / 4, 18 3 * NX_Q14 + NX_Q14 / 2 + NX_Q14 / 4, 19 3 * NX_Q14 + NX_Q14 / 2 + NX_Q14 / 4, 20 3 * NX_Q14 + NX_Q14 / 2 + NX_Q14 / 4) 21 // Player center is at (3.5, 3.5, 3.5); voxel is (3,3,3)..(4,4,4) 22 // -> overlap 23 if nx_aabb_overlap(player, v) != NX_AABB_OVERLAP { return 3 } 24 25 // Translate player to (10, 10, 10) -> no overlap with voxel @ 3,3,3 26 nx_aabb_translate(player, 7 * NX_Q14, 7 * NX_Q14, 7 * NX_Q14) 27 if nx_aabb_overlap(player, v) != NX_AABB_NO_OVERLAP { return 4 } 28 29 // Contains point: voxel @ (3,3,3); test points 3.5/3.5/3.5 in vs 10/10/10 out 30 if nx_aabb_contains_point(v, 31 3 * NX_Q14 + NX_Q14 / 2, 32 3 * NX_Q14 + NX_Q14 / 2, 33 3 * NX_Q14 + NX_Q14 / 2) != 1 { return 5 } 34 if nx_aabb_contains_point(v, 10 * NX_Q14, 10 * NX_Q14, 10 * NX_Q14) != 0 { return 6 } 35 36 // Ray-AABB: ray from (0,3.5,3.5) heading +X at unit speed 37 // Should hit voxel @ (3,3,3)..(4,4,4) at t = 3.0 (Q14 = 49152) 38 let out_t: *i64 = (sys_mmap(8)) as *i64 39 let hit: nx_int = nx_aabb_intersect_ray(v, 40 0, 3 * NX_Q14 + NX_Q14 / 2, 3 * NX_Q14 + NX_Q14 / 2, 41 NX_Q14, 0, 0, 42 100 * NX_Q14, 43 out_t) 44 if hit != 1 { return 7 } 45 if out_t[0] < 49000 { return 8 } 46 if out_t[0] > 49300 { return 9 } 47 48 // Ray that misses (heading +Y from x=0, y=0) 49 let no_hit: nx_int = nx_aabb_intersect_ray(v, 50 0, 0, 0, 51 0, NX_Q14, 0, 52 100 * NX_Q14, 53 out_t) 54 if no_hit != 0 { return 10 } 55 56 // Ray that hits but past max_t -> miss 57 let past_max: nx_int = nx_aabb_intersect_ray(v, 58 0, 3 * NX_Q14 + NX_Q14 / 2, 3 * NX_Q14 + NX_Q14 / 2, 59 NX_Q14, 0, 0, 60 1 * NX_Q14, 61 out_t) 62 if past_max != 0 { return 11 } 63 64 // Ray inside AABB (origin contained) hits at t=0 65 let inside: *NxAabb = nx_aabb_new(0, 0, 0, 2 * NX_Q14, 2 * NX_Q14, 2 * NX_Q14) 66 let hit_inside: nx_int = nx_aabb_intersect_ray(inside, 67 NX_Q14, NX_Q14, NX_Q14, // origin (1,1,1) inside 68 NX_Q14, 0, 0, 69 10 * NX_Q14, out_t) 70 if hit_inside != 1 { return 12 } 71 72 return 0 73}