1#include "ObjectFirebar.hh"
6ObjectFirebar::ObjectFirebar(
const System::MapdataGeoObj ¶ms) : ObjectCollidable(params) {
7 m_spokes = std::max<u32>(1, params.setting(3));
8 size_t fireballCount = std::max<u32>(1, params.setting(0) * m_spokes);
9 m_angSpeed =
static_cast<f32
>(
static_cast<s16
>(params.setting(1)));
11 m_fireballs = owning_span<ObjectFireball *>(fireballCount);
13 for (
size_t i = 0; i < fireballCount; ++i) {
14 m_fireballs[i] =
new ObjectFireball(params);
15 m_fireballs[i]->load();
17 f32 ring = 1.0f +
static_cast<f32
>(i / m_spokes);
18 m_fireballs[i]->setDistance(
19 ring * (100.0f *
static_cast<f32
>(
static_cast<s16
>(params.setting(2)))));
20 m_fireballs[i]->setAngle((360.0f / m_spokes) * (i % m_spokes));
27 m_initDir = m_axis.cross(RotateAxisAngle(F_PI / 2.0f, EGG::Vector3f::ex, m_axis));
28 m_initDir.normalise();
32ObjectFirebar::~ObjectFirebar() =
default;
35void ObjectFirebar::init() {
40void ObjectFirebar::calc() {
41 m_degAngle += m_angSpeed / 60.0f;
43 if (m_degAngle > 360.0f) {
45 }
else if (m_degAngle < 0.0f) {
49 for (
auto *&fireball : m_fireballs) {
50 EGG::Vector3f dir = m_initDir * fireball->distance();
52 m_pos + RotateAxisAngle((m_degAngle + fireball->angle()) * DEG2RAD, m_axis, dir));