A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
KartScale.cc
1#include "KartScale.hh"
2
3#include "game/kart/KartObjectManager.hh"
4
5namespace Kart {
6
8KartScale::KartScale(const KartParam::Stats &stats) {
9 reset();
10
11 for (u16 i = 0; i < 4; ++i) {
12 m_scaleTarget[i] = s_baseScaleTarget[i];
13
14 switch (i) {
15 case 1:
16 m_scaleTarget[i] = stats.shrinkScale;
17 break;
18 case 2:
19 m_scaleTarget[i] = stats.megaScale;
20 break;
21 default:
22 break;
23 }
24 }
25}
26
28KartScale::~KartScale() = default;
29
31void KartScale::reset() {
32 m_type = -1;
33 m_sizeScale = EGG::Vector3f::unit;
34 m_scaleTransformOffset.setZero();
35 m_scaleTransformSlope.setZero();
36 m_scaleAnmActive = false;
37 m_anmFrame = 0.0f;
38 m_crushState = CrushState::None;
39 m_calcCrush = false;
40 m_uncrushAnmFrame = 0.0f;
41 m_pressScale = EGG::Vector3f::unit;
42}
43
45void KartScale::calc() {
46 if (m_scaleAnmActive) {
47 const Abstract::g3d::ResAnmChr *scaleAnm;
48 if (m_type == 0) {
49 scaleAnm = KartObjectManager::ThunderScaleUpAnmChr();
50 } else if (m_type == 1) {
51 scaleAnm = KartObjectManager::ThunderScaleDownAnmChr();
52 } else {
53 PANIC("Invalid scale type");
54 }
55 ASSERT(scaleAnm);
56
57 auto anmResult = scaleAnm->getAnmResult(m_anmFrame, 0);
58 m_sizeScale = m_scaleTransformOffset + m_scaleTransformSlope * anmResult.scale();
59
60 m_anmFrame += 1.0f;
61 if (m_anmFrame > scaleAnm->frameCount()) {
62 m_scaleAnmActive = false;
63 m_sizeScale.set(m_scaleTarget[m_type]);
64 m_scaleTransformOffset.setZero();
65 m_scaleTransformSlope.setZero();
66 }
67 }
68
69 calcCrush();
70}
71
73void KartScale::startCrush() {
74 m_crushState = CrushState::Crush;
75 m_pressScale = EGG::Vector3f(1.0f, 1.0f, 1.0f);
76 m_uncrushAnmFrame = 0.0f;
77 m_calcCrush = true;
78}
79
81void KartScale::endCrush() {
82 m_crushState = CrushState::Uncrush;
83 m_pressScale = EGG::Vector3f(1.0f, CRUSH_SCALE, 1.0f);
84 m_uncrushAnmFrame = 0.0f;
85 m_calcCrush = true;
86}
87
89void KartScale::startShrink(s32 unk) {
90 m_type = unk > 0 ? 2 : 1;
91 m_anmFrame = 0.0f;
92 m_scaleAnmActive = true;
93 f32 tmp = m_scaleTarget[m_type];
94 m_scaleTransformSlope = (EGG::Vector3f(tmp, tmp, tmp) - m_sizeScale) /
95 (s_baseScaleTarget[m_type] - s_baseScaleStart[m_type]);
96 m_scaleTransformOffset = m_sizeScale - m_scaleTransformSlope * s_baseScaleStart[m_type];
97}
98
100void KartScale::endShrink(s32 unk) {
101 m_type = unk > 0 ? 3 : 0;
102 m_anmFrame = 0.0f;
103 m_scaleAnmActive = true;
104 f32 tmp = m_scaleTarget[m_type];
105 m_scaleTransformSlope = (EGG::Vector3f(tmp, tmp, tmp) - m_sizeScale) /
106 (s_baseScaleTarget[m_type] - s_baseScaleStart[m_type]);
107 m_scaleTransformOffset = m_sizeScale - m_scaleTransformSlope * s_baseScaleStart[m_type];
108}
109
111void KartScale::calcCrush() {
112 constexpr f32 SCALE_SPEED = 0.2f;
113
114 if (!m_calcCrush || m_crushState == CrushState::None) {
115 return;
116 }
117
118 if (m_crushState == CrushState::Crush) {
119 m_pressScale.y -= SCALE_SPEED;
120 if (m_pressScale.y < CRUSH_SCALE) {
121 m_pressScale.y = CRUSH_SCALE;
122 m_calcCrush = false;
123 }
124 } else {
125 m_pressScale = getAnmScale(m_uncrushAnmFrame);
126
127 const auto *scaleAnm = KartObjectManager::PressScaleUpAnmChr();
128 ASSERT(scaleAnm);
129
130 if (++m_uncrushAnmFrame > static_cast<f32>(scaleAnm->frameCount())) {
131 m_calcCrush = false;
132 }
133 }
134}
135
137EGG::Vector3f KartScale::getAnmScale(f32 frame) const {
138 const auto *scaleAnm = KartObjectManager::PressScaleUpAnmChr();
139 ASSERT(scaleAnm);
140 return scaleAnm->getAnmResult(frame, 0).scale();
141}
142
143} // namespace Kart
Represents the CHR0 file format, which pertains to model movement animations.
Definition ResAnmChr.hh:48
bool m_calcCrush
Set while crush scaling is occurring.
Definition KartScale.hh:49
CrushState m_crushState
Specifies the current crush/uncrush state.
Definition KartScale.hh:48
f32 m_uncrushAnmFrame
Current frame of the unsquish animation.
Definition KartScale.hh:50
Pertains to kart-related functionality.
A 3D float vector.
Definition Vector.hh:88