1#include "ObjectPropeller.hh"
3#include "game/field/ObjectDirector.hh"
8ObjectPropeller::ObjectPropeller(
const System::MapdataGeoObj ¶ms)
10 m_blades.fill(
nullptr);
14ObjectPropeller::~ObjectPropeller() {
15 for (
auto *&blade : m_blades) {
16 EGG::egg_delete(blade);
21void ObjectPropeller::init() {
23 m_angVel =
static_cast<f32
>(
static_cast<s16
>(m_mapObj->setting(0)));
24 if (m_mapObj->setting(1) == 1) {
28 m_rotMat.makeR(rot());
29 m_rotMat.setBase(3, pos());
30 m_axis = m_rotMat.base(2);
34void ObjectPropeller::calc() {
35 m_angle += m_angVel * 0.5f;
36 m_curRot = EGG::Matrix34f::ident;
37 m_curRot.setAxisRotation(m_angle * DEG2RAD, m_axis);
38 EGG::Matrix34f transform = m_curRot.multiplyTo(m_rotMat);
39 transform.setBase(3, pos());
40 setTransform(transform);
44void ObjectPropeller::createCollision() {
45 ObjectCollidable::createCollision();
47 const auto &colCenter = collisionCenter();
48 const auto &flowTable = ObjectDirector::Instance()->flowTable();
49 const auto ¶ms = flowTable.set(flowTable.slot(
id()))->params.cylinder;
50 f32 radius =
static_cast<f32
>(parse<s16>(params.radius));
51 f32 height =
static_cast<f32
>(parse<s16>(params.height));
53 for (
auto *&blade : m_blades) {
54 blade = EGG::egg_new<ObjectCollisionCylinder>(radius, height, colCenter);
59void ObjectPropeller::calcCollisionTransform() {
60 constexpr f32 BLADE_LENGTH = 250.0f;
62 for (u32 i = 0; i < m_blades.size(); ++i) {
64 mat.setBase(3, EGG::Vector3f::zero);
65 mat.setAxisRotation(
static_cast<f32
>(i * 120) * DEG2RAD, m_axis);
67 mat = mat.multiplyTo(transform());
68 EGG::Vector3f dir = mat.base(1);
71 mat.setBase(3, pos() + dir);
73 auto *&blade = m_blades[i];
74 blade->transform(mat, scale());
80 const auto &flowTable = ObjectDirector::Instance()->flowTable();
81 const auto ¶ms = flowTable.set(flowTable.slot(
id()))->params.box;
82 f32 z = scale().z *
static_cast<f32
>(parse<s16>(params.z));
83 f32 x = scale().x *
static_cast<f32
>(parse<s16>(params.x));
85 return 5.0f * std::max(z, x);
94 bool hasCol = lhs->check(*m_blades[0], dist0);
95 hasCol = hasCol || lhs->check(*m_blades[1], dist1);
96 hasCol = hasCol || lhs->check(*m_blades[2], dist2);
98 dist = dist0 + dist1 + dist2;
The base class that all objects' collision inherits from.
f32 getCollisionRadius() const override
Finds the radius that fits fully in a BoxColUnit.