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;
127 //////////////////////////////////////////////////////////////////////
128 // Null animation installer
129 //////////////////////////////////////////////////////////////////////
131 class SGGroupAnimation : public SGAnimation {
133 SGGroupAnimation(const SGPropertyNode*, SGPropertyNode*);
134 virtual osg::Group* createAnimationGroup(osg::Group& parent);
138 //////////////////////////////////////////////////////////////////////
139 // Translate animation installer
140 //////////////////////////////////////////////////////////////////////
142 class SGTranslateAnimation : public SGAnimation {
144 SGTranslateAnimation(const SGPropertyNode* configNode,
145 SGPropertyNode* modelRoot);
146 virtual osg::Group* createAnimationGroup(osg::Group& parent);
148 class UpdateCallback;
150 SGSharedPtr<const SGCondition> _condition;
151 SGSharedPtr<const SGDoubleValue> _animationValue;
153 double _initialValue;
157 //////////////////////////////////////////////////////////////////////
158 // Rotate/Spin animation installer
159 //////////////////////////////////////////////////////////////////////
161 class SGRotateAnimation : public SGAnimation {
163 SGRotateAnimation(const SGPropertyNode* configNode,
164 SGPropertyNode* modelRoot);
165 virtual osg::Group* createAnimationGroup(osg::Group& parent);
167 class UpdateCallback;
168 class SpinUpdateCallback;
170 SGSharedPtr<const SGCondition> _condition;
171 SGSharedPtr<const SGDoubleValue> _animationValue;
174 double _initialValue;
179 //////////////////////////////////////////////////////////////////////
180 // Scale animation installer
181 //////////////////////////////////////////////////////////////////////
183 class SGScaleAnimation : public SGAnimation {
185 SGScaleAnimation(const SGPropertyNode* configNode,
186 SGPropertyNode* modelRoot);
187 virtual osg::Group* createAnimationGroup(osg::Group& parent);
189 class UpdateCallback;
191 SGSharedPtr<const SGCondition> _condition;
192 SGSharedPtr<const SGDoubleValue> _animationValue[3];
193 SGVec3d _initialValue;
198 //////////////////////////////////////////////////////////////////////
199 // dist scale animation installer
200 //////////////////////////////////////////////////////////////////////
202 class SGDistScaleAnimation : public SGAnimation {
204 SGDistScaleAnimation(const SGPropertyNode* configNode,
205 SGPropertyNode* modelRoot);
206 virtual osg::Group* createAnimationGroup(osg::Group& parent);
212 //////////////////////////////////////////////////////////////////////
213 // dist scale animation installer
214 //////////////////////////////////////////////////////////////////////
216 class SGFlashAnimation : public SGAnimation {
218 SGFlashAnimation(const SGPropertyNode* configNode,
219 SGPropertyNode* modelRoot);
220 virtual osg::Group* createAnimationGroup(osg::Group& parent);
226 //////////////////////////////////////////////////////////////////////
227 // dist scale animation installer
228 //////////////////////////////////////////////////////////////////////
230 class SGBillboardAnimation : public SGAnimation {
232 SGBillboardAnimation(const SGPropertyNode* configNode,
233 SGPropertyNode* modelRoot);
234 virtual osg::Group* createAnimationGroup(osg::Group& parent);
240 //////////////////////////////////////////////////////////////////////
241 // Range animation installer
242 //////////////////////////////////////////////////////////////////////
244 class SGRangeAnimation : public SGAnimation {
246 SGRangeAnimation(const SGPropertyNode* configNode,
247 SGPropertyNode* modelRoot);
248 virtual osg::Group* createAnimationGroup(osg::Group& parent);
250 class UpdateCallback;
251 SGSharedPtr<const SGCondition> _condition;
252 SGSharedPtr<const SGDoubleValue> _minAnimationValue;
253 SGSharedPtr<const SGDoubleValue> _maxAnimationValue;
254 SGVec2d _initialValue;
258 //////////////////////////////////////////////////////////////////////
259 // Select animation installer
260 //////////////////////////////////////////////////////////////////////
262 class SGSelectAnimation : public SGAnimation {
264 SGSelectAnimation(const SGPropertyNode* configNode,
265 SGPropertyNode* modelRoot);
266 virtual osg::Group* createAnimationGroup(osg::Group& parent);
268 class UpdateCallback;
272 //////////////////////////////////////////////////////////////////////
273 // Alpha test animation installer
274 //////////////////////////////////////////////////////////////////////
276 class SGAlphaTestAnimation : public SGAnimation {
278 SGAlphaTestAnimation(const SGPropertyNode* configNode,
279 SGPropertyNode* modelRoot);
280 virtual void install(osg::Node& node);
284 //////////////////////////////////////////////////////////////////////
285 // Blend animation installer
286 //////////////////////////////////////////////////////////////////////
288 class SGBlendAnimation : public SGAnimation {
290 SGBlendAnimation(const SGPropertyNode* configNode,
291 SGPropertyNode* modelRoot);
292 virtual osg::Group* createAnimationGroup(osg::Group& parent);
293 virtual void install(osg::Node& node);
296 class UpdateCallback;
297 SGSharedPtr<SGDoubleValue> _animationValue;
301 //////////////////////////////////////////////////////////////////////
302 // Timed animation installer
303 //////////////////////////////////////////////////////////////////////
305 class SGTimedAnimation : public SGAnimation {
307 SGTimedAnimation(const SGPropertyNode* configNode,
308 SGPropertyNode* modelRoot);
309 virtual osg::Group* createAnimationGroup(osg::Group& parent);
311 class UpdateCallback;
315 //////////////////////////////////////////////////////////////////////
316 // Shadow animation installer
317 //////////////////////////////////////////////////////////////////////
319 class SGShadowAnimation : public SGAnimation {
321 SGShadowAnimation(const SGPropertyNode* configNode,
322 SGPropertyNode* modelRoot);
323 virtual osg::Group* createAnimationGroup(osg::Group& parent);
325 class UpdateCallback;
329 //////////////////////////////////////////////////////////////////////
330 // TextureTransform animation
331 //////////////////////////////////////////////////////////////////////
333 class SGTexTransformAnimation : public SGAnimation {
335 SGTexTransformAnimation(const SGPropertyNode* configNode,
336 SGPropertyNode* modelRoot);
337 virtual osg::Group* createAnimationGroup(osg::Group& parent);
342 class UpdateCallback;
343 void appendTexTranslate(const SGPropertyNode* config,
344 UpdateCallback* updateCallback);
345 void appendTexRotate(const SGPropertyNode* config,
346 UpdateCallback* updateCallback);
350 //////////////////////////////////////////////////////////////////////
352 //////////////////////////////////////////////////////////////////////
354 class SGShaderAnimation : public SGAnimation {
356 SGShaderAnimation(const SGPropertyNode* configNode,
357 SGPropertyNode* modelRoot);
358 virtual osg::Group* createAnimationGroup(osg::Group& parent);
360 class UpdateCallback;
363 #endif // _SG_ANIMATION_HXX