1#include "ObjectTownBridge.hh"
3#include "game/system/RaceManager.hh"
11 m_rotateUpwards = m_rot.y < 0.0f;
12 m_angVel =
static_cast<float>(params.setting(0));
13 m_pivotFrames =
static_cast<u32>(params.setting(1));
14 m_raisedFrames =
static_cast<u32>(params.setting(2));
15 m_loweredFrames =
static_cast<u32>(params.setting(3));
16 m_fullAnimFrames = m_pivotFrames * 2 + (m_loweredFrames + m_raisedFrames);
17 m_state = State::Raising;
21ObjectTownBridge::~ObjectTownBridge() {
24 if (m_flatColMgr != m_objColMgr) {
28 if (m_midColMgr != m_objColMgr) {
32 if (m_raisedColMgr != m_objColMgr) {
33 delete m_raisedColMgr;
38void ObjectTownBridge::calc() {
39 u32 t = System::RaceManager::Instance()->timer();
40 f32 angle = calcBridgeAngle(t);
44 angle = std::clamp(angle, -45.0f, 45.0f);
45 f32 absAng = EGG::Mathf::abs(angle);
47 if (absAng <= 10.0f) {
48 m_objColMgr = m_flatColMgr;
49 }
else if (absAng <= 30.0f) {
50 m_objColMgr = m_midColMgr;
52 m_objColMgr = m_raisedColMgr;
55 m_flags.setBit(eFlags::Rotation);
56 m_rot.z = F_PI * angle / 180.0f;
57 m_state = calcState(t);
61void ObjectTownBridge::createCollision() {
62 ObjectKCL::createCollision();
64 const char *name = getKclName();
65 auto *resMgr = System::ResourceManager::Instance();
68 snprintf(filepath,
sizeof(filepath),
"%s2.kcl", name);
69 m_midColMgr =
new ObjColMgr(resMgr->getFile(filepath,
nullptr, System::ArchiveId::Course));
71 snprintf(filepath,
sizeof(filepath),
"%s3.kcl", name);
72 m_flatColMgr =
new ObjColMgr(resMgr->getFile(filepath,
nullptr, System::ArchiveId::Course));
74 m_raisedColMgr = m_objColMgr;
78f32 ObjectTownBridge::calcBridgeAngle(
u32 t)
const {
79 u32 animFrame = t % m_fullAnimFrames;
80 State state = calcState(animFrame);
84 s32 sign = m_rotateUpwards ? -1 : 1;
85 return m_angVel *
static_cast<f32
>(sign);
87 case State::Lowered: {
90 case State::Raising: {
91 s32 sign = m_rotateUpwards ? -1 : 1;
92 return m_angVel *
static_cast<f32
>((
static_cast<s32
>(animFrame) * sign)) /
93 static_cast<f32
>(m_pivotFrames);
95 case State::Lowering: {
96 s32 sign = m_rotateUpwards ? -1 : 1;
97 u32 rot = m_pivotFrames - (animFrame - (m_pivotFrames + m_raisedFrames));
98 return m_angVel *
static_cast<f32
>(sign *
static_cast<s32
>(rot)) /
99 static_cast<f32
>(m_pivotFrames);
107ObjectTownBridge::State ObjectTownBridge::calcState(
u32 t)
const {
108 if (t < m_pivotFrames) {
109 return State::Raising;
112 if (t < m_pivotFrames + m_raisedFrames) {
113 return State::Raised;
116 if (t < m_pivotFrames * 2 + m_raisedFrames) {
117 return State::Lowering;
120 return State::Lowered;