A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
ObjectVolcanoRock.cc
1#include "ObjectVolcanoRock.hh"
2
3namespace Field {
4
6ObjectVolcanoRock::ObjectVolcanoRock(const System::MapdataGeoObj &params)
7 : ObjectKCL(params), m_initialPos(m_pos), m_initialRot(m_rot),
8 m_phaseShift(static_cast<s16>(params.setting(3))),
9 m_zPeriod(std::max<s16>(static_cast<s16>(params.setting(1)), 2)),
10 m_yPeriod(std::max<s16>(static_cast<s16>(params.setting(4)), 2)),
11 m_zAmplitude(static_cast<f32>(static_cast<s16>(params.setting(2)))),
12 m_yAmplitude(static_cast<f32>(static_cast<s16>(params.setting(5)))),
13 m_zAngVel(6.2831855f / static_cast<f32>(m_zPeriod)),
14 m_yAngVel(6.2831855f / static_cast<f32>(m_yPeriod)), m_variant(!!params.setting(0)) {
15 m_pos = calcPos(0);
16 m_flags.setBit(eFlags::Position);
17}
18
20ObjectVolcanoRock::~ObjectVolcanoRock() = default;
21
23void ObjectVolcanoRock::calc() {
24 EGG::Vector3f prevPos = m_pos;
25 m_pos = calcPos(System::RaceManager::Instance()->timer());
26 m_flags.setBit(eFlags::Position);
27 setMovingObjVel(m_pos - prevPos);
28}
29
31EGG::Vector3f ObjectVolcanoRock::calcPos(u32 frame) {
32 f32 tz = static_cast<f32>((frame + m_phaseShift) % m_zPeriod);
33 f32 ty = static_cast<f32>(frame % m_yPeriod);
34
35 auto zDisplacement = EGG::Vector3f::ez * EGG::Mathf::cos(m_zAngVel * tz) * m_zAmplitude;
36 auto yDisplacement = EGG::Vector3f::ey * EGG::Mathf::cos(m_yAngVel * ty) * m_yAmplitude;
37
38 calcTransform();
39
40 return m_initialPos + m_transform.multVector33(zDisplacement + yDisplacement);
41}
42
43} // namespace Field
static f32 cos(f32 x)
Definition Math.hh:43
Pertains to collision.
A 3D float vector.
Definition Vector.hh:88