2 // animation.hxx - classes to manage model animation.
3 // Written by David Megginson, started 2002.
5 // This file is in the Public Domain, and comes with no warranty.
7 #ifndef _SG_ANIMATION_HXX
8 #define _SG_ANIMATION_HXX 1
11 # error This library requires C++
20 #include <osg/ref_ptr>
21 #include <osg/AlphaFunc>
23 #include <osg/Material>
25 #include <osg/NodeCallback>
26 #include <osg/NodeVisitor>
27 #include <osg/StateSet>
28 #include <osg/Texture2D>
31 #include <simgear/props/props.hxx>
32 #include <simgear/misc/sg_path.hxx>
34 #include <simgear/math/interpolater.hxx>
35 #include <simgear/scene/model/persparam.hxx>
36 #include <simgear/scene/util/SGNodeMasks.hxx>
42 // Don't pull in the headers, since we don't need them here.
46 // Has anyone done anything *really* stupid, like making min and max macros?
56 //////////////////////////////////////////////////////////////////////
57 // Helper classes, FIXME: factor out
58 //////////////////////////////////////////////////////////////////////
60 class SGDoubleValue : public SGReferenced {
62 virtual ~SGDoubleValue() {}
63 virtual double getValue() const = 0;
67 //////////////////////////////////////////////////////////////////////
68 // Base class for animation installers
69 //////////////////////////////////////////////////////////////////////
71 class SGAnimation : protected osg::NodeVisitor {
73 SGAnimation(const SGPropertyNode* configNode, SGPropertyNode* modelRoot);
74 virtual ~SGAnimation();
76 static bool animate(osg::Node* node, const SGPropertyNode* configNode,
77 SGPropertyNode* modelRoot);
80 void apply(osg::Node* node);
82 virtual void install(osg::Node& node);
83 virtual osg::Group* createAnimationGroup(osg::Group& parent);
85 virtual void apply(osg::Group& group);
87 void removeMode(osg::Node& node, osg::StateAttribute::GLMode mode);
88 void removeAttribute(osg::Node& node, osg::StateAttribute::Type type);
89 void removeTextureMode(osg::Node& node, unsigned unit,
90 osg::StateAttribute::GLMode mode);
91 void removeTextureAttribute(osg::Node& node, unsigned unit,
92 osg::StateAttribute::Type type);
93 void setRenderBinToInherit(osg::Node& node);
94 void cloneDrawables(osg::Node& node);
96 std::string getType() const
97 { return std::string(_configNode->getStringValue("type", "")); }
99 const SGPropertyNode* getConfig() const
100 { return _configNode; }
101 SGPropertyNode* getModelRoot() const
102 { return _modelRoot; }
104 const SGCondition* getCondition() const;
107 void installInGroup(const std::string& name, osg::Group& group,
108 osg::ref_ptr<osg::Group>& animationGroup);
110 class RemoveModeVisitor;
111 class RemoveAttributeVisitor;
112 class RemoveTextureModeVisitor;
113 class RemoveTextureAttributeVisitor;
114 class BinToInheritVisitor;
115 class DrawableCloneVisitor;
119 SGSharedPtr<SGPropertyNode const> _configNode;
120 SGPropertyNode* _modelRoot;
121 std::list<std::string> _objectNames;
122 std::list<osg::ref_ptr<osg::Node> > _installedAnimations;
128 //////////////////////////////////////////////////////////////////////
129 // Null animation installer
130 //////////////////////////////////////////////////////////////////////
132 class SGGroupAnimation : public SGAnimation {
134 SGGroupAnimation(const SGPropertyNode*, SGPropertyNode*);
135 virtual osg::Group* createAnimationGroup(osg::Group& parent);
139 //////////////////////////////////////////////////////////////////////
140 // Translate animation installer
141 //////////////////////////////////////////////////////////////////////
143 class SGTranslateAnimation : public SGAnimation {
145 SGTranslateAnimation(const SGPropertyNode* configNode,
146 SGPropertyNode* modelRoot);
147 virtual osg::Group* createAnimationGroup(osg::Group& parent);
149 class UpdateCallback;
151 SGSharedPtr<const SGCondition> _condition;
152 SGSharedPtr<const SGDoubleValue> _animationValue;
154 double _initialValue;
158 //////////////////////////////////////////////////////////////////////
159 // Rotate/Spin animation installer
160 //////////////////////////////////////////////////////////////////////
162 class SGRotateAnimation : public SGAnimation {
164 SGRotateAnimation(const SGPropertyNode* configNode,
165 SGPropertyNode* modelRoot);
166 virtual osg::Group* createAnimationGroup(osg::Group& parent);
168 class UpdateCallback;
169 class SpinUpdateCallback;
171 SGSharedPtr<const SGCondition> _condition;
172 SGSharedPtr<const SGDoubleValue> _animationValue;
175 double _initialValue;
180 //////////////////////////////////////////////////////////////////////
181 // Scale animation installer
182 //////////////////////////////////////////////////////////////////////
184 class SGScaleAnimation : public SGAnimation {
186 SGScaleAnimation(const SGPropertyNode* configNode,
187 SGPropertyNode* modelRoot);
188 virtual osg::Group* createAnimationGroup(osg::Group& parent);
190 class UpdateCallback;
192 SGSharedPtr<const SGCondition> _condition;
193 SGSharedPtr<const SGDoubleValue> _animationValue[3];
194 SGVec3d _initialValue;
199 //////////////////////////////////////////////////////////////////////
200 // dist scale animation installer
201 //////////////////////////////////////////////////////////////////////
203 class SGDistScaleAnimation : public SGAnimation {
205 SGDistScaleAnimation(const SGPropertyNode* configNode,
206 SGPropertyNode* modelRoot);
207 virtual osg::Group* createAnimationGroup(osg::Group& parent);
213 //////////////////////////////////////////////////////////////////////
214 // dist scale animation installer
215 //////////////////////////////////////////////////////////////////////
217 class SGFlashAnimation : public SGAnimation {
219 SGFlashAnimation(const SGPropertyNode* configNode,
220 SGPropertyNode* modelRoot);
221 virtual osg::Group* createAnimationGroup(osg::Group& parent);
227 //////////////////////////////////////////////////////////////////////
228 // dist scale animation installer
229 //////////////////////////////////////////////////////////////////////
231 class SGBillboardAnimation : public SGAnimation {
233 SGBillboardAnimation(const SGPropertyNode* configNode,
234 SGPropertyNode* modelRoot);
235 virtual osg::Group* createAnimationGroup(osg::Group& parent);
241 //////////////////////////////////////////////////////////////////////
242 // Range animation installer
243 //////////////////////////////////////////////////////////////////////
245 class SGRangeAnimation : public SGAnimation {
247 SGRangeAnimation(const SGPropertyNode* configNode,
248 SGPropertyNode* modelRoot);
249 virtual osg::Group* createAnimationGroup(osg::Group& parent);
251 class UpdateCallback;
252 SGSharedPtr<const SGCondition> _condition;
253 SGSharedPtr<const SGDoubleValue> _minAnimationValue;
254 SGSharedPtr<const SGDoubleValue> _maxAnimationValue;
255 SGVec2d _initialValue;
259 //////////////////////////////////////////////////////////////////////
260 // Select animation installer
261 //////////////////////////////////////////////////////////////////////
263 class SGSelectAnimation : public SGAnimation {
265 SGSelectAnimation(const SGPropertyNode* configNode,
266 SGPropertyNode* modelRoot);
267 virtual osg::Group* createAnimationGroup(osg::Group& parent);
269 class UpdateCallback;
273 //////////////////////////////////////////////////////////////////////
274 // Alpha test animation installer
275 //////////////////////////////////////////////////////////////////////
277 class SGAlphaTestAnimation : public SGAnimation {
279 SGAlphaTestAnimation(const SGPropertyNode* configNode,
280 SGPropertyNode* modelRoot);
281 virtual void install(osg::Node& node);
285 //////////////////////////////////////////////////////////////////////
286 // Blend animation installer
287 //////////////////////////////////////////////////////////////////////
289 class SGBlendAnimation : public SGAnimation {
291 SGBlendAnimation(const SGPropertyNode* configNode,
292 SGPropertyNode* modelRoot);
293 virtual osg::Group* createAnimationGroup(osg::Group& parent);
294 virtual void install(osg::Node& node);
297 class UpdateCallback;
298 SGSharedPtr<SGDoubleValue> _animationValue;
302 //////////////////////////////////////////////////////////////////////
303 // Timed animation installer
304 //////////////////////////////////////////////////////////////////////
306 class SGTimedAnimation : public SGAnimation {
308 SGTimedAnimation(const SGPropertyNode* configNode,
309 SGPropertyNode* modelRoot);
310 virtual osg::Group* createAnimationGroup(osg::Group& parent);
312 class UpdateCallback;
316 //////////////////////////////////////////////////////////////////////
317 // Shadow animation installer
318 //////////////////////////////////////////////////////////////////////
320 class SGShadowAnimation : public SGAnimation {
322 SGShadowAnimation(const SGPropertyNode* configNode,
323 SGPropertyNode* modelRoot);
324 virtual osg::Group* createAnimationGroup(osg::Group& parent);
326 class UpdateCallback;
330 //////////////////////////////////////////////////////////////////////
331 // TextureTransform animation
332 //////////////////////////////////////////////////////////////////////
334 class SGTexTransformAnimation : public SGAnimation {
336 SGTexTransformAnimation(const SGPropertyNode* configNode,
337 SGPropertyNode* modelRoot);
338 virtual osg::Group* createAnimationGroup(osg::Group& parent);
343 class UpdateCallback;
344 void appendTexTranslate(const SGPropertyNode* config,
345 UpdateCallback* updateCallback);
346 void appendTexRotate(const SGPropertyNode* config,
347 UpdateCallback* updateCallback);
351 //////////////////////////////////////////////////////////////////////
353 //////////////////////////////////////////////////////////////////////
355 class SGShaderAnimation : public SGAnimation {
357 SGShaderAnimation(const SGPropertyNode* configNode,
358 SGPropertyNode* modelRoot);
359 virtual osg::Group* createAnimationGroup(osg::Group& parent);
361 class UpdateCallback;
362 osg::ref_ptr<osg::Texture2D> _effect_texture;
366 //////////////////////////////////////////////////////////////////////
368 //////////////////////////////////////////////////////////////////////
370 class SGPickAnimation : public SGAnimation {
372 SGPickAnimation(const SGPropertyNode* configNode,
373 SGPropertyNode* modelRoot);
374 virtual osg::Group* createAnimationGroup(osg::Group& parent);
379 #endif // _SG_ANIMATION_HXX