Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef __CS_SPLINE_H__
00020 #define __CS_SPLINE_H__
00021
00029 #include "csextern.h"
00030
00035 class CS_CRYSTALSPACE_EXPORT csSpline
00036 {
00037 protected:
00038 int dimensions;
00039 int num_points;
00040 float* time_points;
00041 float* points;
00042 bool precalculation_valid;
00043 int idx;
00044
00045 public:
00047 csSpline (int d, int p);
00048
00050 virtual ~csSpline ();
00051
00053 virtual void Setup (int d, int p);
00054
00056 int GetDimensionCount () const { return dimensions; }
00057
00059 int GetPointCount () const { return num_points; }
00060
00065 void InsertPoint (int idx);
00066
00070 void RemovePoint (int idx);
00071
00078 void SetTimeValues (float const* t);
00079
00083 void SetTimeValue (int idx, float t);
00084
00088 float const* GetTimeValues () const { return time_points; }
00089
00093 float GetTimeValue (int idx) const { return GetTimeValues ()[idx]; }
00094
00101 void SetDimensionValues (int dim, float const* d);
00102
00106 void SetDimensionValue (int dim, int idx, float d);
00107
00111 float const* GetDimensionValues (int dim) const
00112 { return &points[dim*num_points]; }
00113
00117 float GetDimensionValue (int dim, int idx) const
00118 {
00119 float const* d = &points[dim*num_points];
00120 return d[idx];
00121 }
00122
00126 void SetIndexValues (int idx, float const* d);
00127
00132 float* GetIndexValues (int idx) const;
00133
00137 virtual void Calculate (float time) = 0;
00138
00142 int GetCurrentIndex () const { return idx; }
00143
00148 virtual float GetInterpolatedDimension (int dim) const = 0;
00149 };
00150
00154 class CS_CRYSTALSPACE_EXPORT csCubicSpline : public csSpline
00155 {
00156 private:
00157 bool derivatives_valid;
00158 float* derivative_points;
00159
00160
00161
00162 float A, B, C, D;
00163
00164 private:
00165 void PrecalculateDerivatives (int dim);
00166 void PrecalculateDerivatives ();
00167
00168 public:
00170 csCubicSpline (int d, int p);
00171
00173 virtual ~csCubicSpline ();
00174
00175 virtual void Setup (int d, int p);
00176
00180 virtual void Calculate (float time);
00181
00186 virtual float GetInterpolatedDimension (int dim) const;
00187 };
00188
00192 class CS_CRYSTALSPACE_EXPORT csBSpline : public csSpline
00193 {
00194 private:
00195
00196
00197 float t;
00198
00199 protected:
00201 virtual float BaseFunction (int i, float t) const;
00202
00203 public:
00205 csBSpline (int d, int p);
00206
00208 virtual ~csBSpline ();
00209
00213 virtual void Calculate (float time);
00214
00219 virtual float GetInterpolatedDimension (int dim) const;
00220 };
00221
00225 class CS_CRYSTALSPACE_EXPORT csCatmullRomSpline : public csBSpline
00226 {
00227 protected:
00229 virtual float BaseFunction (int i, float t) const;
00230
00231 public:
00233 csCatmullRomSpline (int d, int p) : csBSpline (d, p) { }
00234
00236 virtual ~csCatmullRomSpline () {}
00237
00239 csCatmullRomSpline * Clone();
00240 };
00241
00244 #endif // __CS_SPLINE_H__