1#include "game/field/obj/ObjectBulldozer.hh"
3#include "game/system/RaceManager.hh"
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);
23ObjectBulldozer::~ObjectBulldozer() =
default;
26void ObjectBulldozer::calc() {
27 u32 timer = System::RaceManager::Instance()->timer();
28 f32 posOffset = calcStateAndPosition(m_timeOffset + timer);
31 m_flags.setBit(eFlags::Position);
32 m_pos.x = m_left ? m_initialPos.x + posOffset : m_initialPos.x - posOffset;
34 setMovingObjVel(m_pos - prevPos);
38void ObjectBulldozer::initCollision() {
46 m_objColMgr->setMtx(m_transform);
47 m_objColMgr->setInvMtx(matInv);
48 m_objColMgr->setScale(getScaleY(0));
50 ObjectKCL::initCollision();
52 m_kclMidpoint = (m_objColMgr->kclHighWorld() + m_objColMgr->kclLowWorld()).multInv(2.0f);
58 u32 timer = System::RaceManager::Instance()->timer();
59 f32 posOffset = calcStateAndPosition(m_timeOffset + timer - timeOffset);
61 pos.x = m_left ? pos.x + posOffset : pos.x - posOffset;
62 m_rtMat.makeRT(m_initialRot, pos);
68bool ObjectBulldozer::checkCollision(f32 radius,
const EGG::Vector3f &pos,
69 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfo *info, KCLTypeMask *maskOut,
72 calcScale(timeOffset);
74 return m_objColMgr->checkSphereFullPush(radius, pos, prevPos, mask, info, maskOut);
78bool ObjectBulldozer::checkCollisionCached(f32 radius,
const EGG::Vector3f &pos,
79 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfo *info, KCLTypeMask *maskOut,
82 calcScale(timeOffset);
84 return m_objColMgr->checkSphereCachedFullPush(radius, pos, prevPos, mask, info, maskOut);
88f32 ObjectBulldozer::calcStateAndPosition(
u32 timeOffset)
const {
89 u16 t = timeOffset % m_fullPeriod;
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) {
101 return static_cast<f32
>(m_amplitude) *
bool ps_inverse(Matrix34f &out) const