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++
14 #include <osg/ref_ptr>
17 #include <osg/NodeVisitor>
18 #include <osg/Texture2D>
19 #include <osgDB/ReaderWriter>
21 #include <simgear/scene/util/SGNodeMasks.hxx>
22 #include <simgear/props/props.hxx>
23 #include <simgear/props/condition.hxx>
24 #include <simgear/structure/SGExpression.hxx>
26 // Has anyone done anything *really* stupid, like making min and max macros?
35 read_value(const SGPropertyNode* configNode, SGPropertyNode* modelRoot,
36 const char* unit, double defMin, double defMax);
38 //////////////////////////////////////////////////////////////////////
39 // Base class for animation installers
40 //////////////////////////////////////////////////////////////////////
42 class SGAnimation : protected osg::NodeVisitor {
44 SGAnimation(const SGPropertyNode* configNode, SGPropertyNode* modelRoot);
45 virtual ~SGAnimation();
47 static bool animate(osg::Node* node, const SGPropertyNode* configNode,
48 SGPropertyNode* modelRoot,
49 const osgDB::ReaderWriter::Options* options);
52 void apply(osg::Node* node);
54 virtual void install(osg::Node& node);
55 virtual osg::Group* createAnimationGroup(osg::Group& parent);
57 virtual void apply(osg::Group& group);
59 void removeMode(osg::Node& node, osg::StateAttribute::GLMode mode);
60 void removeAttribute(osg::Node& node, osg::StateAttribute::Type type);
61 void removeTextureMode(osg::Node& node, unsigned unit,
62 osg::StateAttribute::GLMode mode);
63 void removeTextureAttribute(osg::Node& node, unsigned unit,
64 osg::StateAttribute::Type type);
65 void setRenderBinToInherit(osg::Node& node);
66 void cloneDrawables(osg::Node& node);
68 std::string getType() const
69 { return std::string(_configNode->getStringValue("type", "")); }
71 const SGPropertyNode* getConfig() const
72 { return _configNode; }
73 SGPropertyNode* getModelRoot() const
74 { return _modelRoot; }
76 const SGCondition* getCondition() const;
79 void installInGroup(const std::string& name, osg::Group& group,
80 osg::ref_ptr<osg::Group>& animationGroup);
82 class RemoveModeVisitor;
83 class RemoveAttributeVisitor;
84 class RemoveTextureModeVisitor;
85 class RemoveTextureAttributeVisitor;
86 class BinToInheritVisitor;
87 class DrawableCloneVisitor;
91 SGSharedPtr<SGPropertyNode const> _configNode;
92 SGPropertyNode* _modelRoot;
93 std::list<std::string> _objectNames;
94 std::list<osg::ref_ptr<osg::Node> > _installedAnimations;
100 //////////////////////////////////////////////////////////////////////
101 // Null animation installer
102 //////////////////////////////////////////////////////////////////////
104 class SGGroupAnimation : public SGAnimation {
106 SGGroupAnimation(const SGPropertyNode*, SGPropertyNode*);
107 virtual osg::Group* createAnimationGroup(osg::Group& parent);
111 //////////////////////////////////////////////////////////////////////
112 // Translate animation installer
113 //////////////////////////////////////////////////////////////////////
115 class SGTranslateAnimation : public SGAnimation {
117 SGTranslateAnimation(const SGPropertyNode* configNode,
118 SGPropertyNode* modelRoot);
119 virtual osg::Group* createAnimationGroup(osg::Group& parent);
121 class UpdateCallback;
122 SGSharedPtr<const SGCondition> _condition;
123 SGSharedPtr<const SGExpressiond> _animationValue;
125 double _initialValue;
129 //////////////////////////////////////////////////////////////////////
130 // Rotate/Spin animation installer
131 //////////////////////////////////////////////////////////////////////
133 class SGRotateAnimation : public SGAnimation {
135 SGRotateAnimation(const SGPropertyNode* configNode,
136 SGPropertyNode* modelRoot);
137 virtual osg::Group* createAnimationGroup(osg::Group& parent);
139 class UpdateCallback;
140 class SpinUpdateCallback;
141 SGSharedPtr<const SGCondition> _condition;
142 SGSharedPtr<const SGExpressiond> _animationValue;
145 double _initialValue;
150 //////////////////////////////////////////////////////////////////////
151 // Scale animation installer
152 //////////////////////////////////////////////////////////////////////
154 class SGScaleAnimation : public SGAnimation {
156 SGScaleAnimation(const SGPropertyNode* configNode,
157 SGPropertyNode* modelRoot);
158 virtual osg::Group* createAnimationGroup(osg::Group& parent);
160 class UpdateCallback;
161 SGSharedPtr<const SGCondition> _condition;
162 SGSharedPtr<const SGExpressiond> _animationValue[3];
163 SGVec3d _initialValue;
168 //////////////////////////////////////////////////////////////////////
169 // dist scale animation installer
170 //////////////////////////////////////////////////////////////////////
172 class SGDistScaleAnimation : public SGAnimation {
174 SGDistScaleAnimation(const SGPropertyNode* configNode,
175 SGPropertyNode* modelRoot);
176 virtual osg::Group* createAnimationGroup(osg::Group& parent);
182 //////////////////////////////////////////////////////////////////////
183 // dist scale animation installer
184 //////////////////////////////////////////////////////////////////////
186 class SGFlashAnimation : public SGAnimation {
188 SGFlashAnimation(const SGPropertyNode* configNode,
189 SGPropertyNode* modelRoot);
190 virtual osg::Group* createAnimationGroup(osg::Group& parent);
196 //////////////////////////////////////////////////////////////////////
197 // dist scale animation installer
198 //////////////////////////////////////////////////////////////////////
200 class SGBillboardAnimation : public SGAnimation {
202 SGBillboardAnimation(const SGPropertyNode* configNode,
203 SGPropertyNode* modelRoot);
204 virtual osg::Group* createAnimationGroup(osg::Group& parent);
210 //////////////////////////////////////////////////////////////////////
211 // Range animation installer
212 //////////////////////////////////////////////////////////////////////
214 class SGRangeAnimation : public SGAnimation {
216 SGRangeAnimation(const SGPropertyNode* configNode,
217 SGPropertyNode* modelRoot);
218 virtual osg::Group* createAnimationGroup(osg::Group& parent);
220 class UpdateCallback;
221 SGSharedPtr<const SGCondition> _condition;
222 SGSharedPtr<const SGExpressiond> _minAnimationValue;
223 SGSharedPtr<const SGExpressiond> _maxAnimationValue;
224 SGVec2d _initialValue;
228 //////////////////////////////////////////////////////////////////////
229 // Select animation installer
230 //////////////////////////////////////////////////////////////////////
232 class SGSelectAnimation : public SGAnimation {
234 SGSelectAnimation(const SGPropertyNode* configNode,
235 SGPropertyNode* modelRoot);
236 virtual osg::Group* createAnimationGroup(osg::Group& parent);
238 class UpdateCallback;
242 //////////////////////////////////////////////////////////////////////
243 // Alpha test animation installer
244 //////////////////////////////////////////////////////////////////////
246 class SGAlphaTestAnimation : public SGAnimation {
248 SGAlphaTestAnimation(const SGPropertyNode* configNode,
249 SGPropertyNode* modelRoot);
250 virtual void install(osg::Node& node);
254 //////////////////////////////////////////////////////////////////////
255 // Blend animation installer
256 //////////////////////////////////////////////////////////////////////
258 class SGBlendAnimation : public SGAnimation {
260 SGBlendAnimation(const SGPropertyNode* configNode,
261 SGPropertyNode* modelRoot);
262 virtual osg::Group* createAnimationGroup(osg::Group& parent);
263 virtual void install(osg::Node& node);
266 class UpdateCallback;
267 SGSharedPtr<SGExpressiond> _animationValue;
271 //////////////////////////////////////////////////////////////////////
272 // Timed animation installer
273 //////////////////////////////////////////////////////////////////////
275 class SGTimedAnimation : public SGAnimation {
277 SGTimedAnimation(const SGPropertyNode* configNode,
278 SGPropertyNode* modelRoot);
279 virtual osg::Group* createAnimationGroup(osg::Group& parent);
281 class UpdateCallback;
285 //////////////////////////////////////////////////////////////////////
286 // Shadow animation installer
287 //////////////////////////////////////////////////////////////////////
289 class SGShadowAnimation : public SGAnimation {
291 SGShadowAnimation(const SGPropertyNode* configNode,
292 SGPropertyNode* modelRoot);
293 virtual osg::Group* createAnimationGroup(osg::Group& parent);
295 class UpdateCallback;
299 //////////////////////////////////////////////////////////////////////
300 // TextureTransform animation
301 //////////////////////////////////////////////////////////////////////
303 class SGTexTransformAnimation : public SGAnimation {
305 SGTexTransformAnimation(const SGPropertyNode* configNode,
306 SGPropertyNode* modelRoot);
307 virtual osg::Group* createAnimationGroup(osg::Group& parent);
312 class UpdateCallback;
313 void appendTexTranslate(const SGPropertyNode* config,
314 UpdateCallback* updateCallback);
315 void appendTexRotate(const SGPropertyNode* config,
316 UpdateCallback* updateCallback);
320 //////////////////////////////////////////////////////////////////////
322 //////////////////////////////////////////////////////////////////////
324 class SGShaderAnimation : public SGAnimation {
326 SGShaderAnimation(const SGPropertyNode* configNode,
327 SGPropertyNode* modelRoot,
328 const osgDB::ReaderWriter::Options* options);
329 virtual osg::Group* createAnimationGroup(osg::Group& parent);
331 class UpdateCallback;
332 osg::ref_ptr<osg::Texture2D> _effect_texture;
336 //////////////////////////////////////////////////////////////////////
338 //////////////////////////////////////////////////////////////////////
340 class SGPickAnimation : public SGAnimation {
342 SGPickAnimation(const SGPropertyNode* configNode,
343 SGPropertyNode* modelRoot);
344 virtual osg::Group* createAnimationGroup(osg::Group& parent);
349 #endif // _SG_ANIMATION_HXX