A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
ObjectPenguin.cc
1#include "ObjectPenguin.hh"
2
3namespace Field {
4
6ObjectPenguin::ObjectPenguin(const System::MapdataGeoObj &params) : ObjectCollidable(params) {}
7
9ObjectPenguin::~ObjectPenguin() = default;
10
12void ObjectPenguin::init() {
13 m_railInterpolator->init(0.0f, 0);
14 m_state = State::Walk;
15 m_basis = EGG::Vector3f::ez;
16}
17
19void ObjectPenguin::calcRot() {
20 constexpr f32 INTERP_RATE = 0.2f;
21
22 m_basis = Interpolate(INTERP_RATE, m_basis, m_railInterpolator->curTangentDir());
23 m_basis.normalise();
24 setMatrixFromOrthonormalBasisAndPos(m_basis);
25}
26
28void ObjectPenguin::enterWalk() {
29 m_state = State::Walk;
30 calcTransform();
31 m_rot = m_transform.base(2);
32}
33
35ObjectPenguinS::ObjectPenguinS(const System::MapdataGeoObj &params) : ObjectPenguin(params) {}
36
38ObjectPenguinS::~ObjectPenguinS() = default;
39
41void ObjectPenguinS::init() {
42 m_anmTimer = 0;
43 m_railInterpolator->init(0.0f, 0);
44 m_basis = m_railInterpolator->curTangentDir();
45 m_state = State::Walk;
46}
47
49void ObjectPenguinS::calc() {
50 switch (m_state) {
51 case State::Walk:
52 calcWalk();
53 break;
54 case State::Dive:
55 calcDive();
56 break;
57 case State::Slider:
58 calcSlider();
59 break;
60 case State::SliderSlow:
61 calcWalk();
62 calcTransform();
63 break;
64 case State::StandUp:
65 calcStandUp();
66 break;
67 }
68}
69
71void ObjectPenguinS::loadAnims() {
72 std::array<const char *, 4> names = {{
73 "walk",
74 "dive",
75 "slider",
76 "stand_up",
77 }};
78
79 std::array<Render::AnmType, 4> types = {{
80 Render::AnmType::Chr,
81 Render::AnmType::Chr,
82 Render::AnmType::Chr,
83 Render::AnmType::Chr,
84 }};
85
86 linkAnims(names, types);
87}
88
90void ObjectPenguinS::calcSlider() {
91 calcRail();
92 calcPos();
93 calcRot();
94
95 if (--m_anmTimer == 0) {
96 m_state = State::SliderSlow;
97 }
98}
99
101void ObjectPenguinS::calcStandUp() {
102 calcRail();
103 calcPos();
104 calcRot();
105
106 if (--m_anmTimer == 0) {
107 enterWalk();
108 }
109}
110
112void ObjectPenguinS::calcRail() {
113 if (m_railInterpolator->calc() != RailInterpolator::Status::SegmentEnd) {
114 return;
115 }
116
117 const auto &curPoint = m_railInterpolator->curPoint();
118 u16 setting = curPoint.setting[0];
119
120 if (setting == 0 && m_state == State::SliderSlow) {
121 auto *anmMgr = m_drawMdl->anmMgr();
122 anmMgr->playAnim(0.0f, 1.0f, 3);
123 m_state = State::StandUp;
124 m_anmTimer = anmMgr->activeAnim(Render::AnmType::Chr)->frameCount();
125 } else if (setting == 1 && m_state == State::Walk) {
126 auto *anmMgr = m_drawMdl->anmMgr();
127 anmMgr->playAnim(0.0f, 1.0f, 1);
128 m_state = State::Slider;
129 m_anmTimer = anmMgr->activeAnim(Render::AnmType::Chr)->frameCount();
130 } else if (setting == 2 && m_state == State::Walk) {
131 m_state = State::Dive;
132 }
133
134 m_railInterpolator->setCurrVel(static_cast<f32>(curPoint.setting[1]));
135}
136
137} // namespace Field
Pertains to collision.