1#include "Game/MapObj/SpinDriverShootPath.hpp"
2#include "JSystem/JMath/JMath.hpp"
4SpinDriverShootPath::SpinDriverShootPath() {
7 mStartPosition.x = 0.0f;
8 mStartPosition.y = 0.0f;
9 mStartPosition.z = 0.0f;
10 mUsesParabolic =
false;
13void SpinDriverShootPath::init(
const JMapInfoIter &rIter) {
15 mUsesParabolic =
false;
18void SpinDriverShootPath::initUsingParabolic(
const JMapInfoIter &rIter,
const TVec3f &rStartingPosition) {
20 mUsesParabolic = mRailRider->getPointNum() <= 2;
26 setStartPosition(rStartingPosition);
29void SpinDriverShootPath::setStartPosition(
const TVec3f &rStartPos) {
31 TVec3f start(mRailRider->mStartPos);
32 TVec3f end(mRailRider->mEndPos);
33 mPath->initFromMaxHeight(rStartPos, end, start);
39 calcPosition(&position, 0.0f);
40 TVec3f startPos(rStartPos);
41 JMathInlineVEC::PSVECSubtract(startPos.toCVec(), position.toCVec(), startPos.toVec());
42 mStartPosition.setInlinePS(startPos);
45void SpinDriverShootPath::calcPosition(TVec3f *pOutPosition, f32 a2)
const {
47 mPath->calcPosition(pOutPosition, a2);
50 f32 length = mRailRider->getTotalLength();
51 mRailRider->calcPosAtCoord(pOutPosition, a2 * length);
52 f32 norm = MR::normalize(a2, 0.0f, 0.5f);
53 f32 easeOut = MR::getEaseOutValue(norm, 1.0f, 0.0f, 1.0f);
54 TVec3f pos(mStartPosition);
58 pOutPosition->add(pos);
62void SpinDriverShootPath::calcDirection(TVec3f *pOutDirection, f32 a2, f32 a3)
const {
84 calcPosition(&stack_20, v7);
86 calcPosition(&stack_14, v6);
87 TVec3f stack_8(stack_14);
88 JMathInlineVEC::PSVECSubtract(stack_8.toCVec(), stack_14.toCVec(), stack_8.toVec());
89 pOutDirection->set(stack_8);
90 MR::normalize(pOutDirection);
95f32 SpinDriverShootPath::getTotalLength()
const {
97 return mPath->getTotalLength(0x20);
100 return mRailRider->getTotalLength();