Umasoft
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Groups Pages
AnimPath.h
1 //
2 // AnimPath.h
3 //
4 // Implementation animation path capabilities.
5 //
6 // Copyright (c) 2004-2011 Virtual Terrain Project
7 // Free for all uses, see license.txt for details.
8 //
9 
10 #ifndef ANIMPATHH
11 #define ANIMPATHH
12 
13 #include "Engine.h"
14 #include "vtdata/CubicSpline.h"
15 #include "vtdata/Features.h"
16 
19 
25 {
26  ControlPoint() {}
27 
30  m_Position(position),
31  m_Rotation() {}
32 
34  ControlPoint(const FPoint3 &position, const FQuat &rotation):
35  m_Position(position),
36  m_Rotation(rotation) {}
37 
38  void Interpolate(double ratio,const ControlPoint &first, const ControlPoint &second);
39  void GetMatrix(FMatrix4 &matrix, bool bPosOnly = false) const;
40 
41  FPoint3 m_Position;
42  FQuat m_Rotation;
43  int m_iIndex;
44 };
45 
56 class vtAnimPath : public osg::Referenced
57 {
58 public:
59  vtAnimPath();
60  vtAnimPath(const vtAnimPath &ap);
61  virtual ~vtAnimPath();
62 
64  bool SetProjection(const vtProjection &proj);
65 
67  bool GetMatrix(double time, FMatrix4 &matrix, bool bPosOnly) const
68  {
69  ControlPoint cp;
70  if (!GetInterpolatedControlPoint(time,cp))
71  return false;
72  cp.GetMatrix(matrix, bPosOnly);
73  return true;
74  }
75 
77  virtual bool GetInterpolatedControlPoint(double time, ControlPoint &controlPoint) const;
78 
80  void Insert(double time, const ControlPoint &controlPoint);
82  void RemovePoint(int index);
84  uint GetNumPoints() { return m_TimeControlPointMap.size(); }
85 
86  void SetTimeFromLinearDistance();
87  void ProcessPoints();
88 
89  double GetFirstTime() const;
90  double GetLastTime() const;
91  double GetPeriod() const { return GetLastTime()-GetFirstTime();}
92  float GetTotalTime();
93 
94  enum InterpMode
95  {
96  LINEAR,
97  CUBIC_SPLINE
98  };
106  void SetInterpMode(InterpMode mode) { m_InterpMode = mode; }
108  InterpMode GetInterpMode() const { return m_InterpMode; }
109 
110  typedef std::map<double,ControlPoint> TimeControlPointMap;
111 
112  TimeControlPointMap &GetTimeControlPointMap() { return m_TimeControlPointMap; }
113  const TimeControlPointMap &GetTimeControlPointMap() const { return m_TimeControlPointMap; }
114 
115  void Empty() { m_TimeControlPointMap.clear(); }
116  bool IsEmpty() const { return m_TimeControlPointMap.empty(); }
117 
124  void SetLoop(bool bFlag);
126  bool GetLoop() const { return m_bLoop; }
127 
128  bool Write(const char *fname);
129  bool Read(const char *fname);
130 
131  bool CreateFromLineString(const vtProjection &proj, vtFeatureSet *pSet);
132 
133 protected:
134  void InterpolateControlPoints(TimeControlPointMap::const_iterator &a,
135  TimeControlPointMap::const_iterator &b,
136  double time,
137  ControlPoint &c) const;
138  TimeControlPointMap m_TimeControlPointMap;
139 
140  InterpMode m_InterpMode;
141  CubicSpline m_Spline;
142  bool m_bLoop;
143  double m_fLoopSegmentTime;
144  ControlPoint m_LoopControlPoint;
145 
146  // For dealing with global projection
147  vtProjection m_proj;
148  OCT *m_pConvertToWGS;
149  OCT *m_pConvertFromWGS;
150  friend class AnimPathVisitor;
151 };
152 typedef osg::ref_ptr<vtAnimPath> vtAnimPathPtr;
153 
169 {
170 public:
172  m_pAnimationPath(NULL),
173  m_bContinuous(false),
174  m_fLastTime(FLT_MAX),
175  m_fTime(0.0f),
176  m_bPosOnly(false),
177  m_fSpeed(1.0f) {}
178 
180  m_pAnimationPath(ap),
181  m_bContinuous(false),
182  m_fLastTime(FLT_MAX),
183  m_fTime(0.0f),
184  m_bPosOnly(false),
185  m_fSpeed(1.0f) {}
186 
188  void SetAnimationPath(vtAnimPath* path) { m_pAnimationPath = path; }
190  vtAnimPath* GetAnimationPath() { return m_pAnimationPath; }
192  const vtAnimPath* GetAnimationPath() const { return m_pAnimationPath; }
193 
194  void UpdateTargets();
195  void Reset();
196 
198  void SetSpeed(float fSpeed) { m_fSpeed = fSpeed; }
200  float GetSpeed() const { return m_fSpeed; }
201 
205  void SetContinuous(bool bFlag) { m_bContinuous = bFlag; }
207  bool GetContinuous() const { return m_bContinuous; }
208 
211  void SetPosOnly(bool bFlag) { m_bPosOnly = bFlag; }
213  bool GetPosOnly() const { return m_bPosOnly; }
214 
216  virtual void Eval();
217  virtual void SetEnabled(bool bOn);
218 
222  void SetTime(float fTime) { m_fTime = fTime; }
225  float GetTime() { return m_fTime; }
226 
227 public:
228  vtAnimPathPtr m_pAnimationPath; // the engine owns the animpath
229  bool m_bContinuous;
230  float m_fLastTime;
231  float m_fTime;
232  bool m_bPosOnly;
233  float m_fSpeed;
234 };
235 
236 /* Convenience classes for organizing a set of animation paths with their engines. */
238 {
239  vtAnimPath *m_pAnim;
240  vtAnimPathEngine *m_pEngine;
241  vtString m_Name;
242 };
243 
244 class vtAnimContainer : public std::vector<vtAnimEntry>
245 {
246 public:
247  void SetEngineContainer(vtEngine *pContainer)
248  {
249  m_pParentEngine = pContainer;
250  }
251  void AppendEntry(const vtAnimEntry &pEntry);
252 
253 protected:
254  vtEnginePtr m_pParentEngine;
255 };
256  // nav
258 
259 #endif // ANIMPATHH
260