A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
ObjectCollisionSphere.cc
1#include "ObjectCollisionSphere.hh"
2
3namespace Field {
4
6ObjectCollisionSphere::ObjectCollisionSphere(f32 radius, const EGG::Vector3f &center)
7 : m_hasTranslation(false), m_radius(radius), m_pos(center), m_scaledRadius(radius),
8 m_scaledPos(center), m_worldPos(center) {}
9
11ObjectCollisionSphere::~ObjectCollisionSphere() = default;
12
14void ObjectCollisionSphere::transform(const EGG::Matrix34f &mat, const EGG::Vector3f &scale) {
15 m_hasTranslation = false;
16
17 if (scale.x != 1.0f) {
18 m_scaledPos = m_pos * scale.x;
19 m_scaledRadius = m_radius * scale.x;
20 }
21
22 m_worldPos = mat.multVector(m_scaledPos);
23}
24
26void ObjectCollisionSphere::transform(const EGG::Matrix34f &mat, const EGG::Vector3f &scale,
27 const EGG::Vector3f &speed) {
28 m_hasTranslation = true;
29 m_translation = speed;
30
31 if (scale.x != 1.0f) {
32 m_scaledPos = m_pos * scale.x;
33 m_scaledRadius = m_radius * scale.x;
34 }
35
36 m_worldPos = mat.multVector(m_scaledPos);
37
38 m_center = m_worldPos - speed;
39}
40
42const EGG::Vector3f &ObjectCollisionSphere::getSupport(const EGG::Vector3f &v) const {
43 if (!m_hasTranslation) {
44 return m_worldPos;
45 }
46
47 return m_worldPos.dot(v) > m_center.dot(v) ? m_worldPos : m_center;
48}
49
50} // namespace Field
A 3 x 4 matrix.
Definition Matrix.hh:8
Vector3f multVector(const Vector3f &vec) const
Multiplies a vector by a matrix.
Definition Matrix.cc:225
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