1#include "Game/Map/BezierRail.hpp"
2#include "Game/Map/RailPart.hpp"
3#include "Game/Util/MathUtil.hpp"
4#include <revolution/mtx.h>
6#include "JSystem/JGeometry/TMatrix.hpp"
9 void calcRailDirection(TVec3f *pOut,
const RailPart *pRailPart, f32 a3) {
10 pRailPart->calcVelocity(pOut, a3);
14 if (MR::isNearZero(*pOut, 0.001f)) {
16 v8 = 0.0099999998f + a3;
20 a3 = a3 - 0.0099999998f;
24 pRailPart->calcPos(&pos, a3);
25 pRailPart->calcPos(pOut, v8);
34void BezierRailPart::set(
const TVec3f &a1,
const TVec3f &a2,
const TVec3f &a3,
const TVec3f &a4) {
35 TVec3f v21, v20, v19, v18, v17, v16;
66 mLength = getLength(0.0f, 1.0f, 0xA);
69void BezierRailPart::calcPos(TVec3f *pOut, f32 a2)
const {
71 f32 v10 = ((3.0f * a2) * a2);
72 f32 v9 = (a2 * (a2 * a2));
88void BezierRailPart::calcVelocity(TVec3f *pOut, f32 a2)
const {
108f32 BezierRail::getTotalLength()
const {
112f32 BezierRail::getPartLength(
int idx)
const {
113 return mRailParts[idx].getTotalLength();
116void BezierRail::calcPos(TVec3f *pOut, f32 a2)
const {
120 getIncludedSection(&part, ¶m, a2, 1);
121 part->calcPos(pOut, part->getParam(param));
124void BezierRail::calcDirection(TVec3f *pOut, f32 a2)
const {
128 getIncludedSection(&part, ¶m, a2, 1);
129 calcRailDirection(pOut, part, part->getParam(param));
132void BezierRail::calcPosDir(TVec3f *pPos, TVec3f *pDir, f32 a3)
const {
136 getIncludedSection(&part, ¶m, a3, 1);
137 f32 val = part->getParam(param);
138 part->calcPos(pPos, val);
139 calcRailDirection(pDir, part, val);
144f32 BezierRail::getNearestRailPosCoord(
const TVec3f &a1)
const {
148 f32 length = part->getTotalLength();
149 f32 nearestParam = part->getNearestParam(a1, 100.0f / length);
152 part->calcPos(&pos, nearestParam);
155 f32 sqrt = pos.squared();
157 for (
int i = 1; i < _8; i++) {
160 f32 curPartLength = curPart->getTotalLength();
161 f32 curNearParam = curPart->getNearestParam(a1, 100.0f / curPartLength);
162 curPart->calcPos(&pos, curNearParam);
165 f32 curSqrt = pos.squared();
167 if (curSqrt < sqrt) {
170 nearestParam = curNearParam;
174 f32 val = !idx ? 0.0f : _10[idx - 1];
175 return (val + mRailParts[idx].getLength(0.0f, nearestParam, 10));
179f32 BezierRail::getRailPosCoord(
int idx)
const {
184 if (mIsClosed || mPointNum - 1 != idx) {
189 return getTotalLength();
192void BezierRail::calcCurrentRailCtrlPointIter(
JMapInfoIter *pIter, f32 a2,
bool a3)
const {
193 int idx = getCurrentCtrlPointIndex(a2, a3);
194 calcRailCtrlPointIter(pIter, idx);
197void BezierRail::calcRailCtrlPointIter(
JMapInfoIter *pIter,
int idx)
const {