1#include "ObjectFireRing.hh"
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 = std::span<ObjectFireball *>(
new ObjectFireball *[fireballCount], fireballCount);
11 f32 distance = 100.0f *
static_cast<f32
>(params.setting(3));
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));
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));
30ObjectFireRing::~ObjectFireRing() {
31 delete m_fireballs.data();
35void ObjectFireRing::init() {
40void ObjectFireRing::calc() {
42 m_degAngle += m_angSpeed / 60.0f;
44 if (m_degAngle > 360.0f) {
46 }
else if (m_degAngle < 0.0f) {
52 for (
auto *&fireball : m_fireballs) {
53 EGG::Vector3f dir = m_initDir * fireball->distance() * (1.0f + radius);
55 m_pos + RotateAxisAngle((m_degAngle + fireball->angle()) * DEG2RAD, m_axis, dir));
Vector3f base(size_t col) const
Get a particular column from a matrix.
void makeR(const Vector3f &r)
Sets 3x3 rotation matrix from a vector of Euler angles.
f32 normalise()
Normalizes the vector and returns the original length.