2#include "ObjectPillar.hh"
4#include "game/field/ObjectDirector.hh"
9ObjectPillarBase::ObjectPillarBase(
const System::MapdataGeoObj ¶ms) :
ObjectKCL(params) {}
12ObjectPillarBase::~ObjectPillarBase() =
default;
15ObjectPillarC::ObjectPillarC(
const System::MapdataGeoObj ¶ms)
16 : ObjectCollidable(params), m_fallStart(static_cast<u32>(params.setting(0))) {}
19ObjectPillarC::~ObjectPillarC() =
default;
22void ObjectPillarC::calcCollisionTransform() {
23 constexpr f32 HEIGHT = 1900.0f;
29 EGG::Matrix34f mat = EGG::Matrix34f::zero;
30 mat.makeT(EGG::Vector3f(0.0f, 2.0f * (HEIGHT * scale().y) / 3.0f, 0.0f));
34 EGG::Vector3f speed = transform().ps_multVector(EGG::Vector3f::ez * 1000.0f);
35 m_collision->transform(transform().multiplyTo(mat), scale(), speed);
39ObjectPillar::ObjectPillar(
const System::MapdataGeoObj ¶ms)
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(rot().x),
42 m_setupRot(EGG::Vector3f::zero) {
43 m_base = EGG::egg_new<ObjectPillarBase>(params);
44 m_collidable = EGG::egg_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 setTransform(getUpdatedMatrix(0));
77 m_collidable->setTransform(transform());
79 setRot(EGG::Vector3f(rot, m_setupRot.y, m_setupRot.z));
83 m_state = State::Ground;
85 m_collidable->disableCollision();
91 m_state = State::Ground;
96const EGG::Matrix34f &ObjectPillar::getUpdatedMatrix(u32 timeOffset) {
97 f32 rot = calcRot(System::RaceManager::Instance()->timer() - timeOffset);
98 m_workMat.makeRT(EGG::Vector3f(rot, m_setupRot.y, m_setupRot.z), pos());
103f32 ObjectPillar::calcRot(s32 frame)
const {
104 constexpr f32 STEP = 1e-7f;
106 if (m_groundFrame < frame) {
107 return m_targetRotation;
110 frame -= m_fallStart;
111 return std::min(m_targetRotation, m_initRot + STEP *
static_cast<f32
>(frame * frame * frame));