A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
ObjectCrane.cc
1#include "ObjectCrane.hh"
2
3namespace Kinoko::Field {
4
6ObjectCrane::ObjectCrane(const System::MapdataGeoObj &params)
7 : ObjectKCL(params), m_startPos(pos()) {
8 m_xt = params.setting(3);
9 m_yt = 0;
10 m_xPeriod = std::max(static_cast<u16>(2), params.setting(1));
11 m_yPeriod = std::max(static_cast<u16>(2), params.setting(4));
12 m_xAmplitude = params.setting(2);
13 m_yAmplitude = params.setting(5);
14
15 m_xFreq = 2.0f * F_PI / static_cast<f32>(m_xPeriod);
16 m_yFreq = 2.0f * F_PI / static_cast<f32>(m_yPeriod);
17}
18
20ObjectCrane::~ObjectCrane() = default;
21
23void ObjectCrane::calc() {
24 const EGG::Vector3f prevPos = pos();
25
26 f32 xDelta = EGG::Mathf::cos(m_xFreq * static_cast<f32>(m_xt));
27 EGG::Vector3f scaledX = EGG::Vector3f::ex * xDelta * static_cast<f32>(m_xAmplitude);
28
29 f32 yDelta = EGG::Mathf::cos(m_yFreq * static_cast<f32>(m_yt));
30 EGG::Vector3f scaledY = EGG::Vector3f::ey * yDelta * static_cast<f32>(m_yAmplitude);
31
32 calcTransform();
33 setPos(m_startPos + transform().multVector33(scaledX + scaledY));
34
35 if (m_yt++ > m_yPeriod) {
36 m_yt = 0;
37 }
38
39 if (m_xt++ > m_xPeriod) {
40 m_xt = 0;
41 }
42
43 setMovingObjVel(pos() - prevPos);
44}
45
46} // namespace Kinoko::Field
Pertains to collision.