2#include "ObjectPillar.hh"
4#include "game/field/ObjectDirector.hh"
6#include "game/kart/Reaction.hh"
11ObjectPillarBase::ObjectPillarBase(
const System::MapdataGeoObj ¶ms) :
ObjectKCL(params) {}
14ObjectPillarBase::~ObjectPillarBase() =
default;
17ObjectPillarC::ObjectPillarC(
const System::MapdataGeoObj ¶ms)
18 : ObjectCollidable(params), m_fallStart(static_cast<u32>(params.setting(0))) {}
21ObjectPillarC::~ObjectPillarC() =
default;
24void ObjectPillarC::calcCollisionTransform() {
25 constexpr f32 HEIGHT = 1900.0f;
31 EGG::Matrix34f mat = EGG::Matrix34f::zero;
32 mat.makeT(EGG::Vector3f(0.0f, 2.0f * (HEIGHT * scale().y) / 3.0f, 0.0f));
36 EGG::Vector3f speed = transform().ps_multVector(EGG::Vector3f::ez * 1000.0f);
37 m_collision->transform(transform().multiplyTo(mat), scale(), speed);
41ObjectPillar::ObjectPillar(
const System::MapdataGeoObj ¶ms)
42 : ObjectKCL(params), m_state(State::Upright), m_fallStart(static_cast<u32>(params.setting(0))),
43 m_targetRotation(F_PI * static_cast<f32>(params.setting(1)) / 180.0f), m_initRot(rot().x),
44 m_setupRot(EGG::Vector3f::zero) {
45 m_base = EGG::egg_new<ObjectPillarBase>(params);
46 m_collidable = EGG::egg_new<ObjectPillarC>(params);
51 m_groundFrame = std::numeric_limits<s32>::max();
55ObjectPillar::~ObjectPillar() =
default;
58void ObjectPillar::init() {
61 m_collidable->disableCollision();
67void ObjectPillar::calc() {
68 u32 time = System::RaceManager::Instance()->timer();
70 if (m_state == State::Upright && time < m_fallStart) {
71 m_collidable->enableCollision();
72 }
else if (m_state == State::Upright && time == m_fallStart) {
74 m_state = State::Break;
75 }
else if (m_state == State::Break) {
76 f32 rot = calcRot(
static_cast<s32
>(time));
77 if (rot < m_targetRotation) {
78 setTransform(getUpdatedMatrix(0));
79 m_collidable->setTransform(transform());
81 setRot(EGG::Vector3f(rot, m_setupRot.y, m_setupRot.z));
85 m_state = State::Ground;
87 m_collidable->disableCollision();
93 m_state = State::Ground;
98const EGG::Matrix34f &ObjectPillar::getUpdatedMatrix(u32 timeOffset) {
99 f32 rot = calcRot(System::RaceManager::Instance()->timer() - timeOffset);
100 m_workMat.makeRT(EGG::Vector3f(rot, m_setupRot.y, m_setupRot.z), pos());
105f32 ObjectPillar::calcRot(s32 frame)
const {
106 constexpr f32 STEP = 1e-7f;
108 if (m_groundFrame < frame) {
109 return m_targetRotation;
112 frame -= m_fallStart;
113 return std::min(m_targetRotation, m_initRot + STEP *
static_cast<f32
>(frame * frame * frame));