A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
ObjectWLWallGC.cc
1#include "ObjectWLWallGC.hh"
2
3#include "game/system/RaceManager.hh"
4
5namespace Kinoko::Field {
6
8ObjectWLWallGC::ObjectWLWallGC(const System::MapdataGeoObj &params) : ObjectKCL(params) {
9 m_extendedDuration = params.setting(1);
10 m_startFrame = params.setting(4);
11 u32 rate = params.setting(2);
12 u16 distance = params.setting(3);
13
14 if (rate == 0) {
15 m_moveDuration = -1;
16 m_hiddenDuration = -1;
17 m_extendedFrame = -1;
18 m_retractingFrame = -1;
19 m_cycleDuration = -1;
20 } else {
21 m_moveDuration = distance / rate;
22 m_hiddenDuration = params.setting(0);
23 m_extendedFrame = m_hiddenDuration + m_moveDuration;
24 m_retractingFrame = m_extendedFrame + m_extendedDuration;
25 m_cycleDuration = m_retractingFrame + m_moveDuration;
26 }
27
28 m_initialPos = pos();
29
30 calcTransform();
31
32 m_targetPos = m_initialPos - transform().base(2) * static_cast<f32>(distance);
33
34 calcTransform();
35 m_currTransform = transform();
36}
37
39ObjectWLWallGC::~ObjectWLWallGC() = default;
40
42void ObjectWLWallGC::init() {
43 setPos(m_initialPos);
44 calcTransform();
45 m_currTransform = transform();
46}
47
49void ObjectWLWallGC::calc() {
50 EGG::Vector3f prevPos = pos();
51 setTransform(getUpdatedMatrix(0));
52 setMovingObjVel(pos() - prevPos);
53}
54
56const EGG::Matrix34f &ObjectWLWallGC::getUpdatedMatrix(u32 timeOffset) {
57 s32 time = cycleFrame(System::RaceManager::Instance()->timer() - timeOffset);
58
59 f32 t;
60 if (time < m_hiddenDuration) {
61 t = 0.0f;
62 } else if (time < m_extendedFrame) {
63 t = static_cast<f32>(time - m_hiddenDuration) / static_cast<f32>(m_moveDuration);
64 } else if (time < m_retractingFrame) {
65 t = 1.0f;
66 } else {
67 t = 1.0f - static_cast<f32>(time - m_retractingFrame) / static_cast<f32>(m_moveDuration);
68 }
69
70 m_currTransform.setBase(3, Interpolate(t, m_initialPos, m_targetPos));
71
72 return m_currTransform;
73}
74
76bool ObjectWLWallGC::checkCollision(f32 radius, const EGG::Vector3f &pos,
77 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfo *info, KCLTypeMask *maskOut,
78 u32 timeOffset) {
79 update(timeOffset);
80 calcScale(timeOffset);
81
82 return m_objColMgr->checkSphereFullPush(radius, pos, prevPos, mask, info, maskOut);
83}
84
86bool ObjectWLWallGC::checkCollisionCached(f32 radius, const EGG::Vector3f &pos,
87 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfo *info, KCLTypeMask *maskOut,
88 u32 timeOffset) {
89 update(timeOffset);
90 calcScale(timeOffset);
91
92 return m_objColMgr->checkSphereCachedFullPush(radius, pos, prevPos, mask, info, maskOut);
93}
94
95} // namespace Kinoko::Field
Pertains to collision.