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 const EGG::Vector3f &speed) {
26 m_translation = speed;
27
28 if (scale.x == 0.0f) {
29 for (size_t i = 0; i < m_points.size(); ++i) {
30 m_worldPoints[i] = mat.ps_multVector(m_points[i]);
31 }
32 } else {
33 EGG::Matrix34f temp;
34 temp.makeS(EGG::Vector3f(scale.x, scale.x, scale.x));
35 temp = mat.multiplyTo(temp);
36
37 for (size_t i = 0; i < m_points.size(); ++i) {
38 m_worldPoints[i] = temp.ps_multVector(m_points[i]);
39 }
40 }
41}
42
44const EGG::Vector3f &ObjectCollisionConvexHull::getSupport(const EGG::Vector3f &v) const {
45 const EGG::Vector3f *result = &m_worldPoints[0];
46 f32 maxDot = v.dot(*result);
47
48 for (size_t i = 1; i < m_worldPoints.size(); ++i) {
49 const auto &iter = m_worldPoints[i];
50 f32 iterDot = v.dot(iter);
51
52 if (maxDot < iterDot) {
53 result = &iter;
54 maxDot = iterDot;
55 }
56 }
57
58 return *result;
59}
60
68 ASSERT(count < 0x100);
69
70 m_worldRadius = 70.0f;
71
72 m_points = std::span<EGG::Vector3f>(new EGG::Vector3f[count], count);
73 m_worldPoints = std::span<EGG::Vector3f>(new EGG::Vector3f[count], count);
74}
75
76} // namespace Field
A 3 x 4 matrix.
Definition Matrix.hh:8
Matrix34f multiplyTo(const Matrix34f &rhs) const
Multiplies two matrices.
Definition Matrix.cc:173
Vector3f ps_multVector(const Vector3f &vec) const
Paired-singles impl. of multVector.
Definition Matrix.cc:208
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:87
f32 dot(const Vector3f &rhs) const
The dot product between two vectors.
Definition Vector.hh:186