A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
ObjectRock.cc
1#include "ObjectRock.hh"
2
3#include "game/field/CollisionDirector.hh"
4
5#include "game/kart/KartCollide.hh"
6
7namespace Kinoko::Field {
8
10ObjectRock::ObjectRock(const System::MapdataGeoObj &params) : ObjectCollidable(params) {}
11
13ObjectRock::~ObjectRock() = default;
14
16void ObjectRock::init() {
17 m_railInterpolator->init(0.0f, 0);
18 m_railInterpolator->setCurrVel(static_cast<f32>(m_mapObj->setting(2)));
19 m_railInterpolator->calc();
20
21 m_state = State::Tangible;
22 f32 posY = m_startYPos = m_railInterpolator->curPos().y;
23 setPos(EGG::Vector3f(pos().x, posY, pos().z));
24
25 EGG::Vector3f curTanDirNorm = m_railInterpolator->curTangentDir();
26 curTanDirNorm.normalise();
27 setMatrixTangentTo(EGG::Vector3f::ey, curTanDirNorm);
28 calcTransform();
29 m_angRad = 0.0f;
30 m_angSpd = INITIAL_ANGULAR_SPEED;
31 m_cooldownTimer = m_mapObj->setting(0);
32 m_colTranslate.x = 0.0f;
33 m_colTranslate.y = static_cast<f32>(m_mapObj->setting(3));
34 m_colTranslate.z = 0.0f;
35 calcTransform();
36}
37
39void ObjectRock::calc() {
40 switch (m_state) {
41 case State::Tangible:
42 calcTangible();
43 break;
44 case State::Intangible:
45 calcIntangible();
46 break;
47 }
48
49 --m_cooldownTimer;
50 EGG::Vector3f scaledTang =
51 m_railInterpolator->curTangentDir() * m_railInterpolator->getCurrVel();
52 m_colTranslate.x = scaledTang.x;
53 m_colTranslate.z = scaledTang.z;
54}
55
56// @addr{0x8076F768}
57void ObjectRock::calcTangible() {
58 auto railStatus = m_railInterpolator->calc();
59 if (railStatus == RailInterpolator::Status::ChangingDirection) {
60 breakRock();
61 }
62
63 const auto &railPos = m_railInterpolator->curPos();
64 setPos(EGG::Vector3f(railPos.x, pos().y, railPos.z));
65 m_colTranslate.y -= 2.0f;
66
67 addPos(m_colTranslate);
68
69 checkSphereFull();
70 calcTangibleSub();
71}
72
74void ObjectRock::calcIntangible() {
75 if (m_cooldownTimer < 0) {
76 m_state = State::Tangible;
77 m_angSpd = INITIAL_ANGULAR_SPEED;
78 m_colTranslate.y = static_cast<f32>(m_mapObj->setting(3));
79 m_cooldownTimer = m_mapObj->setting(1);
80 enableCollision();
81 }
82}
83
85void ObjectRock::calcTangibleSub() {
86 EGG::Vector3f tangDir = m_railInterpolator->curTangentDir();
87 tangDir.y = 0.0f;
88 tangDir.normalise();
89 EGG::Matrix34f m = OrthonormalBasis(tangDir);
90 m_angRad += m_angSpd * DEG2RAD;
91
92 EGG::Matrix34f mat(EGG::Matrix34f::ident);
93 EGG::Vector3f vRot(m_angRad, 0.0f, 0.0f);
94 mat.makeR(vRot);
95 mat = m.multiplyTo(mat);
96 mat.setBase(3, pos());
97 setTransform(mat);
98}
99
100// @addr {0x8076FA60}
101void ObjectRock::checkSphereFull() {
102 CollisionInfo info;
103
104 EGG::Vector3f offset(0.0f, -(scale().x * 240.0f - 50.0f), 0.0f);
105 EGG::Vector3f colPos = pos() + offset;
106
107 if (CollisionDirector::Instance()->checkSphereFull(50.0f, colPos, EGG::Vector3f::inf,
108 KCL_TYPE_FLOOR, &info, nullptr, 0)) {
109 m_colTranslate.y *= -0.3f;
110 m_angSpd = std::max(360.0f * static_cast<f32>(m_mapObj->setting(2)) /
111 (480.0f * scale().x * F_PI),
112 m_angSpd + 1.0f);
113 addPos(info.tangentOff);
114 }
115}
116
118void ObjectRock::breakRock() {
119 m_state = State::Intangible;
120 m_railInterpolator->init(0.0f, 0);
121 m_railInterpolator->setCurrVel(static_cast<f32>(m_mapObj->setting(2)));
122
123 setPos(EGG::Vector3f(pos().x, m_startYPos, pos().z));
124 disableCollision();
125}
126
127// @addr{0x80770068}
128Kart::Reaction ObjectRock::onCollision(Kart::KartObject * /*kartObj*/,
129 Kart::Reaction reactionOnKart, Kart::Reaction /*reactionOnObj*/,
130 EGG::Vector3f & /*hitDepth*/) {
131 if (scale().x < 1.0f) {
132 breakRock();
133 return Kart::Reaction::None;
134 }
135 return reactionOnKart;
136}
137
138} // namespace Kinoko::Field
#define KCL_TYPE_FLOOR
0x20E80FFF - Any KCL that the player or items can drive/land on.
ObjectRock(const System::MapdataGeoObj &params)
@addr {0x8076F2E0}
Definition ObjectRock.cc:10
Pertains to collision.
A 3D float vector.
Definition Vector.hh:107
constexpr f32 normalise()
Normalizes the vector and returns the original length.
Definition Vector.hh:278