-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmovement.c
40 lines (35 loc) · 945 Bytes
/
movement.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include "movement.h"
bool try_move(AABB * aabb, vec3_t diff, Map * map, vec3_t * collision_normal)
{
/* Calculate the length only once */
float diff_l = v3_length(diff);
bool enabled_faces[6] = { false };
/* Do not check for collitions if we're not going there */
if (diff.x > 0) {
enabled_faces[FACE_RIGHT] = true;
} else if (diff.x < 0) {
enabled_faces[FACE_LEFT] = true;
}
if (diff.y > 0) {
enabled_faces[FACE_UP] = true;
} else if (diff.y < 0) {
enabled_faces[FACE_DOWN] = true;
}
if (diff.z > 0) {
enabled_faces[FACE_FRONT] = true;
} else if (diff.z < 0) {
enabled_faces[FACE_BACK] = true;
}
do {
AABB translated = translated_AABB(aabb, diff);
if (!map_collides(&translated, map, collision_normal, enabled_faces)) {
*aabb = translated;
return true;
} else {
/* try again by moving only halfway */
diff = v3_divs(diff, 2.f);
diff_l /= 2.f;
}
} while (diff_l > 0.001);
return false;
}