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());
21ObjectSandcone::~ObjectSandcone() =
default;
24void ObjectSandcone::init() {
25 m_duration = m_finalHeightDelta / m_flowRate;
26 m_currentMtx = m_baseMtx;
29 m_finalPos = pos() + EGG::Vector3f::ey * (
static_cast<f32
>(m_duration) * m_flowRate);
33const EGG::Matrix34f &ObjectSandcone::getUpdatedMatrix(u32 timeOffset) {
34 m_currentMtx = m_baseMtx;
36 u32 t = System::RaceManager::Instance()->timer() - timeOffset;
38 if (t > m_startFrame + m_duration) {
41 m_currentMtx.setBase(3, m_finalPos);
42 }
else if (t > m_startFrame) {
43 EGG::Vector3f deltaPos = EGG::Vector3f::ey * ((t - m_startFrame) * m_flowRate);
44 m_currentMtx.setBase(3, m_baseMtx.base(3) + deltaPos);
51bool ObjectSandcone::checkCollision(f32 radius,
const EGG::Vector3f &pos,
52 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfo *info, KCLTypeMask *maskOut,
55 calcScale(timeOffset);
57 return m_objColMgr->checkSphereFullPush(radius, pos, prevPos, mask, info, maskOut);
61bool ObjectSandcone::checkCollisionCached(f32 radius,
const EGG::Vector3f &pos,
62 const EGG::Vector3f &prevPos, KCLTypeMask mask, CollisionInfo *info, KCLTypeMask *maskOut,
65 calcScale(timeOffset);
67 return m_objColMgr->checkSphereCachedFullPush(radius, pos, prevPos, mask, info, maskOut);