A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
ObjectCrane.cc
1#include "ObjectCrane.hh"
2
3namespace Field {
4
6ObjectCrane::ObjectCrane(const System::MapdataGeoObj &params)
7 : ObjectKCL(params), m_startPos(m_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 * F_PI / static_cast<f32>(m_xPeriod);
16 m_yFreq = 2 * F_PI / static_cast<f32>(m_yPeriod);
17}
18
20ObjectCrane::~ObjectCrane() = default;
21
23void ObjectCrane::calc() {
24 const EGG::Vector3f prevPos = m_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
34 m_pos = m_startPos + m_transform.multVector33(scaledX + scaledY);
35 m_flags.setBit(eFlags::Position);
36
37 if (m_yt++ > m_yPeriod) {
38 m_yt = 0;
39 }
40
41 if (m_xt++ > m_xPeriod) {
42 m_xt = 0;
43 }
44
45 setMovingObjVel(m_pos - prevPos);
46}
47
48} // namespace Field
static f32 cos(f32 x)
Definition Math.hh:40
Pertains to collision.
A 3D float vector.
Definition Vector.hh:87