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}