1#include "Game/Boss/SkeletalFishRailControl.hpp"
3SkeletalFishRailControl::SkeletalFishRailControl() {
18 MR::setRailCoord(a2, 0.0f);
19 MR::setRailDirectionToEnd(_4);
26 MR::setRailCoord(_8, 0.0f);
27 MR::setRailDirectionToEnd(_8);
31void SkeletalFishRailControl::update() {
33 MR::setRailCoordSpeed(_4, _14);
36 MR::setRailCoordSpeed(_8, _14);
41 f32 railLength = MR::getRailTotalLength(_4);
42 f32 v3 = ((_14 + MR::getRailCoord(_4) - railLength));
44 f32 coord = MR::calcNearestRailCoord(_8, MR::getRailPointPosEnd(_4));
47 MR::setRailCoord(_8, _C);
54 if (_C - _10 >= MR::getRailTotalLength(_8)) {
66 MR::moveRailRider(_4);
70 MR::getRailTotalLength(_8);
71 MR::setRailCoord(_8, _C);
74 if (MR::getRailCoord(_8) + MR::getRailCoordSpeed(_8) > MR::getRailTotalLength(_8)) {
78 MR::moveRailRider(_8);
87 f32 coord = MR::getRailCoord(_4);
89 pOutInfo->_4 = coord - a2;
96 f32 railLength = MR::getRailTotalLength(_4);
97 f32 diff = _10 - dist;
99 dist = railLength - diff;
111 f32 coord = MR::getRailCoord(_8);
113 pOutInfo->_4 = coord - a2;
119void SkeletalFishRailControl::getPos(TVec3f *pOut, f32 a2) {
121 getRailInfo(&info, a2);
123 if (info._4 < 0.0f && !MR::isLoopRail(info._0)) {
124 MR::calcRailPosAtCoord(pOut, info._0, 0.0f);
126 MR::calcRailDirectionAtCoord(&railDir, info._0, 0.0f);
127 railDir.scale(info._4);
132 MR::calcRailPosAtCoord(pOut, info._0, info._4);
136void SkeletalFishRailControl::getMtx(TPos3f *pOut, f32 a2) {
139 getRailInfo(&normalRailInfo, a2);
140 getRailInfo(&distRailInfo, a2 - 1000.0f);
150 if (normalRailInfo._4 < 0.0f && !MR::isLoopRail(normalRailInfo._0)) {
151 MR::calcRailPosAtCoord(&railPos, normalRailInfo._0, 0.0f);
152 MR::calcRailDirectionAtCoord(&railDir, normalRailInfo._0, 0.0f);
153 stack_3C.setInlinePS_2(railDir);
154 stack_3C.scale(normalRailInfo._4);
155 railPos.add(stack_3C);
158 MR::calcRailPosAtCoord(&railPos, normalRailInfo._0, normalRailInfo._4);
159 MR::calcRailDirectionAtCoord(&railDir, normalRailInfo._0, normalRailInfo._4);
162 MR::normalizeOrZero(&railDir);
163 MR::calcGravityVector(normalRailInfo._0, railPos, &gravityVec,
nullptr, 0);
164 negVector.negateInline(gravityVec);
165 PSVECCrossProduct(negVector.toCVec(), railDir.toCVec(), v15.toVec());
166 PSVECCrossProduct(railDir.toCVec(), v15.toCVec(), v14.toVec());
168 MR::normalizeOrZero(&v15);
169 MR::normalizeOrZero(&v14);
170 MR::normalizeOrZero(&railDir);
172 pOut->mMtx[0][0] = v15.x;
173 pOut->mMtx[1][0] = v15.y;
174 pOut->mMtx[2][0] = v15.z;
175 pOut->mMtx[0][1] = v14.x;
176 pOut->mMtx[1][1] = v14.y;
177 pOut->mMtx[2][1] = v14.z;
178 pOut->mMtx[0][2] = railDir.x;
179 pOut->mMtx[1][2] = railDir.y;
180 pOut->mMtx[2][2] = railDir.z;
181 pOut->mMtx[0][3] = railPos.x;
182 pOut->mMtx[1][3] = railPos.y;
183 pOut->mMtx[2][3] = railPos.z;
The basis of a drawable actor that can contain states (see: Nerve)