A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
ObjectObakeBlock.cc
1#include "ObjectObakeBlock.hh"
2
3namespace Field {
4
6ObjectObakeBlock::ObjectObakeBlock(const System::MapdataGeoObj &params)
7 : ObjectBase(params), m_initialPos(params.pos()), m_fallState(FallState::Rest) {
8 constexpr f32 SI_WIDTH = 162.5f; // Half-width of block in the spatial index
9 constexpr f32 FALL_LINEAR_SPEED = 1.0f;
10 constexpr f32 FALL_ANGULAR_SPEED = 0.02f;
11
12 m_framesFallen = 0;
13 m_fallVel.setZero();
14 m_fallAngVel.setZero();
15 m_fallFrame = static_cast<s32>(
16 static_cast<s16>(params.setting(2)) + static_cast<s16>(params.setting(1)) * 60);
17
18 f32 yRot = params.rot().y;
19
20 if (yRot == 0.0f) {
21 m_fallVel.z = -FALL_LINEAR_SPEED;
22 m_fallAngVel.x = -FALL_ANGULAR_SPEED;
23 m_bbox.min = m_pos + EGG::Vector3f(SI_WIDTH, SI_WIDTH, SI_WIDTH);
24 m_bbox.max = m_pos + EGG::Vector3f(-SI_WIDTH, SI_WIDTH, SI_WIDTH);
25 } else if (yRot == 90.0f) {
26 m_fallVel.x = -FALL_LINEAR_SPEED;
27 m_fallAngVel.z = FALL_ANGULAR_SPEED;
28 m_bbox.min = m_pos + EGG::Vector3f(SI_WIDTH, SI_WIDTH, SI_WIDTH);
29 m_bbox.max = m_pos + EGG::Vector3f(SI_WIDTH, SI_WIDTH, -SI_WIDTH);
30 } else if (yRot == 180.0f) {
31 m_fallVel.z = FALL_LINEAR_SPEED;
32 m_fallAngVel.x = FALL_ANGULAR_SPEED;
33 m_bbox.min = m_pos + EGG::Vector3f(SI_WIDTH, SI_WIDTH, -SI_WIDTH);
34 m_bbox.max = m_pos + EGG::Vector3f(-SI_WIDTH, SI_WIDTH, -SI_WIDTH);
35 } else if (yRot == -90.0f) {
36 m_fallVel.x = FALL_LINEAR_SPEED;
37 m_fallAngVel.z = -FALL_ANGULAR_SPEED;
38 m_bbox.min = m_pos + EGG::Vector3f(-SI_WIDTH, SI_WIDTH, SI_WIDTH);
39 m_bbox.max = m_pos + EGG::Vector3f(-SI_WIDTH, SI_WIDTH, -SI_WIDTH);
40 }
41}
42
44ObjectObakeBlock::~ObjectObakeBlock() = default;
45
47void ObjectObakeBlock::calc() {
48 constexpr s32 FALL_DURATION = 255;
49
50 if (m_fallState != FallState::Falling) {
51 return;
52 }
53
54 m_pos = m_initialPos + m_fallVel * (static_cast<f32>(m_framesFallen) * 2.0f);
55 m_rot = m_fallAngVel * static_cast<f32>(m_framesFallen);
56 m_pos.y = m_initialPos.y -
57 (0.5f * static_cast<f32>(m_framesFallen)) * (0.5f * static_cast<f32>(m_framesFallen));
58 m_flags |= 3;
59
60 if (++m_framesFallen > FALL_DURATION) {
61 m_fallState = FallState::FinishedFalling;
62 }
63}
64
65} // namespace Field
Pertains to collision.
A 3D float vector.
Definition Vector.hh:87