A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
ObjectBulldozer.cc
1#include "game/field/obj/ObjectBulldozer.hh"
2
3#include "game/system/RaceManager.hh"
4
5#include <cstring>
6
7namespace Field {
8
10ObjectBulldozer::ObjectBulldozer(const System::MapdataGeoObj &params)
11 : ObjectKCL(params), m_initialPos(m_pos), m_initialRot(m_rot) {
12 m_timeOffset = params.setting(3) * 2;
13 m_periodDenom = std::max<u16>(2, params.setting(2));
14 m_restFrames = params.setting(4);
15 m_amplitude = params.setting(1);
16 m_left = (strcmp(getName(), "bulldozer_left") == 0);
17 m_fullPeriod = m_periodDenom + m_restFrames * 2;
18 m_halfPeriod = m_fullPeriod / 2;
19 m_period = F_TAU / static_cast<f32>(m_periodDenom);
20}
21
23ObjectBulldozer::~ObjectBulldozer() = default;
24
26void ObjectBulldozer::calc() {
27 u32 timer = System::RaceManager::Instance()->timer();
28 f32 posOffset = calcStateAndPosition(m_timeOffset + timer);
29 EGG::Vector3f prevPos = m_pos;
30
31 m_flags.setBit(eFlags::Position);
32 m_pos.x = m_left ? m_initialPos.x + posOffset : m_initialPos.x - posOffset;
33
34 setMovingObjVel(m_pos - prevPos);
35}
36
38void ObjectBulldozer::initCollision() {
39 calcTransform();
40
41 EGG::Matrix34f matInv;
42 m_transform.ps_inverse(matInv);
43
44 calcTransform();
45
46 m_objColMgr->setMtx(m_transform);
47 m_objColMgr->setInvMtx(matInv);
48 m_objColMgr->setScale(getScaleY(0));
49
50 ObjectKCL::initCollision();
51
52 m_kclMidpoint = (m_objColMgr->kclHighWorld() + m_objColMgr->kclLowWorld()).multInv(2.0f);
53}
54
56const EGG::Matrix34f &ObjectBulldozer::getUpdatedMatrix(u32 timeOffset) {
57 EGG::Vector3f pos = m_initialPos;
58 u32 timer = System::RaceManager::Instance()->timer();
59 f32 posOffset = calcStateAndPosition(m_timeOffset + timer - timeOffset);
60
61 pos.x = m_left ? pos.x + posOffset : pos.x - posOffset;
62 m_rtMat.makeRT(m_initialRot, pos);
63
64 return m_rtMat;
65}
66
68bool ObjectBulldozer::checkCollision(f32 radius, const EGG::Vector3f &pos,
69 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfo *info, KCLTypeMask *maskOut,
70 u32 timeOffset) {
71 update(timeOffset);
72 calcScale(timeOffset);
73
74 return m_objColMgr->checkSphereFullPush(radius, pos, prevPos, mask, info, maskOut);
75}
76
78bool ObjectBulldozer::checkCollisionCached(f32 radius, const EGG::Vector3f &pos,
79 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfo *info, KCLTypeMask *maskOut,
80 u32 timeOffset) {
81 update(timeOffset);
82 calcScale(timeOffset);
83
84 return m_objColMgr->checkSphereCachedFullPush(radius, pos, prevPos, mask, info, maskOut);
85}
86
88f32 ObjectBulldozer::calcStateAndPosition(u32 timeOffset) const {
89 u16 t = timeOffset % m_fullPeriod;
90
91 if (t >= m_halfPeriod - m_restFrames) {
92 if (t < m_halfPeriod) {
93 t = m_periodDenom / 2;
94 } else if (t < m_fullPeriod - m_restFrames) {
95 t -= m_restFrames;
96 } else {
97 t = m_periodDenom;
98 }
99 }
100
101 return static_cast<f32>(m_amplitude) *
102 (1.0f + EGG::Mathf::cos(m_period * static_cast<f32>(t))) * 0.5f;
103}
104
105} // namespace Field
A 3 x 4 matrix.
Definition Matrix.hh:8
bool ps_inverse(Matrix34f &out) const
Definition Matrix.cc:291
static f32 cos(f32 x)
Definition Math.hh:40
Pertains to collision.
A 3D float vector.
Definition Vector.hh:87