#pragma once #include #include "RetroTypes.hpp" #include #include #include #include namespace metaforce { class CMayaSplineKnot { float x0_time; float x4_amplitude; u8 x8_; u8 x9_; bool xa_24_dirty : 1 = true; u8 xb_; zeus::CVector2f xc_cachedTangentA; zeus::CVector2f x14_cachedTangentB; public: CMayaSplineKnot(CInputStream& in); float GetTime() const { return x0_time; } float GetAmplitude() const { return x4_amplitude; } u8 GetX8() const { return x8_; } u8 GetX9() const { return x9_; } void GetTangents(CMayaSplineKnot* prev, CMayaSplineKnot* next, zeus::CVector2f& tangentA, zeus::CVector2f& tangentB); void CalculateTangents(CMayaSplineKnot* prev, CMayaSplineKnot* next); }; class CMayaSpline { u32 x0_preInfinity; u32 x4_postInfinity; std::vector x8_knots; u32 x18_clampMode; float x1c_minAmplitudeTime; float x20_maxAmplitudeTime; s32 x24_chachedKnotIndex = -1; s32 x28_ = -1; bool x2c_24_dirty = false; float x30_cachedMinTime; float x34_cachedHermitCoefs[4]; public: CMayaSpline(CInputStream& in, s32 count); u32 GetKnotCount() const { return x8_knots.size(); } const std::vector& GetKnots() const { return x8_knots; } float GetMinTime() const; float GetMaxTime() const; float GetDuration() const; float EvaluateAt(float time); float EvaluateAtUnclamped(float time); float EvaluateInfinities(float time, bool Pre); float EvaluateHermite(float time); bool FindKnot(float time, int& knotIndex); void FindControlPoints(s32 knotIndex, rstl::reserved_vector& controlPoints); void CalculateHermiteCoefficients(const rstl::reserved_vector& controlPoits, float* coefs); }; } // namespace metaforce