#include "Game/Map/RailPart.hpp" #include "JSystem/JMath/JMath.hpp" RailPart::RailPart() : mRailPartLinear(0), mRailPartBezier(0) { } void RailPart::init(const TVec3f &a1, const TVec3f &a2, const TVec3f &a3, const TVec3f &a4) { if ((!a1.epsilonEquals(a2, 0.1f)) || (a4.epsilonEquals(a3, 0.1f))) { mRailPartLinear = new LinearRailPart(); mRailPartLinear->set(a1, a4); } else { initForBezier(a1, a2, a3, a4); } } void RailPart::initForBezier(const TVec3f &a1, const TVec3f &a2, const TVec3f &a3, const TVec3f &a4) { mRailPartBezier = new BezierRailPart(); mRailPartBezier->set(a1, a2, a3, a4); } void RailPart::calcPos(TVec3f *pOut, f32 a2) const { if (mRailPartLinear) { JMAVECScaleAdd(mRailPartLinear->_C.toCVec(), mRailPartLinear->_0.toCVec(), pOut->toVec(), a2); } else { mRailPartBezier->calcPos(pOut, a2); } } void RailPart::calcVelocity(TVec3f *pOut, f32 a2) const { if (mRailPartLinear) { pOut->set(mRailPartLinear->_C); } else { mRailPartBezier->calcVelocity(pOut, a2); } } f32 RailPart::getLength(f32 a1, f32 a2, int a3) const { if (mRailPartLinear) { return (mRailPartLinear->_18 * (a2 - a1)); } return mRailPartBezier->getLength(a1, a2, a3); } f32 RailPart::getTotalLength() const { if (mRailPartLinear) { return mRailPartLinear->_18; } return mRailPartBezier->mLength; } f32 RailPart::getParam(f32 a1) const { if (mRailPartLinear) { return (a1 / mRailPartLinear->_18); } return mRailPartBezier->getParam(a1); } f32 RailPart::getNearestParam(const TVec3f &rPos, f32 a2) const { if (mRailPartLinear) { return mRailPartLinear->getNearestParam(rPos, a2); } return mRailPartBezier->getNearestParam(rPos, a2); } void LinearRailPart::set(const TVec3f &a1, const TVec3f &a2) { _0 = a1; _C = a2; _C -= a1; _18 = C_VECMag((const Vec *)&_C); } /* f32 LinearRailPart::getNearestParam(const register TVec3f &a1, f32 a2) const { } */