A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
ObjectCollisionConvexHull.cc
1#include "ObjectCollisionConvexHull.hh"
2
3namespace Field {
4
10ObjectCollisionConvexHull::ObjectCollisionConvexHull(const std::span<const EGG::Vector3f> &points)
11 : ObjectCollisionConvexHull(points.size()) {
12 for (size_t i = 0; i < points.size(); ++i) {
13 m_points[i] = points[i];
14 }
15}
16
18ObjectCollisionConvexHull::~ObjectCollisionConvexHull() {
19 delete[] m_points.data();
20 delete[] m_worldPoints.data();
21}
22
24void ObjectCollisionConvexHull::transform(const EGG::Matrix34f &mat, const EGG::Vector3f &scale) {
25 if (scale.x != 1.0f) {
26 EGG::Matrix34f temp;
27 temp.makeS(EGG::Vector3f(scale.x, scale.x, scale.x));
28 temp = mat.multiplyTo(temp);
29
30 for (size_t i = 0; i < m_points.size(); ++i) {
31 m_worldPoints[i] = temp.ps_multVector(m_points[i]);
32 }
33 } else {
34 for (size_t i = 0; i < m_points.size(); ++i) {
35 m_worldPoints[i] = mat.ps_multVector(m_points[i]);
36 }
37 }
38}
39
41void ObjectCollisionConvexHull::transform(const EGG::Matrix34f &mat, const EGG::Vector3f &scale,
42 const EGG::Vector3f &speed) {
43 m_translation = speed;
44
45 if (scale.x == 0.0f) {
46 for (size_t i = 0; i < m_points.size(); ++i) {
47 m_worldPoints[i] = mat.ps_multVector(m_points[i]);
48 }
49 } else {
50 EGG::Matrix34f temp;
51 temp.makeS(EGG::Vector3f(scale.x, scale.x, scale.x));
52 temp = mat.multiplyTo(temp);
53
54 for (size_t i = 0; i < m_points.size(); ++i) {
55 m_worldPoints[i] = temp.ps_multVector(m_points[i]);
56 }
57 }
58}
59
61const EGG::Vector3f &ObjectCollisionConvexHull::getSupport(const EGG::Vector3f &v) const {
62 const EGG::Vector3f *result = &m_worldPoints[0];
63 f32 maxDot = v.dot(*result);
64
65 for (size_t i = 1; i < m_worldPoints.size(); ++i) {
66 const auto &iter = m_worldPoints[i];
67 f32 iterDot = v.dot(iter);
68
69 if (maxDot < iterDot) {
70 result = &iter;
71 maxDot = iterDot;
72 }
73 }
74
75 return *result;
76}
77
85 ASSERT(count < 0x100);
86
87 m_worldRadius = 70.0f;
88
89 m_points = std::span<EGG::Vector3f>(new EGG::Vector3f[count], count);
90 m_worldPoints = std::span<EGG::Vector3f>(new EGG::Vector3f[count], count);
91}
92
93} // namespace Field
A 3 x 4 matrix.
Definition Matrix.hh:8
Matrix34f multiplyTo(const Matrix34f &rhs) const
Multiplies two matrices.
Definition Matrix.cc:189
Vector3f ps_multVector(const Vector3f &vec) const
Paired-singles impl. of multVector.
Definition Matrix.cc:224
Smallest convex shape that encloses a given set of points.
ObjectCollisionConvexHull(const std::span< const EGG::Vector3f > &points)
Creates a convex hull with the provided points.
Pertains to collision.
A 3D float vector.
Definition Vector.hh:88
f32 dot(const Vector3f &rhs) const
The dot product between two vectors.
Definition Vector.hh:187