3#include "game/field/BoxColManager.hh"
4#include "game/field/CollisionDirector.hh"
5#include "game/field/ObjectDirector.hh"
10JugemMove::JugemMove(
const Kart::KartObject *kartObj) : m_kartObj(kartObj) {}
13JugemMove::~JugemMove() =
default;
16void JugemMove::init() {
17 m_28 = EGG::Matrix34f::ident;
18 m_58 = EGG::Matrix34f::ident;
19 m_88 = EGG::Matrix34f::ident;
20 m_transform = EGG::Matrix34f::ident;
25 m_lastKartObjPos = m_kartObj->pos();
29 m_anchorPos.setZero();
30 m_currForward.setZero();
31 m_targetForward = EGG::Vector3f::ez;
32 m_isAwayOrDescending =
false;
33 m_velDirInterpRate = 1.0f;
34 m_forwardInterpRate = 0.08f;
35 m_isDescending =
true;
40void JugemMove::calc() {
41 constexpr EGG::Vector3f VEC_809C28FC = EGG::Vector3f(0.0f, 40.0f, 0.0f);
43 const EGG::Vector3f &pos = m_kartObj->pos();
44 f32 fVar2 = (EGG::Mathf::abs(m_anchorPos.y - m_pos.y) - 200.0f) / 100.0f;
45 f32 fVar7 = std::clamp(fVar2, 0.0f, 1.0f);
47 f32 dVar6 = 0.4f + fVar7 * (0.8f - 0.4f);
48 f32 dVar5 = std::clamp(dVar6, 0.0f, 1.0f);
50 EGG::Vector3f kartObjPosDelta = pos - m_lastKartObjPos;
51 kartObjPosDelta.y = dVar5 * (pos.y - m_lastKartObjPos.y);
52 EGG::Vector3f local_74 = m_anchorPos - kartObjPosDelta - m_pos;
53 EGG::Vector3f local_80 = local_74;
55 fVar7 = local_80.normalise();
63 if (!m_isAwayOrDescending) {
64 m_velDirInterpRate = 0.0f;
69 if (m_velDir.x * local_80.x < 0.0f) {
70 m_velDir.x += local_80.x;
72 if (m_velDir.y * local_80.y < 0.0f) {
73 m_velDir.y += local_80.y;
75 if (m_velDir.z * local_80.z < 0.0f) {
76 m_velDir.z += local_80.z;
82 m_velDirInterpRate = std::min(1.0f, m_velDirInterpRate + 0.02f);
83 m_velDir = Interpolate(m_velDirInterpRate, local_80, local_74);
88 fVar7 = m_velDir.normalise();
90 if (m_isDescending && dVar6 < dVar5) {
94 fVar7 = m_velDir.y * dVar5;
100 m_pos += kartObjPosDelta;
103 EGG::Vector3f local_8c = EGG::Vector3f::zero;
104 m_58 = calcOrthonormalBasis();
105 EGG::Vector3f local_d4 = calcOscillation(m_58);
110 EGG::Vector3f local_a4 = EGG::Vector3f(kartObjPosDelta.x, 0.0f, kartObjPosDelta.z);
111 m_pos = m_pos + m_riseVel + local_a4;
117 EGG::Vector3f local_b0 = m_pos + local_8c;
118 m_28 = FUN_807202BC();
120 m_58.setBase(3, VEC_809C28FC);
121 m_28.setBase(3, local_b0);
123 EGG::Matrix34f local_50 = EGG::Matrix34f::ident;
124 local_50 = local_50.multiplyTo(m_28);
125 local_50 = local_50.multiplyTo(m_58);
126 local_50 = local_50.multiplyTo(m_88);
128 m_transform = local_50;
129 m_transPos = m_transform.base(3);
130 m_lastKartObjPos = pos;
134void JugemMove::setForwardFromKartObjPosDelta(
bool setCurr) {
135 constexpr f32 FAST_INTERP_DIST = 250.0f;
136 constexpr f32 SLOW_INTERP_RATE = 0.03f;
137 constexpr f32 FAST_INTERP_RATE = 0.08f;
139 EGG::Vector3f forward = m_kartObj->pos() - m_pos;
141 f32 dist = forward.normalise();
143 if (forward.squaredLength() <= std::numeric_limits<f32>::epsilon()) {
144 forward = EGG::Vector3f::ez;
148 m_currForward = forward;
151 m_targetForward = forward;
152 m_forwardInterpRate = dist < FAST_INTERP_DIST ? SLOW_INTERP_RATE : FAST_INTERP_RATE;
156void JugemMove::setForwardFromKartObjMainRot(
bool setCurr) {
157 EGG::Vector3f forward = m_kartObj->mainRot().rotateVector(EGG::Vector3f::ez);
160 forward.normalise2();
162 if (forward.squaredLength() <= std::numeric_limits<f32>::epsilon()) {
163 forward = EGG::Vector3f::ez;
167 m_currForward = forward;
170 m_targetForward = forward;
174EGG::Matrix34f JugemMove::calcOrthonormalBasis() {
175 m_currForward = Interpolate(m_forwardInterpRate, m_currForward, m_targetForward);
176 m_currForward.normalise();
178 const EGG::Vector3f &up = EGG::Vector3f::ey;
179 EGG::Vector3f forward = m_currForward;
181 if (forward.squaredLength() <= std::numeric_limits<f32>::epsilon()) {
182 forward = EGG::Vector3f::ez;
185 EGG::Vector3f right = up.cross(forward);
188 forward = right.cross(up);
191 EGG::Matrix34f mat = EGG::Matrix34f::ident;
192 mat.setBase(0, right);
194 mat.setBase(2, forward);
200EGG::Vector3f JugemMove::calcOscillation(
const EGG::Matrix34f &mat) {
201 constexpr f32 PHASE_X_STEP = 0.04f;
202 constexpr f32 PHASE_Y_STEP = 0.08f;
203 constexpr f32 AMPLITUDE_X = 80.0f;
204 constexpr f32 AMPLITUDE_Y = 30.0f;
206 m_phaseX += PHASE_X_STEP;
207 m_phaseY += PHASE_Y_STEP;
209 if (m_phaseX > F_TAU) {
213 if (m_phaseY > F_TAU) {
217 f32 cosX = EGG::Mathf::CosFIdx(RAD2FIDX * m_phaseX);
218 f32 sinY = EGG::Mathf::SinFIdx(RAD2FIDX * m_phaseY);
219 EGG::Vector3f v = EGG::Vector3f(AMPLITUDE_X * cosX, AMPLITUDE_Y * sinY, 0.0f);
221 return mat.ps_multVector(v);
225EGG::Matrix34f JugemMove::FUN_807202BC() {
226 constexpr EGG::Vector3f VEC_809C28E4 = EGG::Vector3f(0.0f, 100.0f, 0.0f);
228 m_dir = Interpolate(0.1f, m_dir, m_velDir);
229 f32 fVar2 = m_dir.normalise();
230 fVar2 = std::min(20.0f, fVar2);
233 EGG::Vector3f avStack_38 = m_dir * 1.5f;
234 EGG::Vector3f up = VEC_809C28E4 - avStack_38;
235 fVar2 = VEC_809C28E4.length();
238 dVar1 = fVar2 / dVar1;
242 if (up.squaredLength() <= std::numeric_limits<f32>::epsilon()) {
243 up = EGG::Vector3f::ey;
246 EGG::Matrix34f mat = EGG::Matrix34f::ident;
247 mat.setBase(0, EGG::Vector3f::ex);
249 mat.setBase(2, EGG::Vector3f::ez);