A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
ObjectBeltCurveA.cc
1#include "ObjectBeltCurveA.hh"
2
3namespace Field {
4
6ObjectBeltCurveA::ObjectBeltCurveA(const System::MapdataGeoObj &params) : ObjectBelt(params) {
7 constexpr EGG::Vector3f INITIAL_ROT = EGG::Vector3f(0.0f, 1.5707964f, 0.0f);
8
9 m_startForward = params.setting(1) == 1;
10 m_dirChange1Frame = params.setting(2) * 60;
11 m_dirChange2Frame = params.setting(3) * 60;
12 m_initMat.makeR(INITIAL_ROT);
13}
14
16ObjectBeltCurveA::~ObjectBeltCurveA() = default;
17
19EGG::Vector3f ObjectBeltCurveA::calcRoadVelocity(u32 variant, const EGG::Vector3f &pos,
20 u32 timeOffset) const {
21 EGG::Vector3f posDelta = pos - m_pos;
22 posDelta.y = 0.0f;
23
24 EGG::Vector3f dir = m_initMat.ps_multVector(posDelta);
25 bool forward;
26
27 if (timeOffset <= m_dirChange1Frame) {
28 forward = m_startForward;
29 } else if (timeOffset <= m_dirChange2Frame) {
30 forward = !m_startForward;
31 } else {
32 forward = m_startForward;
33 }
34
35 if (variant == 4) {
36 f32 sign = forward ? 1.0f : -1.0f;
37 return dir * sign * calcDirSwitchVelocity(timeOffset);
38 } else if (variant == 5) {
39 f32 sign = forward ? -1.0f : 1.0f;
40 return dir * sign * calcDirSwitchVelocity(timeOffset);
41 } else {
42 return EGG::Vector3f::zero;
43 }
44}
45
47f32 ObjectBeltCurveA::calcDirSwitchVelocity(u32 t) const {
48 u32 change1Delta = EGG::Mathf::abs(static_cast<f32>(t - m_dirChange1Frame));
49 u32 change2Delta = EGG::Mathf::abs(static_cast<f32>(t - m_dirChange2Frame));
50 u32 delta = std::min(change1Delta, change2Delta);
51
52 if (static_cast<f32>(delta) > 60.0f) {
53 return 0.006f;
54 } else {
55 return 0.006f * static_cast<f32>(delta) / 60.0f;
56 }
57}
58
59} // namespace Field
Pertains to collision.
A 3D float vector.
Definition Vector.hh:87