A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
ObjectVolcanoRock.cc
1#include "ObjectVolcanoRock.hh"
2
3namespace Kinoko::Field {
4
6ObjectVolcanoRock::ObjectVolcanoRock(const System::MapdataGeoObj &params)
7 : ObjectKCL(params), m_initialPos(pos()), m_initialRot(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 setPos(calcPos(0));
16}
17
19ObjectVolcanoRock::~ObjectVolcanoRock() = default;
20
22void ObjectVolcanoRock::calc() {
23 EGG::Vector3f prevPos = pos();
24 setPos(calcPos(System::RaceManager::Instance()->timer()));
25 setMovingObjVel(pos() - prevPos);
26}
27
29EGG::Vector3f ObjectVolcanoRock::calcPos(u32 frame) {
30 f32 tz = static_cast<f32>((frame + m_phaseShift) % m_zPeriod);
31 f32 ty = static_cast<f32>(frame % m_yPeriod);
32
33 auto zDisplacement = EGG::Vector3f::ez * EGG::Mathf::cos(m_zAngVel * tz) * m_zAmplitude;
34 auto yDisplacement = EGG::Vector3f::ey * EGG::Mathf::cos(m_yAngVel * ty) * m_yAmplitude;
35
36 calcTransform();
37
38 return m_initialPos + transform().multVector33(zDisplacement + yDisplacement);
39}
40
41} // namespace Kinoko::Field
Pertains to collision.