2#include "ObjectPillar.hh"
4#include "game/field/ObjectDirector.hh"
12ObjectPillarBase::~ObjectPillarBase() =
default;
16 : ObjectCollidable(params), m_fallStart(static_cast<u32>(params.setting(0))) {}
19ObjectPillarC::~ObjectPillarC() =
default;
22void ObjectPillarC::calcCollisionTransform() {
23 constexpr f32 HEIGHT = 1900.0f;
30 mat.makeT(
EGG::Vector3f(0.0f, 2.0f * (HEIGHT * m_scale.y) / 3.0f, 0.0f));
34 EGG::Vector3f speed = m_transform.ps_multVector(EGG::Vector3f::ez * 1000.0f);
35 m_collision->transform(m_transform.multiplyTo(mat), m_scale, speed);
40 : ObjectKCL(params), m_state(State::Upright), m_fallStart(static_cast<u32>(params.setting(0))),
41 m_targetRotation(F_PI * static_cast<f32>(params.setting(1)) / 180.0f), m_initRot(m_rot.x),
42 m_setupRot(
EGG::Vector3f::zero) {
43 m_base =
new ObjectPillarBase(params);
44 m_collidable =
new ObjectPillarC(params);
49 m_groundFrame = std::numeric_limits<s32>::max();
53ObjectPillar::~ObjectPillar() =
default;
56void ObjectPillar::init() {
59 m_collidable->disableCollision();
65void ObjectPillar::calc() {
66 u32 time = System::RaceManager::Instance()->timer();
68 if (m_state == State::Upright && time < m_fallStart) {
69 m_collidable->enableCollision();
70 }
else if (m_state == State::Upright && time == m_fallStart) {
72 m_state = State::Break;
73 }
else if (m_state == State::Break) {
74 f32 rot = calcRot(
static_cast<s32
>(time));
75 if (rot < m_targetRotation) {
76 m_transform = getUpdatedMatrix(0);
77 m_pos = m_transform.base(3);
79 m_collidable->setTransform(m_transform);
80 m_collidable->setPos(m_pos);
82 m_flags.setBit(eFlags::Matrix, eFlags::Rotation);
87 m_state = State::Ground;
89 m_collidable->disableCollision();
95 m_state = State::Ground;
100const EGG::Matrix34f &ObjectPillar::getUpdatedMatrix(u32 timeOffset) {
101 f32 rot = calcRot(System::RaceManager::Instance()->timer() - timeOffset);
102 m_workMat.makeRT(
EGG::Vector3f(rot, m_setupRot.y, m_setupRot.z), m_pos);
107f32 ObjectPillar::calcRot(s32 frame)
const {
108 constexpr f32 STEP = 1e-7f;
110 if (m_groundFrame < frame) {
111 return m_targetRotation;
114 frame -= m_fallStart;
115 return std::min(m_targetRotation, m_initRot + STEP *
static_cast<f32
>(frame * frame * frame));