A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
ObjectVolcanoBall.cc
1#include "ObjectVolcanoBall.hh"
2
3namespace 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 m_pos = m_railInterpolator->curPos();
19 m_flags.setBit(eFlags::Position);
20}
21
23void ObjectVolcanoBall::calcFalling() {
24 f32 sqVel = std::max(0.01f, m_finalVel - 2.0f * m_accel * (m_pos.y - m_endPosY));
25 m_railInterpolator->setCurrVel(EGG::Mathf::sqrt(m_sqVelXZ + sqVel));
26
27 if (m_railInterpolator->calc() == RailInterpolator::Status::ChangingDirection) {
28 m_nextStateId = 2;
29 } else {
30 EGG::Vector3f tangent = m_railInterpolator->curTangentDir();
31 if (EGG::Mathf::abs(tangent.y) > 0.1f) {
32 tangent.y = 0.01f;
33 }
34
35 tangent.normalise2();
36 setMatrixFromOrthonormalBasisAndPos(tangent);
37
38 m_pos = m_railInterpolator->curPos();
39 m_flags.setBit(eFlags::Position);
40 }
41}
42
43} // namespace Field
Pertains to collision.
A 3D float vector.
Definition Vector.hh:88