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 void readRotationCenterAndAxis(const SGPropertyNode* configNode, SGVec3d& center, SGVec3d& axis);
40 //////////////////////////////////////////////////////////////////////
41 // Base class for animation installers
42 //////////////////////////////////////////////////////////////////////
44 class SGAnimation : protected osg::NodeVisitor {
46 SGAnimation(const SGPropertyNode* configNode, SGPropertyNode* modelRoot);
47 virtual ~SGAnimation();
49 static bool animate(osg::Node* node, const SGPropertyNode* configNode,
50 SGPropertyNode* modelRoot,
51 const osgDB::Options* options,
52 const string &path, int i);
55 void apply(osg::Node* node);
57 virtual void install(osg::Node& node);
58 virtual osg::Group* createAnimationGroup(osg::Group& parent);
60 virtual void apply(osg::Group& group);
62 void removeMode(osg::Node& node, osg::StateAttribute::GLMode mode);
63 void removeAttribute(osg::Node& node, osg::StateAttribute::Type type);
64 void removeTextureMode(osg::Node& node, unsigned unit,
65 osg::StateAttribute::GLMode mode);
66 void removeTextureAttribute(osg::Node& node, unsigned unit,
67 osg::StateAttribute::Type type);
68 void setRenderBinToInherit(osg::Node& node);
69 void cloneDrawables(osg::Node& node);
71 std::string getType() const
72 { return std::string(_configNode->getStringValue("type", "")); }
74 const SGPropertyNode* getConfig() const
75 { return _configNode; }
76 SGPropertyNode* getModelRoot() const
77 { return _modelRoot; }
79 const SGCondition* getCondition() const;
82 void installInGroup(const std::string& name, osg::Group& group,
83 osg::ref_ptr<osg::Group>& animationGroup);
85 class RemoveModeVisitor;
86 class RemoveAttributeVisitor;
87 class RemoveTextureModeVisitor;
88 class RemoveTextureAttributeVisitor;
89 class BinToInheritVisitor;
90 class DrawableCloneVisitor;
94 SGSharedPtr<SGPropertyNode const> _configNode;
95 SGPropertyNode* _modelRoot;
96 std::list<std::string> _objectNames;
97 std::list<osg::ref_ptr<osg::Node> > _installedAnimations;
102 //////////////////////////////////////////////////////////////////////
103 // Null animation installer
104 //////////////////////////////////////////////////////////////////////
106 class SGGroupAnimation : public SGAnimation {
108 SGGroupAnimation(const SGPropertyNode*, SGPropertyNode*);
109 virtual osg::Group* createAnimationGroup(osg::Group& parent);
113 //////////////////////////////////////////////////////////////////////
114 // Translate animation installer
115 //////////////////////////////////////////////////////////////////////
117 class SGTranslateAnimation : public SGAnimation {
119 SGTranslateAnimation(const SGPropertyNode* configNode,
120 SGPropertyNode* modelRoot);
121 virtual osg::Group* createAnimationGroup(osg::Group& parent);
123 class UpdateCallback;
124 SGSharedPtr<const SGCondition> _condition;
125 SGSharedPtr<const SGExpressiond> _animationValue;
127 double _initialValue;
131 //////////////////////////////////////////////////////////////////////
132 // Rotate/Spin animation installer
133 //////////////////////////////////////////////////////////////////////
135 class SGRotateAnimation : public SGAnimation {
137 SGRotateAnimation(const SGPropertyNode* configNode,
138 SGPropertyNode* modelRoot);
139 virtual osg::Group* createAnimationGroup(osg::Group& parent);
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);
181 //////////////////////////////////////////////////////////////////////
182 // dist scale animation installer
183 //////////////////////////////////////////////////////////////////////
185 class SGFlashAnimation : public SGAnimation {
187 SGFlashAnimation(const SGPropertyNode* configNode,
188 SGPropertyNode* modelRoot);
189 virtual osg::Group* createAnimationGroup(osg::Group& parent);
195 //////////////////////////////////////////////////////////////////////
196 // dist scale animation installer
197 //////////////////////////////////////////////////////////////////////
199 class SGBillboardAnimation : public SGAnimation {
201 SGBillboardAnimation(const SGPropertyNode* configNode,
202 SGPropertyNode* modelRoot);
203 virtual osg::Group* createAnimationGroup(osg::Group& parent);
208 //////////////////////////////////////////////////////////////////////
209 // Range animation installer
210 //////////////////////////////////////////////////////////////////////
212 class SGRangeAnimation : public SGAnimation {
214 SGRangeAnimation(const SGPropertyNode* configNode,
215 SGPropertyNode* modelRoot);
216 virtual osg::Group* createAnimationGroup(osg::Group& parent);
218 class UpdateCallback;
219 SGSharedPtr<const SGCondition> _condition;
220 SGSharedPtr<const SGExpressiond> _minAnimationValue;
221 SGSharedPtr<const SGExpressiond> _maxAnimationValue;
222 SGVec2d _initialValue;
226 //////////////////////////////////////////////////////////////////////
227 // Select animation installer
228 //////////////////////////////////////////////////////////////////////
230 class SGSelectAnimation : public SGAnimation {
232 SGSelectAnimation(const SGPropertyNode* configNode,
233 SGPropertyNode* modelRoot);
234 virtual osg::Group* createAnimationGroup(osg::Group& parent);
238 //////////////////////////////////////////////////////////////////////
239 // Alpha test animation installer
240 //////////////////////////////////////////////////////////////////////
242 class SGAlphaTestAnimation : public SGAnimation {
244 SGAlphaTestAnimation(const SGPropertyNode* configNode,
245 SGPropertyNode* modelRoot);
246 virtual void install(osg::Node& node);
250 //////////////////////////////////////////////////////////////////////
251 // Blend animation installer
252 //////////////////////////////////////////////////////////////////////
254 class SGBlendAnimation : public SGAnimation {
256 SGBlendAnimation(const SGPropertyNode* configNode,
257 SGPropertyNode* modelRoot);
258 virtual osg::Group* createAnimationGroup(osg::Group& parent);
259 virtual void install(osg::Node& node);
262 class UpdateCallback;
263 SGSharedPtr<SGExpressiond> _animationValue;
267 //////////////////////////////////////////////////////////////////////
268 // Timed animation installer
269 //////////////////////////////////////////////////////////////////////
271 class SGTimedAnimation : public SGAnimation {
273 SGTimedAnimation(const SGPropertyNode* configNode,
274 SGPropertyNode* modelRoot);
275 virtual osg::Group* createAnimationGroup(osg::Group& parent);
277 class UpdateCallback;
281 //////////////////////////////////////////////////////////////////////
282 // Shadow animation installer
283 //////////////////////////////////////////////////////////////////////
285 class SGShadowAnimation : public SGAnimation {
287 SGShadowAnimation(const SGPropertyNode* configNode,
288 SGPropertyNode* modelRoot);
289 virtual osg::Group* createAnimationGroup(osg::Group& parent);
291 class UpdateCallback;
295 //////////////////////////////////////////////////////////////////////
296 // TextureTransform animation
297 //////////////////////////////////////////////////////////////////////
299 class SGTexTransformAnimation : public SGAnimation {
301 SGTexTransformAnimation(const SGPropertyNode* configNode,
302 SGPropertyNode* modelRoot);
303 virtual osg::Group* createAnimationGroup(osg::Group& parent);
308 class UpdateCallback;
309 void appendTexTranslate(const SGPropertyNode* config,
310 UpdateCallback* updateCallback);
311 void appendTexRotate(const SGPropertyNode* config,
312 UpdateCallback* updateCallback);
316 //////////////////////////////////////////////////////////////////////
318 //////////////////////////////////////////////////////////////////////
320 class SGShaderAnimation : public SGAnimation {
322 SGShaderAnimation(const SGPropertyNode* configNode,
323 SGPropertyNode* modelRoot,
324 const osgDB::Options* options);
325 virtual osg::Group* createAnimationGroup(osg::Group& parent);
327 class UpdateCallback;
328 osg::ref_ptr<osg::Texture2D> _effect_texture;
331 //////////////////////////////////////////////////////////////////////
333 //////////////////////////////////////////////////////////////////////
335 class SGLightAnimation : public SGAnimation {
337 SGLightAnimation(const SGPropertyNode* configNode,
338 SGPropertyNode* modelRoot,
339 const osgDB::Options* options,
340 const string &path, int i);
341 virtual osg::Group* createAnimationGroup(osg::Group& parent);
342 virtual void install(osg::Node& node);
350 SGVec3d _attenuation;
356 class UpdateCallback;
357 friend class UpdateCallback;
358 SGSharedPtr<SGExpressiond> _animationValue;
359 osg::ref_ptr<const osgDB::Options> _options;
362 #endif // _SG_ANIMATION_HXX