A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
ObjectKoopaFigure64.cc
1#include "game/field/obj/ObjectKoopaFigure64.hh"
2
3#include "game/field/ObjectDirector.hh"
4
5#include "game/system/RaceManager.hh"
6
7namespace Field {
8
10ObjectKoopaFigure64::ObjectKoopaFigure64(const System::MapdataGeoObj &params)
11 : ObjectCollidable(params), m_isBigStatue(params.setting(1) == 1),
12 m_startDelay(static_cast<u32>(params.setting(2))) {}
13
15ObjectKoopaFigure64::~ObjectKoopaFigure64() = default;
16
18void ObjectKoopaFigure64::init() {
19 constexpr f32 BIG_SCALE = 20.0f;
20
21 if (m_isBigStatue) {
22 const auto &flowTable = ObjectDirector::Instance()->flowTable();
23 const auto *collisionSet = flowTable.set(flowTable.slot(id()));
24 ASSERT(collisionSet);
25 s16 radius = parse<s16>(collisionSet->params.cylinder.radius);
26 resize(BIG_SCALE * static_cast<f32>(radius), 0.0f);
27 }
28
29 m_cycleFrame = FIRE_DURATION + COOLDOWN_DURATION;
30
31 if (m_isBigStatue) {
32 disableCollision();
33 }
34}
35
37void ObjectKoopaFigure64::calc() {
38 u32 timer = System::RaceManager::Instance()->timer();
39 if (timer < m_startDelay) {
40 return;
41 }
42
43 bool endOfCycle = CYCLE_DURATION == m_cycleFrame;
44 if (endOfCycle) {
45 m_cycleFrame = 0;
46
47 if (m_isBigStatue) {
48 enableCollision();
49 }
50 }
51
52 if (m_cycleFrame >= FIRE_DURATION && !endOfCycle && m_isBigStatue) {
53 disableCollision();
54 }
55
56 ++m_cycleFrame;
57}
58
60void ObjectKoopaFigure64::calcCollisionTransform() {
61 constexpr EGG::Vector3f FIRE_POS_OFFSET = EGG::Vector3f(0.0f, -280.0f, 4000.0f);
62
63 calcTransform();
64 EGG::Matrix34f rotMat = m_transform;
65 rotMat.setBase(3, EGG::Vector3f::zero);
66
67 EGG::Matrix34f targetMat = EGG::Matrix34f::ident;
68 targetMat.setBase(3, FIRE_POS_OFFSET);
69
70 EGG::Matrix34f posMat = EGG::Matrix34f::ident;
71 posMat.setBase(3, m_pos);
72
73 m_collision->transform(posMat.multiplyTo(rotMat.multiplyTo(targetMat)), m_scale);
74}
75
76} // namespace Field
A 3 x 4 matrix.
Definition Matrix.hh:8
Matrix34f multiplyTo(const Matrix34f &rhs) const
Multiplies two matrices.
Definition Matrix.cc:189
void setBase(size_t col, const Vector3f &base)
Sets one column of a matrix.
Definition Matrix.cc:181
Pertains to collision.
A 3D float vector.
Definition Vector.hh:88