Kinoko
A reimplementation of Mario Kart Wii's physics engine in C++
Toggle main menu visibility
Loading...
Searching...
No Matches
ObjectCollisionConvexHull.cc
1
#include "ObjectCollisionConvexHull.hh"
2
3
namespace
Kinoko::Field
{
4
10
ObjectCollisionConvexHull::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
16
ObjectCollisionConvexHull::~ObjectCollisionConvexHull() =
default
;
17
19
void
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
36
void
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
56
const
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
79
ObjectCollisionConvexHull::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
Kinoko::EGG::Matrix34f
A 3 x 4 matrix.
Definition
Matrix.hh:10
Kinoko::EGG::Matrix34f::ps_multVector
constexpr Vector3f ps_multVector(const Vector3f &vec) const
Paired-singles impl. of multVector.
Definition
Matrix.hh:273
Kinoko::EGG::Matrix34f::multiplyTo
constexpr Matrix34f multiplyTo(const Matrix34f &rhs) const
Multiplies two matrices.
Definition
Matrix.hh:238
Kinoko::Field::ObjectCollisionConvexHull::ObjectCollisionConvexHull
ObjectCollisionConvexHull(const std::span< const EGG::Vector3f > &points)
Creates a convex hull with the provided points.
Definition
ObjectCollisionConvexHull.cc:10
Kinoko::owning_span
A contiguous storage container that manages the lifecycle of a buffer of a given size.
Definition
Types.hh:31
Kinoko::Field
Pertains to collision.
Definition
BoxColManager.cc:10
Kinoko::EGG::Vector3f
A 3D float vector.
Definition
Vector.hh:107
game
field
ObjectCollisionConvexHull.cc
Made by
Malleo
. Logo by
vabold
. Website generated by
Doxygen
1.17.0