1#include "ObjectSandcone.hh"
3#include "game/system/RaceManager.hh"
8ObjectSandcone::ObjectSandcone(
const System::MapdataGeoObj ¶ms) :
ObjectKCL(params) {
9 m_flowRate =
static_cast<f32
>(params.setting(0)) / 100.0f;
10 m_finalHeightDelta =
static_cast<f32
>(params.setting(1));
11 m_startFrame = params.setting(2);
12 m_baseMtx.makeRT(rot(), pos());
16ObjectSandcone::~ObjectSandcone() =
default;
19void ObjectSandcone::init() {
20 m_duration = m_finalHeightDelta / m_flowRate;
21 m_currentMtx = m_baseMtx;
24 m_finalPos = pos() + EGG::Vector3f::ey * (
static_cast<f32
>(m_duration) * m_flowRate);
28const EGG::Matrix34f &ObjectSandcone::getUpdatedMatrix(u32 timeOffset) {
29 m_currentMtx = m_baseMtx;
31 u32 t = System::RaceManager::Instance()->timer() - timeOffset;
33 if (t > m_startFrame + m_duration) {
36 m_currentMtx.setBase(3, m_finalPos);
37 }
else if (t > m_startFrame) {
38 EGG::Vector3f deltaPos = EGG::Vector3f::ey * ((t - m_startFrame) * m_flowRate);
39 m_currentMtx.setBase(3, m_baseMtx.base(3) + deltaPos);
46bool ObjectSandcone::checkCollision(f32 radius,
const EGG::Vector3f &pos,
47 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfo *info, KCLTypeMask *maskOut,
50 calcScale(timeOffset);
52 return m_objColMgr->checkSphereFullPush(radius, pos, prevPos, mask, info, maskOut);
56bool ObjectSandcone::checkCollisionCached(f32 radius,
const EGG::Vector3f &pos,
57 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfo *info, KCLTypeMask *maskOut,
60 calcScale(timeOffset);
62 return m_objColMgr->checkSphereCachedFullPush(radius, pos, prevPos, mask, info, maskOut);