-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBoxCollider.cpp
More file actions
114 lines (100 loc) · 3.57 KB
/
BoxCollider.cpp
File metadata and controls
114 lines (100 loc) · 3.57 KB
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include "BoxCollider.h"
#include <iostream>
#include <cstdlib>
BoxCollider::BoxCollider(float x, float y, float z, float Height, float Width, float Depth)
:ColliderVertex(glm::vec3(x, y, z)),
ColliderScale(glm::vec3(Height, Width, Depth))
{}
CollisionResult BoxCollider::CheckCollision(Raycast ray)
{
CollisionResult result;
//easy guards
if(ray.GetStartingPos().x > ColliderVertex.x + ColliderScale.x && ray.GetDirection().x >= 0)
return result;
if(ray.GetStartingPos().x < ColliderVertex.x && ray.GetDirection().x >= 0)
return result;
if(ray.GetStartingPos().y > ColliderVertex.y + ColliderScale.y && ray.GetDirection().y >= 0)
return result;
if(ray.GetStartingPos().y < ColliderVertex.y && ray.GetDirection().y <= 0)
return result;
if(ray.GetStartingPos().z > ColliderVertex.z + ColliderScale.z && ray.GetDirection().z >= 0)
return result;
if(ray.GetStartingPos().z < ColliderVertex.z && ray.GetDirection().z <= 0)
return result;
//some nightmare shi (shoul've looked up a youtube video for dis)
if(
!(
(
((ray.GetStartingPos().y - ColliderVertex.y)/ray.GetDirection().y *
ray.GetDirection().x) + ray.GetStartingPos().x >= ColliderVertex.x + ColliderScale.x
||
((ray.GetStartingPos().y - ColliderVertex.y)/ray.GetDirection().y *
ray.GetDirection().x) + ray.GetStartingPos().x <= ColliderVertex.x
)
&&
(
((ray.GetStartingPos().x - ColliderVertex.x)/ray.GetDirection().x *
ray.GetDirection().y) + ray.GetStartingPos().y >= ColliderVertex.y + ColliderScale.y
||
((ray.GetStartingPos().x - ColliderVertex.x)/ray.GetDirection().x *
ray.GetDirection().y) + ray.GetStartingPos().y <= ColliderVertex.y
)
&&
(
((ray.GetStartingPos().x - ColliderVertex.x)/ray.GetDirection().x *
ray.GetDirection().z) + ray.GetStartingPos().z >= ColliderVertex.z + ColliderScale.z
||
((ray.GetStartingPos().x - ColliderVertex.x)/ray.GetDirection().x *
ray.GetDirection().z) + ray.GetStartingPos().z <= ColliderVertex.z
)
)
)
return result;
result.collided = true;
return result;
}
CollisionResult BoxCollider::CheckCollision(float x, float y, float z)
{
CollisionResult result;
result.collided = (
x < ColliderVertex.x + ColliderScale.x &&
x > ColliderVertex.x &&
y < ColliderVertex.y + ColliderScale.y &&
y > ColliderVertex.y &&
z < ColliderVertex.z + ColliderScale.z &&
z > ColliderVertex.z
);
if (result.collided) {
float left = x - ColliderVertex.x;
float right = (ColliderVertex.x + ColliderScale.x) - x;
float top = y - ColliderVertex.y;
float bottom = (ColliderVertex.y + ColliderScale.y) - y;
float front = z - ColliderVertex.z;
float back = (ColliderVertex.z + ColliderScale.z) - z;
float minX = std::min(left, right);
float minY = std::min(top, bottom);
float minZ = std::min(front, back);
// Find the axis with the minimum penetration
if (minX <= minY && minX <= minZ) {
result.pushX = (left < right) ? -left : right;
result.pushY = 0.0f;
result.pushZ = 0.0f;
}
else if (minY <= minX && minY <= minZ) {
result.pushX = 0.0f;
result.pushY = 0.0f;
result.pushZ = (top < bottom) ? -top : bottom;
}
else {
result.pushX = 0.0f;
result.pushY = (front < back) ? -front : back;
result.pushZ = 0.0f;
}
}
else {
result.pushX = 0.0f;
result.pushY = 0.0f;
result.pushZ = 0.0f;
}
return result;
}