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 <osgDB/ReaderWriter>
32 #include <simgear/props/props.hxx>
33 #include <simgear/misc/sg_path.hxx>
35 #include <simgear/math/interpolater.hxx>
36 #include <simgear/scene/model/persparam.hxx>
37 #include <simgear/scene/util/SGNodeMasks.hxx>
43 // Don't pull in the headers, since we don't need them here.
47 // Has anyone done anything *really* stupid, like making min and max macros?
57 //////////////////////////////////////////////////////////////////////
58 // Helper classes, FIXME: factor out
59 //////////////////////////////////////////////////////////////////////
61 class SGDoubleValue : public SGReferenced {
63 virtual ~SGDoubleValue() {}
64 virtual double getValue() const = 0;
68 //////////////////////////////////////////////////////////////////////
69 // Base class for animation installers
70 //////////////////////////////////////////////////////////////////////
72 class SGAnimation : protected osg::NodeVisitor {
74 SGAnimation(const SGPropertyNode* configNode, SGPropertyNode* modelRoot);
75 virtual ~SGAnimation();
77 static bool animate(osg::Node* node, const SGPropertyNode* configNode,
78 SGPropertyNode* modelRoot,
79 const osgDB::ReaderWriter::Options* options);
82 void apply(osg::Node* node);
84 virtual void install(osg::Node& node);
85 virtual osg::Group* createAnimationGroup(osg::Group& parent);
87 virtual void apply(osg::Group& group);
89 void removeMode(osg::Node& node, osg::StateAttribute::GLMode mode);
90 void removeAttribute(osg::Node& node, osg::StateAttribute::Type type);
91 void removeTextureMode(osg::Node& node, unsigned unit,
92 osg::StateAttribute::GLMode mode);
93 void removeTextureAttribute(osg::Node& node, unsigned unit,
94 osg::StateAttribute::Type type);
95 void setRenderBinToInherit(osg::Node& node);
96 void cloneDrawables(osg::Node& node);
98 std::string getType() const
99 { return std::string(_configNode->getStringValue("type", "")); }
101 const SGPropertyNode* getConfig() const
102 { return _configNode; }
103 SGPropertyNode* getModelRoot() const
104 { return _modelRoot; }
106 const SGCondition* getCondition() const;
109 void installInGroup(const std::string& name, osg::Group& group,
110 osg::ref_ptr<osg::Group>& animationGroup);
112 class RemoveModeVisitor;
113 class RemoveAttributeVisitor;
114 class RemoveTextureModeVisitor;
115 class RemoveTextureAttributeVisitor;
116 class BinToInheritVisitor;
117 class DrawableCloneVisitor;
121 SGSharedPtr<SGPropertyNode const> _configNode;
122 SGPropertyNode* _modelRoot;
123 std::list<std::string> _objectNames;
124 std::list<osg::ref_ptr<osg::Node> > _installedAnimations;
130 //////////////////////////////////////////////////////////////////////
131 // Null animation installer
132 //////////////////////////////////////////////////////////////////////
134 class SGGroupAnimation : public SGAnimation {
136 SGGroupAnimation(const SGPropertyNode*, SGPropertyNode*);
137 virtual osg::Group* createAnimationGroup(osg::Group& parent);
141 //////////////////////////////////////////////////////////////////////
142 // Translate animation installer
143 //////////////////////////////////////////////////////////////////////
145 class SGTranslateAnimation : public SGAnimation {
147 SGTranslateAnimation(const SGPropertyNode* configNode,
148 SGPropertyNode* modelRoot);
149 virtual osg::Group* createAnimationGroup(osg::Group& parent);
151 class UpdateCallback;
152 SGSharedPtr<const SGCondition> _condition;
153 SGSharedPtr<const SGDoubleValue> _animationValue;
155 double _initialValue;
159 //////////////////////////////////////////////////////////////////////
160 // Rotate/Spin animation installer
161 //////////////////////////////////////////////////////////////////////
163 class SGRotateAnimation : public SGAnimation {
165 SGRotateAnimation(const SGPropertyNode* configNode,
166 SGPropertyNode* modelRoot);
167 virtual osg::Group* createAnimationGroup(osg::Group& parent);
169 class UpdateCallback;
170 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;
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 const osgDB::ReaderWriter::Options* options);
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