nuclear@0: #ifndef _CURVES_H_ nuclear@0: #define _CURVES_H_ nuclear@0: nuclear@0: #include nuclear@0: #include "n3dmath.h" nuclear@0: #include "linkedlist.h" nuclear@0: nuclear@0: class Curve { nuclear@0: protected: nuclear@0: LinkedList ControlPoints; nuclear@0: Vector2 *Samples; // used for parametrizing by arc length nuclear@0: int SampleCount; nuclear@0: bool ArcParametrize; nuclear@0: nuclear@0: Curve *ease_curve; // ease in/out curve (1D, x&z discarded) nuclear@0: int ease_sample_count, ease_step; nuclear@0: nuclear@0: void SampleArcLengths(); nuclear@0: float Parametrize(float t); nuclear@0: float Ease(float t); nuclear@0: nuclear@0: public: nuclear@0: std::string name; nuclear@0: nuclear@0: Curve(); nuclear@0: ~Curve(); nuclear@0: virtual void AddControlPoint(const Vector3 &cp); nuclear@0: nuclear@0: virtual int GetSegmentCount() const = 0; nuclear@0: virtual void SetArcParametrization(bool state); nuclear@0: virtual void SetEaseCurve(Curve *curve); nuclear@0: virtual void SetEaseSampleCount(int count); nuclear@0: nuclear@0: virtual Vector3 Interpolate(float t) = 0; nuclear@0: }; nuclear@0: nuclear@0: class BSpline : public Curve { nuclear@0: public: nuclear@0: virtual int GetSegmentCount() const; nuclear@0: virtual Vector3 Interpolate(float t); nuclear@0: }; nuclear@0: nuclear@0: class CatmullRomSpline : public Curve { nuclear@0: public: nuclear@0: virtual int GetSegmentCount() const; nuclear@0: virtual Vector3 Interpolate(float t); nuclear@0: }; nuclear@0: nuclear@0: nuclear@0: #endif // _CURVES_H_