1#include "ObjectVolcanoRock.hh"
6ObjectVolcanoRock::ObjectVolcanoRock(
const System::MapdataGeoObj ¶ms)
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)) {
19ObjectVolcanoRock::~ObjectVolcanoRock() =
default;
22void ObjectVolcanoRock::calc() {
23 EGG::Vector3f prevPos = pos();
24 setPos(calcPos(System::RaceManager::Instance()->timer()));
25 setMovingObjVel(pos() - prevPos);
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);
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;
38 return m_initialPos + transform().multVector33(zDisplacement + yDisplacement);