Kinoko
A reimplementation of Mario Kart Wii's physics engine in C++
Toggle main menu visibility
Loading...
Searching...
No Matches
ObjectFireRing.cc
1
#include "ObjectFireRing.hh"
2
3
namespace
Kinoko::Field
{
4
6
ObjectFireRing::ObjectFireRing(
const
System::MapdataGeoObj ¶ms)
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] = EGG::egg_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(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
30
ObjectFireRing::~ObjectFireRing() =
default
;
31
33
void
ObjectFireRing::init() {
34
m_degAngle = 0.0f;
35
}
36
38
void
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
pos() + RotateAxisAngle((m_degAngle + fireball->angle()) * DEG2RAD, m_axis, dir));
54
}
55
}
56
57
}
// namespace Kinoko::Field
Kinoko::Field::ObjectCollidable
Definition
ObjectCollidable.hh:18
Kinoko::Field
Pertains to collision.
Definition
BoxColManager.cc:10
game
field
obj
ObjectFireRing.cc
Made by
Malleo
. Logo by
vabold
. Website generated by
Doxygen
1.17.0