1#include "Game/LiveActor/RailRider.hpp"
11 mCurDirection.x = 1.0f;
12 mCurDirection.y = 0.0f;
13 mCurDirection.z = 0.0f;
24 MR::getRailInfo(&iter, &info, rIter);
25 initBezierRail(iter, info);
28RailRider::RailRider(s32 a1, s32 a2) {
29 mBezierRail =
nullptr;
36 mCurDirection.x = 1.0f;
37 mCurDirection.y = 0.0f;
38 mCurDirection.z = 0.0f;
49 MR::getCameraRailInfo(&iter, &info, a1, a2);
50 initBezierRail(iter, info);
53void RailRider::move() {
61 mCoord = mBezierRail->normalizePos(mCoord, 1);
65void RailRider::moveToNearestPos(
const TVec3f &rPos) {
66 mCoord = mBezierRail->getNearestRailPosCoord(rPos);
72void RailRider::moveToNextPoint() {
73 mCoord = mBezierRail->getRailPosCoord(getNextPointNo());
77void RailRider::reverse() {
78 if (mIsNotReverse !=
false) {
79 mIsNotReverse =
false;
88void RailRider::calcPosAtCoord(TVec3f *pOutVec, f32 a2)
const {
89 mBezierRail->calcPos(pOutVec, a2);
92void RailRider::calcDirectionAtCoord(TVec3f *pOutVec, f32 a2)
const {
93 mBezierRail->calcDirection(pOutVec, a2);
96f32 RailRider::calcNearestPos(
const TVec3f &rPos)
const {
97 return mBezierRail->getNearestRailPosCoord(rPos);
100f32 RailRider::getTotalLength()
const {
101 return mBezierRail->getTotalLength();
104f32 RailRider::getPartLength(
int idx)
const {
105 return mBezierRail->getPartLength(idx);
108bool RailRider::isLoop()
const {
109 return mBezierRail->mIsClosed;
113bool RailRider::isReachedGoal()
const {
114 if (mBezierRail->mIsClosed) {
122 if (MR::isNearZero(mLength - mBezierRail->getTotalLength(), 0.0f)) {
129 if (!mIsNotReverse && MR::isNearZero(mLength, 0.001f)) {
142bool RailRider::isReachedEdge()
const {
145 if (mBezierRail->mIsClosed) {
151 if (!MR::isNearZero(mCoord, 0.001f)) {
152 f32 val = mCoord - mBezierRail->getTotalLength();
153 if (!MR::isNearZero(val, 0.001f)) {
163void RailRider::setCoord(f32 coord) {
165 mBezierRail->normalizePos(coord, 1);
170void RailRider::setSpeed(f32 coord) {
174bool RailRider::getRailArgWithInit(
const char *pStr, s32 *pOut)
const {
176 if (!mBezierRail->mIter->getValue<s32>(pStr, &val)) {
184bool RailRider::getRailArgNoInit(
const char *pStr, s32 *pOut)
const {
186 if (!mBezierRail->mIter->getValue<s32>(pStr, &val)) {
198f32 RailRider::getNextPointCoord()
const {
199 return mBezierRail->getRailPosCoord(getNextPointNo());
202f32 RailRider::getCurrentPointCoord()
const {
203 return mBezierRail->getRailPosCoord(mCurPoint);
206s32 RailRider::getPointNum()
const {
207 return mBezierRail->mPointNum;
210void RailRider::copyPointPos(TVec3f *pOut, s32 pointNum)
const {
212 iter.mInfo =
nullptr;
214 mBezierRail->calcRailCtrlPointIter(&iter, pointNum);
215 MR::getRailPointPos0(iter, pOut);
218f32 RailRider::getPointCoord(s32 idx)
const {
219 return mBezierRail->getRailPosCoord(idx);
226 setCoord(mBezierRail->getTotalLength());
227 mEndPos.set(mCurPos);
229 mStartPos.set(mCurPos);
233bool RailRider::getPointArgS32NoInit(
const char *pStr, s32 *pOut, s32 pointNum)
const {
236 iter.mInfo =
nullptr;
239 mBezierRail->calcRailCtrlPointIter(&iter, pointNum);
241 iter.getValue<s32>(pStr, &val);
251bool RailRider::getPointArgS32WithInit(
const char *pStr, s32 *pOut, s32 pointNum)
const {
253 iter.mInfo =
nullptr;
255 mBezierRail->calcRailCtrlPointIter(&iter, pointNum);
256 iter.getValue<s32>(pStr, pOut);
260bool RailRider::getCurrentPointArgS32NoInit(
const char *pStr, s32 *pOut)
const {
263 iter.mInfo =
nullptr;
266 mBezierRail->calcRailCtrlPointIter(&iter, mCurPoint);
268 iter.getValue<s32>(pStr, &val);
278bool RailRider::getCurrentPointArgS32WithInit(
const char *pStr, s32 *pOut)
const {
280 iter.mInfo =
nullptr;
282 mBezierRail->calcRailCtrlPointIter(&iter, mCurPoint);
283 iter.getValue<s32>(pStr, pOut);
287bool RailRider::getNextPointArgS32NoInit(
const char *pStr, s32 *pOut)
const {
290 iter.mInfo =
nullptr;
293 mBezierRail->calcRailCtrlPointIter(&iter, getNextPointNo());
295 iter.getValue<s32>(pStr, &val);
305bool RailRider::getNextPointArgS32WithInit(
const char *pStr, s32 *pOut)
const {
307 iter.mInfo =
nullptr;
309 mBezierRail->calcRailCtrlPointIter(&iter, getNextPointNo());
310 iter.getValue<s32>(pStr, pOut);
316void RailRider::syncPosDir() {
317 if (0.0f < mCoord && mCoord < mBezierRail->getTotalLength()) {
318 mBezierRail->calcPosDir(&mCurPos, &mCurDirection, mCoord);
321 if (mCoord == 0.0f) {
322 mBezierRail->calcPos(&mCurPos, mCoord);
323 mBezierRail->calcDirection(&mCurDirection, 0.1f);
326 mBezierRail->calcPos(&mCurPos, mCoord);
327 mBezierRail->calcDirection(&mCurDirection, (mBezierRail->getTotalLength() - 0x1f));
331 if (!mIsNotReverse) {
332 mCurDirection.x *= -1.0f;
333 mCurDirection.y *= -1.0f;
334 mCurDirection.z *= -1.0f;
338 iter.mInfo =
nullptr;
340 mBezierRail->calcCurrentRailCtrlPointIter(&iter, mCoord, mIsNotReverse);
341 iter.getValue<s32>(
"id", &mCurPoint);