KrisLibrary  1.0.0
path.h
1 #ifndef SPLINE_PATH_H
2 #define SPLINE_PATH_H
3 
6 #include "spline.h"
7 
8 /*************************************************************
9  * PathTranslationCardinal
10  *
11  * A translation path with a tension parameter.
12  *
13  *************************************************************/
14 class PathTranslationCardinal : public SplineCardinal<Vector3>
15 {
16 public:
19 
20  void setKey(int k, float time, const Vector3& pos, float tension = 0.5);
21 };
22 
23 /*************************************************************
24  * PathTranslationBezier
25  *
26  * A cubic bezier translation path.
27  *
28  *************************************************************/
30 {
31 public:
34 
35  void setKey(int k, float time, const Vector3& pos);
36  inline void setCPIn(int k, const Vector3& pos) { getCPIn(k) = pos; }
37  inline void setCPOut(int k, const Vector3& pos) { getCPOut(k) = pos; }
38  void smoothKey(int k, float tension = 0.5, bool smooth_wrap = false);
39  void setKeyInTangent(int k, const Vector3& tang);
40  void setKeyOutTangent(int k, const Vector3& tang);
41 };
42 
43 /*************************************************************
44  * PathTranslationTCB
45  *
46  * A translation path with tension, continuity, bias parameters.
47  *
48  *************************************************************/
49 struct PathTranslationTCB : public SplineTCB<Vector3>
50 {
53 
54  void setKey(int k, float time, const Vector3& pos,
55  float tension=0.5, float continuity=1.0, float bias=0.0);
56 };
57 
58 /*************************************************************
59  * PathRotation
60  *
61  * A cubic bezier rotation path.
62  *
63  *************************************************************/
64 class PathRotation : public SplineBezierCubic<Quaternion>
65 {
66 public:
67  PathRotation();
68  PathRotation(const PathRotation& rhs);
69 
70  void setKey(int k, float time, const Quaternion& rot);
71  void smoothKey(int k, float tension = 0.5, bool smooth_wrap = false);
72 
73 protected:
74  virtual void eval(int seg, float u, Quaternion& out) const;
75 };
76 
77 /**********************************************************
78  * PathCoordinate
79  *
80  * A template class that defines a rigid transformation
81  * path in 3-space.
82  * PathTrans must implement the functions in
83  * SplineBase<Vector3>, and PathRot must implement the
84  * functions in SplineBase<Quaternion>
85  **********************************************************/
86 template <class PathRot,class PathTrans>
88 {
89 public:
90  PathCoordinate() { }
91  PathCoordinate(const PathCoordinate& rhs) { operator=(rhs); }
92 
93  SplineTimeBase::TimeStatus eval(float time, QuaternionRotation& r, Vector3& t) const
94  {
95  SplineIterator ti(time);
96  SplineIterator ri(time);
97  return eval(ri,ti,r,t);
98  }
99 
100  SplineTimeBase::TimeStatus eval(SplineIterator& ri, SplineIterator& ti, QuaternionRotation& r, Vector3& t) const
101  {
102  assert(ri.t==ti.t);
103  rotation.evaluate(ri,r);
104  translation.evaluate(ti,t);
105 
106  if(ri.t < beginTime()) return SplineTimeBase::Before;
107  if(ri.t > endTime()) return SplineTimeBase::After;
108  return SplineTimeBase::During;
109  }
110 
111  inline float beginTime() const { return min(translation.beginTime(),rotation.beginTime()); }
112  inline float endTime() const { return max(translation.endTime(),rotation.endTime()); }
113  inline float length() const { return endTime() - beginTime();}
114 
115  PathRot rotation;
116  PathTrans translation;
117 };
118 
119 #endif
A 3D vector class.
Definition: math3d/primitives.h:136
Definition: path.h:49
Definition: spline.h:168
3D rotation representations.
Class declarations for useful 3D math types.
Definition: path.h:64
Quaternion, a.k.a. Euler parameter, 3D rotation parameterization.
Definition: rotation.h:131
Definition: spline.h:231
Definition: spline.h:203
Definition: path.h:14
Complex quaternion class (w + ix + jy + kz).
Definition: complex.h:133
Definition: spline.h:13
Definition: path.h:29
Definition: path.h:87