A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
ObjectCollisionConvexHull.cc
1#include "ObjectCollisionConvexHull.hh"
2
3namespace Kinoko::Field {
4
10ObjectCollisionConvexHull::ObjectCollisionConvexHull(const std::span<const EGG::Vector3f> &points)
11 : m_points(points), m_initRadius(70.0f), m_worldPoints(points.size()), m_worldRadius(70.0f) {
12 ASSERT(points.size() < 0x100);
13}
14
16ObjectCollisionConvexHull::~ObjectCollisionConvexHull() = default;
17
19void ObjectCollisionConvexHull::transform(const EGG::Matrix34f &mat, const EGG::Vector3f &scale) {
20 if (scale.x != 1.0f) {
21 EGG::Matrix34f temp;
22 temp.makeS(EGG::Vector3f(scale.x, scale.x, scale.x));
23 temp = mat.multiplyTo(temp);
24
25 for (size_t i = 0; i < m_points.size(); ++i) {
26 m_worldPoints[i] = temp.ps_multVector(m_points[i]);
27 }
28 } else {
29 for (size_t i = 0; i < m_points.size(); ++i) {
30 m_worldPoints[i] = mat.ps_multVector(m_points[i]);
31 }
32 }
33}
34
36void ObjectCollisionConvexHull::transform(const EGG::Matrix34f &mat, const EGG::Vector3f &scale,
37 const EGG::Vector3f &speed) {
38 m_translation = speed;
39
40 if (scale.x == 0.0f) {
41 for (size_t i = 0; i < m_points.size(); ++i) {
42 m_worldPoints[i] = mat.ps_multVector(m_points[i]);
43 }
44 } else {
45 EGG::Matrix34f temp;
46 temp.makeS(EGG::Vector3f(scale.x, scale.x, scale.x));
47 temp = mat.multiplyTo(temp);
48
49 for (size_t i = 0; i < m_points.size(); ++i) {
50 m_worldPoints[i] = temp.ps_multVector(m_points[i]);
51 }
52 }
53}
54
56const EGG::Vector3f &ObjectCollisionConvexHull::getSupport(const EGG::Vector3f &v) const {
57 const EGG::Vector3f *result = &m_worldPoints[0];
58 f32 maxDot = v.dot(*result);
59
60 for (size_t i = 1; i < m_worldPoints.size(); ++i) {
61 const auto &iter = m_worldPoints[i];
62 f32 iterDot = v.dot(iter);
63
64 if (maxDot < iterDot) {
65 result = &iter;
66 maxDot = iterDot;
67 }
68 }
69
70 return *result;
71}
72
79ObjectCollisionConvexHull::ObjectCollisionConvexHull(size_t count) : m_initRadius(70.0f) {
80 ASSERT(count < 0x100);
81
82 m_worldRadius = 70.0f;
83
84 m_points = owning_span<EGG::Vector3f>(count);
85 m_worldPoints = owning_span<EGG::Vector3f>(count);
86}
87
88} // namespace Kinoko::Field
A 3 x 4 matrix.
Definition Matrix.hh:10
constexpr Vector3f ps_multVector(const Vector3f &vec) const
Paired-singles impl. of multVector.
Definition Matrix.hh:273
constexpr Matrix34f multiplyTo(const Matrix34f &rhs) const
Multiplies two matrices.
Definition Matrix.hh:238
ObjectCollisionConvexHull(const std::span< const EGG::Vector3f > &points)
Creates a convex hull with the provided points.
A contiguous storage container that manages the lifecycle of a buffer of a given size.
Definition Types.hh:29
Pertains to collision.
A 3D float vector.
Definition Vector.hh:107