A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
ObjectFireRing.cc
1#include "ObjectFireRing.hh"
2
3namespace Kinoko::Field {
4
6ObjectFireRing::ObjectFireRing(const System::MapdataGeoObj &params)
7 : ObjectCollidable(params), m_phase(0.0f) {
8 size_t fireballCount = std::max<u32>(1, params.setting(0));
9 m_angSpeed = static_cast<f32>(static_cast<s16>(params.setting(1)));
10 m_fireballs = owning_span<ObjectFireball *>(fireballCount);
11 f32 distance = 100.0f * static_cast<f32>(params.setting(3));
12
13 for (size_t i = 0; i < fireballCount; ++i) {
14 m_fireballs[i] = new ObjectFireball(params);
15 m_fireballs[i]->load();
16 m_fireballs[i]->setDistance(distance);
17 m_fireballs[i]->setAngle(static_cast<f32>(i) * (360.0f / fireballCount));
18 }
19
20 EGG::Matrix34f mat;
21 mat.makeR(m_rot);
22 m_axis = mat.base(2);
23 m_axis.normalise();
24 m_initDir = m_axis.cross(RotateAxisAngle(F_PI / 2.0f, EGG::Vector3f::ex, m_axis));
25 m_initDir.normalise();
26 m_radiusScale = 0.1f * static_cast<f32>(params.setting(2));
27}
28
30ObjectFireRing::~ObjectFireRing() = default;
31
33void ObjectFireRing::init() {
34 m_degAngle = 0.0f;
35}
36
38void ObjectFireRing::calc() {
39 m_phase += 1.0f;
40 m_degAngle += m_angSpeed / 60.0f;
41
42 if (m_degAngle > 360.0f) {
43 m_degAngle -= 360.0f;
44 } else if (m_degAngle < 0.0f) {
45 m_degAngle += 360.0f;
46 }
47
48 f32 radius = m_radiusScale * EGG::Mathf::sin(m_phase * DEG2RAD);
49
50 for (auto *&fireball : m_fireballs) {
51 EGG::Vector3f dir = m_initDir * fireball->distance() * (1.0f + radius);
52 fireball->setPos(
53 m_pos + RotateAxisAngle((m_degAngle + fireball->angle()) * DEG2RAD, m_axis, dir));
54 }
55}
56
57} // namespace Kinoko::Field
Pertains to collision.