A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
ObjectKinoko.cc
1#include "ObjectKinoko.hh"
2
3namespace Kinoko::Field {
4
6ObjectKinoko::ObjectKinoko(const System::MapdataGeoObj &params)
7 : ObjectKCL(params), m_objPos(pos()), m_objRot(rot()) {
8 m_type = static_cast<KinokoType>(params.setting(0));
9
10 m_restFrame = 0;
11 m_pulseFrame = 1; // (-1*-1) % PULSE_DURATION;
12 m_pulseFalloff = 0.1f;
13}
14
16ObjectKinoko::~ObjectKinoko() = default;
17
19void ObjectKinoko::calc() {
20 constexpr s16 REST_DURATION = 10;
21 constexpr s16 PULSE_DURATION = 40;
22 constexpr f32 PULSE_SCALE = 0.0008f;
23 constexpr f32 PULSE_FREQ = 6.0f * F_PI / 40.0f;
24
25 if (m_restFrame == 0) {
26 ++m_pulseFrame;
27 }
28 if (m_pulseFrame == PULSE_DURATION) {
29 ++m_restFrame;
30 }
31 if (m_restFrame > REST_DURATION) {
32 m_restFrame = 0;
33 }
34 if (m_pulseFrame > PULSE_DURATION) {
35 m_pulseFrame = 0;
36 }
37
38 m_pulseFalloff = PULSE_SCALE * static_cast<f32>(PULSE_DURATION - m_pulseFrame);
39 setScale(m_pulseFalloff * EGG::Mathf::sin(PULSE_FREQ * static_cast<f32>(m_pulseFrame)) + 1.0f);
40 calcOscillation();
41}
42
44ObjectKinokoUd::ObjectKinokoUd(const System::MapdataGeoObj &params) : ObjectKinoko(params) {
45 m_waitFrame = 0;
46 m_oscFrame = params.setting(3);
47 m_waitDuration = params.setting(4);
48 m_amplitude = params.setting(1);
49 m_period = std::max<u16>(params.setting(2), 2);
50 m_angFreq = F_TAU / static_cast<f32>(m_period);
51}
52
54ObjectKinokoUd::~ObjectKinokoUd() = default;
55
57void ObjectKinokoUd::calcOscillation() {
58 f32 posY = m_objPos.y +
59 static_cast<f32>(m_amplitude) *
60 (EGG::Mathf::cos(m_angFreq * static_cast<f32>(m_oscFrame)) + 1.0f) * 0.5f;
61 setPos(EGG::Vector3f(pos().x, posY, pos().z));
62
63 if (m_waitFrame == 0) {
64 ++m_oscFrame;
65 }
66 if (m_oscFrame == (m_period / 2)) {
67 ++m_waitFrame;
68 }
69 if (m_waitFrame > m_waitDuration) {
70 m_waitFrame = 0;
71 }
72 if (m_oscFrame > m_period) {
73 m_oscFrame = 0;
74 }
75}
76
78ObjectKinokoBend::ObjectKinokoBend(const System::MapdataGeoObj &params) : ObjectKinoko(params) {
79 m_currentFrame = params.setting(3);
80 m_amplitude = static_cast<f32>(params.setting(1)) * DEG2RAD;
81 m_period = std::max<u16>(params.setting(2), 2);
82 m_angFreq = F_TAU / static_cast<f32>(m_period);
83}
84
86ObjectKinokoBend::~ObjectKinokoBend() = default;
87
89void ObjectKinokoBend::calcOscillation() {
90 const f32 s = EGG::Mathf::sin(m_angFreq * static_cast<f32>(m_currentFrame));
91 EGG::Vector3f rot = m_objRot + (EGG::Vector3f::ez * s) * m_amplitude;
92
93 calcTransform();
94 setRot(transform().multVector33(rot));
95
96 if (++m_currentFrame >= m_period) {
97 m_currentFrame = 0;
98 }
99}
100
101ObjectKinokoNm::ObjectKinokoNm(const System::MapdataGeoObj &params) : ObjectKCL(params) {
102 m_type = static_cast<KinokoType>(params.setting(0));
103}
104
106ObjectKinokoNm::~ObjectKinokoNm() = default;
107
108} // namespace Kinoko::Field
Pertains to collision.