1#include "ObjectKinoko.hh"
6ObjectKinoko::ObjectKinoko(
const System::MapdataGeoObj ¶ms)
7 :
ObjectKCL(params), m_objPos(pos()), m_objRot(rot()) {
8 m_type =
static_cast<KinokoType
>(params.setting(0));
12 m_pulseFalloff = 0.1f;
16ObjectKinoko::~ObjectKinoko() =
default;
19void ObjectKinoko::calc() {
20 constexpr s16 REST_DURATION = 10;
21 constexpr s16 PULSE_DURATION = 40;
22 constexpr f32 PULSE_SCALE = 0.0008f;
23 constexpr f32 PULSE_FREQ = 6.0f * F_PI / 40.0f;
25 if (m_restFrame == 0) {
28 if (m_pulseFrame == PULSE_DURATION) {
31 if (m_restFrame > REST_DURATION) {
34 if (m_pulseFrame > PULSE_DURATION) {
38 m_pulseFalloff = PULSE_SCALE *
static_cast<f32
>(PULSE_DURATION - m_pulseFrame);
39 setScale(m_pulseFalloff * EGG::Mathf::sin(PULSE_FREQ *
static_cast<f32
>(m_pulseFrame)) + 1.0f);
44ObjectKinokoUd::ObjectKinokoUd(
const System::MapdataGeoObj ¶ms) : ObjectKinoko(params) {
46 m_oscFrame = params.setting(3);
47 m_waitDuration = params.setting(4);
48 m_amplitude = params.setting(1);
49 m_period = std::max<u16>(params.setting(2), 2);
50 m_angFreq = F_TAU /
static_cast<f32
>(m_period);
54ObjectKinokoUd::~ObjectKinokoUd() =
default;
57void ObjectKinokoUd::calcOscillation() {
58 f32 posY = m_objPos.y +
59 static_cast<f32
>(m_amplitude) *
60 (EGG::Mathf::cos(m_angFreq *
static_cast<f32
>(m_oscFrame)) + 1.0f) * 0.5f;
61 setPos(EGG::Vector3f(pos().x, posY, pos().z));
63 if (m_waitFrame == 0) {
66 if (m_oscFrame == (m_period / 2)) {
69 if (m_waitFrame > m_waitDuration) {
72 if (m_oscFrame > m_period) {
78ObjectKinokoBend::ObjectKinokoBend(
const System::MapdataGeoObj ¶ms) : ObjectKinoko(params) {
79 m_currentFrame = params.setting(3);
80 m_amplitude =
static_cast<f32
>(params.setting(1)) * DEG2RAD;
81 m_period = std::max<u16>(params.setting(2), 2);
82 m_angFreq = F_TAU /
static_cast<f32
>(m_period);
86ObjectKinokoBend::~ObjectKinokoBend() =
default;
89void ObjectKinokoBend::calcOscillation() {
90 const f32 s = EGG::Mathf::sin(m_angFreq *
static_cast<f32
>(m_currentFrame));
91 EGG::Vector3f rot = m_objRot + (EGG::Vector3f::ez * s) * m_amplitude;
94 setRot(transform().multVector33(rot));
96 if (++m_currentFrame >= m_period) {
101ObjectKinokoNm::ObjectKinokoNm(
const System::MapdataGeoObj ¶ms) : ObjectKCL(params) {
102 m_type =
static_cast<KinokoType
>(params.setting(0));
106ObjectKinokoNm::~ObjectKinokoNm() =
default;