OSG  3.4.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
AnimationPath.h
Go to the documentation of this file.
1 /* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
2  *
3  * This library is open source and may be redistributed and/or modified under
4  * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
5  * (at your option) any later version. The full license is in LICENSE file
6  * included with this distribution, and on the openscenegraph.org website.
7  *
8  * This library is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * OpenSceneGraph Public License for more details.
12 */
13 
14 #ifndef OSG_ANIMATIONPATH
15 #define OSG_ANIMATIONPATH 1
16 
17 #include <map>
18 #include <istream>
19 #include <float.h>
20 
21 #include <osg/Matrixf>
22 #include <osg/Matrixd>
23 #include <osg/Quat>
24 #include <osg/Callback>
25 
26 namespace osg {
27 
33 class OSG_EXPORT AnimationPath : public virtual osg::Object
34 {
35  public:
36 
37  AnimationPath():_loopMode(LOOP) {}
38 
40  Object(ap,copyop),
41  _timeControlPointMap(ap._timeControlPointMap),
42  _loopMode(ap._loopMode) {}
43 
45 
47  {
48  public:
50  _scale(1.0,1.0,1.0) {}
51 
52  ControlPoint(const osg::Vec3d& position):
53  _position(position),
54  _rotation(),
55  _scale(1.0,1.0,1.0) {}
56 
57  ControlPoint(const osg::Vec3d& position, const osg::Quat& rotation):
58  _position(position),
59  _rotation(rotation),
60  _scale(1.0,1.0,1.0) {}
61 
62  ControlPoint(const osg::Vec3d& position, const osg::Quat& rotation, const osg::Vec3d& scale):
63  _position(position),
64  _rotation(rotation),
65  _scale(scale) {}
66 
67  void setPosition(const osg::Vec3d& position) { _position = position; }
68  const osg::Vec3d& getPosition() const { return _position; }
69 
70  void setRotation(const osg::Quat& rotation) { _rotation = rotation; }
71  const osg::Quat& getRotation() const { return _rotation; }
72 
73  void setScale(const osg::Vec3d& scale) { _scale = scale; }
74  const osg::Vec3d& getScale() const { return _scale; }
75 
76  inline void interpolate(float ratio,const ControlPoint& first, const ControlPoint& second)
77  {
78  float one_minus_ratio = 1.0f-ratio;
79  _position = first._position*one_minus_ratio + second._position*ratio;
80  _rotation.slerp(ratio,first._rotation,second._rotation);
81  _scale = first._scale*one_minus_ratio + second._scale*ratio;
82  }
83 
84  inline void interpolate(double ratio,const ControlPoint& first, const ControlPoint& second)
85  {
86  double one_minus_ratio = 1.0-ratio;
87  _position = first._position*one_minus_ratio + second._position*ratio;
88  _rotation.slerp(ratio,first._rotation,second._rotation);
89  _scale = first._scale*one_minus_ratio + second._scale*ratio;
90  }
91 
92  inline void getMatrix(Matrixf& matrix) const
93  {
94  matrix.makeRotate(_rotation);
95  matrix.preMultScale(_scale);
96  matrix.postMultTranslate(_position);
97  }
98 
99  inline void getMatrix(Matrixd& matrix) const
100  {
101  matrix.makeRotate(_rotation);
102  matrix.preMultScale(_scale);
103  matrix.postMultTranslate(_position);
104  }
105 
106  inline void getInverse(Matrixf& matrix) const
107  {
108  matrix.makeRotate(_rotation.inverse());
109  matrix.postMultScale(osg::Vec3d(1.0/_scale.x(),1.0/_scale.y(),1.0/_scale.z()));
110  matrix.preMultTranslate(-_position);
111  }
112 
113  inline void getInverse(Matrixd& matrix) const
114  {
115  matrix.makeRotate(_rotation.inverse());
116  matrix.postMultScale(osg::Vec3d(1.0/_scale.x(),1.0/_scale.y(),1.0/_scale.z()));
117  matrix.preMultTranslate(-_position);
118  }
119 
120  protected:
121 
125 
126  };
127 
128 
130  bool getMatrix(double time,Matrixf& matrix) const
131  {
132  ControlPoint cp;
133  if (!getInterpolatedControlPoint(time,cp)) return false;
134  cp.getMatrix(matrix);
135  return true;
136  }
137 
139  bool getMatrix(double time,Matrixd& matrix) const
140  {
141  ControlPoint cp;
142  if (!getInterpolatedControlPoint(time,cp)) return false;
143  cp.getMatrix(matrix);
144  return true;
145  }
146 
148  bool getInverse(double time,Matrixf& matrix) const
149  {
150  ControlPoint cp;
151  if (!getInterpolatedControlPoint(time,cp)) return false;
152  cp.getInverse(matrix);
153  return true;
154  }
155 
156  bool getInverse(double time,Matrixd& matrix) const
157  {
158  ControlPoint cp;
159  if (!getInterpolatedControlPoint(time,cp)) return false;
160  cp.getInverse(matrix);
161  return true;
162  }
163 
165  virtual bool getInterpolatedControlPoint(double time,ControlPoint& controlPoint) const;
166 
168  void insert(double time,const ControlPoint& controlPoint);
169 
170  double getFirstTime() const { if (!_timeControlPointMap.empty()) return _timeControlPointMap.begin()->first; else return 0.0;}
171  double getLastTime() const { if (!_timeControlPointMap.empty()) return _timeControlPointMap.rbegin()->first; else return 0.0;}
172  double getPeriod() const { return getLastTime()-getFirstTime();}
173 
174  enum LoopMode
175  {
178  NO_LOOPING
179  };
180 
181  void setLoopMode(LoopMode lm) { _loopMode = lm; }
182 
183  LoopMode getLoopMode() const { return _loopMode; }
184 
185 
186  typedef std::map<double,ControlPoint> TimeControlPointMap;
187 
188  void setTimeControlPointMap(TimeControlPointMap& tcpm) { _timeControlPointMap=tcpm; }
189 
190  TimeControlPointMap& getTimeControlPointMap() { return _timeControlPointMap; }
191 
192  const TimeControlPointMap& getTimeControlPointMap() const { return _timeControlPointMap; }
193 
194  bool empty() const { return _timeControlPointMap.empty(); }
195 
196  void clear() { _timeControlPointMap.clear(); }
197 
199  void read(std::istream& in);
200 
202  void write(std::ostream& out) const;
203 
205  void write(TimeControlPointMap::const_iterator itr, std::ostream& out) const;
206 
207  protected:
208 
209  virtual ~AnimationPath() {}
210 
211  TimeControlPointMap _timeControlPointMap;
213 
214 };
215 
216 
218 {
219  public:
220 
222  _pivotPoint(0.0,0.0,0.0),
223  _useInverseMatrix(false),
224  _timeOffset(0.0),
225  _timeMultiplier(1.0),
226  _firstTime(DBL_MAX),
227  _latestTime(0.0),
228  _pause(false),
229  _pauseTime(0.0) {}
230 
232  NodeCallback(apc,copyop),
233  _animationPath(apc._animationPath),
234  _pivotPoint(apc._pivotPoint),
235  _useInverseMatrix(apc._useInverseMatrix),
236  _timeOffset(apc._timeOffset),
237  _timeMultiplier(apc._timeMultiplier),
238  _firstTime(apc._firstTime),
239  _latestTime(apc._latestTime),
240  _pause(apc._pause),
241  _pauseTime(apc._pauseTime) {}
242 
243 
245 
247  AnimationPathCallback(AnimationPath* ap,double timeOffset=0.0,double timeMultiplier=1.0):
248  _animationPath(ap),
249  _pivotPoint(0.0,0.0,0.0),
250  _useInverseMatrix(false),
251  _timeOffset(timeOffset),
252  _timeMultiplier(timeMultiplier),
253  _firstTime(DBL_MAX),
254  _latestTime(0.0),
255  _pause(false),
256  _pauseTime(0.0) {}
257 
259  AnimationPathCallback(const osg::Vec3d& pivot,const osg::Vec3d& axis,float angularVelocity);
260 
261 
262  void setAnimationPath(AnimationPath* path) { _animationPath = path; }
263  AnimationPath* getAnimationPath() { return _animationPath.get(); }
264  const AnimationPath* getAnimationPath() const { return _animationPath.get(); }
265 
266  inline void setPivotPoint(const Vec3d& pivot) { _pivotPoint = pivot; }
267  inline const Vec3d& getPivotPoint() const { return _pivotPoint; }
268 
269  void setUseInverseMatrix(bool useInverseMatrix) { _useInverseMatrix = useInverseMatrix; }
270  bool getUseInverseMatrix() const { return _useInverseMatrix; }
271 
272  void setTimeOffset(double offset) { _timeOffset = offset; }
273  double getTimeOffset() const { return _timeOffset; }
274 
275  void setTimeMultiplier(double multiplier) { _timeMultiplier = multiplier; }
276  double getTimeMultiplier() const { return _timeMultiplier; }
277 
278 
279  virtual void reset();
280 
281  void setPause(bool pause);
282  bool getPause() const { return _pause; }
283 
287  virtual double getAnimationTime() const;
288 
290  virtual void operator()(Node* node, NodeVisitor* nv);
291 
292  void update(osg::Node& node);
293 
294  public:
295 
299  double _timeOffset;
301  double _firstTime;
302  double _latestTime;
303  bool _pause;
304  double _pauseTime;
305 
306  protected:
307 
309 
310 };
311 
312 }
313 
314 #endif
const Vec3d & getPivotPoint() const
#define OSG_EXPORT
Definition: Export.h:43
void postMultScale(const Vec3d &v)
Definition: Matrixd.h:755
AnimationPath(const AnimationPath &ap, const CopyOp &copyop=CopyOp::SHALLOW_COPY)
Definition: AnimationPath.h:39
void getMatrix(Matrixf &matrix) const
Definition: AnimationPath.h:92
void preMultTranslate(const Vec3d &v)
Definition: Matrixf.h:789
bool getInverse(double time, Matrixf &matrix) const
void setTimeMultiplier(double multiplier)
const osg::Vec3d & getScale() const
Definition: AnimationPath.h:74
virtual ~AnimationPath()
LoopMode getLoopMode() const
ControlPoint(const osg::Vec3d &position, const osg::Quat &rotation, const osg::Vec3d &scale)
Definition: AnimationPath.h:62
void postMultTranslate(const Vec3d &v)
Definition: Matrixf.h:817
void interpolate(double ratio, const ControlPoint &first, const ControlPoint &second)
Definition: AnimationPath.h:84
bool getMatrix(double time, Matrixd &matrix) const
double getTimeOffset() const
AnimationPath * getAnimationPath()
void setPosition(const osg::Vec3d &position)
Definition: AnimationPath.h:67
void postMultScale(const Vec3d &v)
Definition: Matrixf.h:859
double getLastTime() const
const AnimationPath * getAnimationPath() const
const osg::Quat & getRotation() const
Definition: AnimationPath.h:71
AnimationPathCallback(AnimationPath *ap, double timeOffset=0.0, double timeMultiplier=1.0)
double getPeriod() const
void interpolate(float ratio, const ControlPoint &first, const ControlPoint &second)
Definition: AnimationPath.h:76
const TimeControlPointMap & getTimeControlPointMap() const
#define META_Object(library, name)
Definition: Object.h:42
void preMultScale(const Vec3d &v)
Definition: Matrixf.h:845
std::map< double, ControlPoint > TimeControlPointMap
double getFirstTime() const
bool empty() const
ControlPoint(const osg::Vec3d &position)
Definition: AnimationPath.h:52
void setTimeControlPointMap(TimeControlPointMap &tcpm)
void getInverse(Matrixf &matrix) const
bool getInverse(double time, Matrixd &matrix) const
AnimationPathCallback(const AnimationPathCallback &apc, const CopyOp &copyop)
void setAnimationPath(AnimationPath *path)
bool getUseInverseMatrix() const
void getMatrix(Matrixd &matrix) const
Definition: AnimationPath.h:99
ref_ptr< AnimationPath > _animationPath
void postMultTranslate(const Vec3d &v)
Definition: Matrixd.h:713
ControlPoint(const osg::Vec3d &position, const osg::Quat &rotation)
Definition: AnimationPath.h:57
void preMultTranslate(const Vec3d &v)
Definition: Matrixd.h:685
Definition: Node.h:71
Definition: AlphaFunc.h:19
void setTimeOffset(double offset)
void setScale(const osg::Vec3d &scale)
Definition: AnimationPath.h:73
TimeControlPointMap & getTimeControlPointMap()
const osg::Vec3d & getPosition() const
Definition: AnimationPath.h:68
void setLoopMode(LoopMode lm)
TimeControlPointMap _timeControlPointMap
void setPivotPoint(const Vec3d &pivot)
void makeRotate(const Vec3f &from, const Vec3f &to)
void setUseInverseMatrix(bool useInverseMatrix)
Definition: Quat.h:29
void preMultScale(const Vec3d &v)
Definition: Matrixd.h:741
void getInverse(Matrixd &matrix) const
double getTimeMultiplier() const
void setRotation(const osg::Quat &rotation)
Definition: AnimationPath.h:70
void makeRotate(const Vec3f &from, const Vec3f &to)
bool getMatrix(double time, Matrixf &matrix) const