A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
ObjectCollisionBox.cc
1#include "ObjectCollisionBox.hh"
2
3namespace Field {
4
6ObjectCollisionBox::ObjectCollisionBox(f32 x, f32 y, f32 z, const EGG::Vector3f &center)
7 : ObjectCollisionConvexHull(8), m_dimensions(x, y, z), m_center(center),
8 m_scale(EGG::Vector3f::unit) {
9 f32 radius = getBoundingRadius();
10 EGG::Vector3f scaledDims = m_dimensions - EGG::Vector3f(radius, radius, radius);
11
12 m_points[0].x = m_center.x + scaledDims.x;
13 m_points[0].y = m_center.y + 2.0f * scaledDims.y;
14 m_points[0].z = m_center.z + scaledDims.z;
15
16 m_points[1].x = m_center.x + scaledDims.x;
17 m_points[1].y = m_center.y + 2.0f * scaledDims.y;
18 m_points[1].z = m_center.z - scaledDims.z;
19
20 m_points[2].x = m_center.x + scaledDims.x;
21 m_points[2].y = m_center.y - 2.0f * scaledDims.y;
22 m_points[2].z = m_center.z + scaledDims.z;
23
24 m_points[3].x = m_center.x - scaledDims.x;
25 m_points[3].y = m_center.y + 2.0f * scaledDims.y;
26 m_points[3].z = m_center.z + scaledDims.z;
27
28 m_points[4].x = m_center.x + scaledDims.x;
29 m_points[4].y = m_center.y - 2.0f * scaledDims.y;
30 m_points[4].z = m_center.z - scaledDims.z;
31
32 m_points[5].x = m_center.x - scaledDims.x;
33 m_points[5].y = m_center.y + 2.0f * scaledDims.y;
34 m_points[5].z = m_center.z - scaledDims.z;
35
36 m_points[6].x = m_center.x - scaledDims.x;
37 m_points[6].y = m_center.y - 2.0f * scaledDims.y;
38 m_points[6].z = m_center.z + scaledDims.z;
39
40 m_points[7].x = m_center.x - scaledDims.x;
41 m_points[7].y = m_center.y - 2.0f * scaledDims.y;
42 m_points[7].z = m_center.z - scaledDims.z;
43}
44
46ObjectCollisionBox::~ObjectCollisionBox() = default;
47
49void ObjectCollisionBox::transform(const EGG::Matrix34f &mat, const EGG::Vector3f &scale) {
50 f32 radius = getBoundingRadius();
51 m_scale = scale;
52
53 EGG::Vector3f scaledDims = (m_dimensions * m_scale) - EGG::Vector3f(radius, radius, radius);
54
55 m_points[0].x = m_center.x + scaledDims.x;
56 m_points[0].y = m_center.y + 2.0f * scaledDims.y;
57 m_points[0].z = m_center.z + scaledDims.z;
58
59 m_points[1].x = m_center.x + scaledDims.x;
60 m_points[1].y = m_center.y + 2.0f * scaledDims.y;
61 m_points[1].z = m_center.z - scaledDims.z;
62
63 m_points[2].x = m_center.x + scaledDims.x;
64 m_points[2].y = m_center.y - 2.0f * scaledDims.y;
65 m_points[2].z = m_center.z + scaledDims.z;
66
67 m_points[3].x = m_center.x - scaledDims.x;
68 m_points[3].y = m_center.y + 2.0f * scaledDims.y;
69 m_points[3].z = m_center.z + scaledDims.z;
70
71 m_points[4].x = m_center.x + scaledDims.x;
72 m_points[4].y = m_center.y - 2.0f * scaledDims.y;
73 m_points[4].z = m_center.z - scaledDims.z;
74
75 m_points[5].x = m_center.x - scaledDims.x;
76 m_points[5].y = m_center.y + 2.0f * scaledDims.y;
77 m_points[5].z = m_center.z - scaledDims.z;
78
79 m_points[6].x = m_center.x - scaledDims.x;
80 m_points[6].y = m_center.y - 2.0f * scaledDims.y;
81 m_points[6].z = m_center.z + scaledDims.z;
82
83 m_points[7].x = m_center.x - scaledDims.x;
84 m_points[7].y = m_center.y - 2.0f * scaledDims.y;
85 m_points[7].z = m_center.z - scaledDims.z;
86
87 ObjectCollisionConvexHull::transform(mat, EGG::Vector3f::unit);
88}
89
91void ObjectCollisionBox::transform(const EGG::Matrix34f &mat, const EGG::Vector3f &scale,
92 const EGG::Vector3f &speed) {
93 f32 radius = getBoundingRadius();
94 m_scale = scale;
95
96 EGG::Vector3f scaledDims = (m_dimensions * m_scale) - EGG::Vector3f(radius, radius, radius);
97
98 m_points[0].x = m_center.x + scaledDims.x;
99 m_points[0].y = m_center.y + 2.0f * scaledDims.y;
100 m_points[0].z = m_center.z + scaledDims.z;
101
102 m_points[1].x = m_center.x + scaledDims.x;
103 m_points[1].y = m_center.y + 2.0f * scaledDims.y;
104 m_points[1].z = m_center.z - scaledDims.z;
105
106 m_points[2].x = m_center.x + scaledDims.x;
107 m_points[2].y = m_center.y - 2.0f * scaledDims.y;
108 m_points[2].z = m_center.z + scaledDims.z;
109
110 m_points[3].x = m_center.x - scaledDims.x;
111 m_points[3].y = m_center.y + 2.0f * scaledDims.y;
112 m_points[3].z = m_center.z + scaledDims.z;
113
114 m_points[4].x = m_center.x + scaledDims.x;
115 m_points[4].y = m_center.y - 2.0f * scaledDims.y;
116 m_points[4].z = m_center.z - scaledDims.z;
117
118 m_points[5].x = m_center.x - scaledDims.x;
119 m_points[5].y = m_center.y + 2.0f * scaledDims.y;
120 m_points[5].z = m_center.z - scaledDims.z;
121
122 m_points[6].x = m_center.x - scaledDims.x;
123 m_points[6].y = m_center.y - 2.0f * scaledDims.y;
124 m_points[6].z = m_center.z + scaledDims.z;
125
126 m_points[7].x = m_center.x - scaledDims.x;
127 m_points[7].y = m_center.y - 2.0f * scaledDims.y;
128 m_points[7].z = m_center.z - scaledDims.z;
129
130 ObjectCollisionConvexHull::transform(mat, EGG::Vector3f::unit, speed);
131}
132
133} // namespace Field
A 3 x 4 matrix.
Definition Matrix.hh:8
EGG core library.
Definition Archive.cc:6
Pertains to collision.
A 3D float vector.
Definition Vector.hh:88