A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
ObjectVolcanoBall.cc
1#include "ObjectVolcanoBall.hh"
2
3namespace Kinoko::Field {
4
6ObjectVolcanoBall::ObjectVolcanoBall(f32 accel, f32 finalVel, f32 endPosY,
7 const System::MapdataGeoObj &params, const EGG::Vector3f &vel)
8 : ObjectCollidable(params), StateManager(this, STATE_ENTRIES),
9 m_burnDuration(params.setting(3)), m_accel(accel), m_finalVel(finalVel), m_endPosY(endPosY),
10 m_sqVelXZ(vel.x * vel.x + vel.z * vel.z) {}
11
13ObjectVolcanoBall::~ObjectVolcanoBall() = default;
14
16void ObjectVolcanoBall::init() {
17 m_railInterpolator->init(0.0f, 0);
18 setPos(m_railInterpolator->curPos());
19}
20
22void ObjectVolcanoBall::calcFalling() {
23 f32 sqVel = std::max(0.01f, m_finalVel - 2.0f * m_accel * (pos().y - m_endPosY));
24 m_railInterpolator->setCurrVel(EGG::Mathf::sqrt(m_sqVelXZ + sqVel));
25
26 if (m_railInterpolator->calc() == RailInterpolator::Status::ChangingDirection) {
27 m_nextStateId = 2;
28 } else {
29 EGG::Vector3f tangent = m_railInterpolator->curTangentDir();
30 if (EGG::Mathf::abs(tangent.y) > 0.1f) {
31 tangent.y = 0.01f;
32 }
33
34 tangent.normalise2();
35 setMatrixFromOrthonormalBasisAndPos(tangent);
36
37 setPos(m_railInterpolator->curPos());
38 }
39}
40
41} // namespace Kinoko::Field
Base class that represents different "states" for an object.
Pertains to collision.