]> git.mxchange.org Git - simgear.git/blob - simgear/scene/model/animation.hxx
Modified Files:
[simgear.git] / simgear / scene / model / animation.hxx
1
2 // animation.hxx - classes to manage model animation.
3 // Written by David Megginson, started 2002.
4 //
5 // This file is in the Public Domain, and comes with no warranty.
6
7 #ifndef _SG_ANIMATION_HXX
8 #define _SG_ANIMATION_HXX 1
9
10 #ifndef __cplusplus
11 # error This library requires C++
12 #endif
13
14 #include <vector>
15 #include <map>
16
17 #include <osg/Vec3>
18 #include <osg/Vec4>
19
20 #include <osg/ref_ptr>
21 #include <osg/AlphaFunc>
22 #include <osg/Group>
23 #include <osg/Material>
24 #include <osg/Node>
25 #include <osg/NodeCallback>
26 #include <osg/NodeVisitor>
27 #include <osg/StateSet>
28 #include <osg/Texture2D>
29 #include <osg/TexMat>
30
31 #include <simgear/props/props.hxx>
32 #include <simgear/misc/sg_path.hxx>
33
34 #include <simgear/math/interpolater.hxx>
35 #include <simgear/scene/model/persparam.hxx>
36 #include <simgear/scene/util/SGNodeMasks.hxx>
37
38
39 SG_USING_STD(vector);
40 SG_USING_STD(map);
41
42 // Don't pull in the headers, since we don't need them here.
43 class SGInterpTable;
44 class SGCondition;
45
46 // Has anyone done anything *really* stupid, like making min and max macros?
47 #ifdef min
48 #undef min
49 #endif
50 #ifdef max
51 #undef max
52 #endif
53
54
55 \f
56 //////////////////////////////////////////////////////////////////////
57 // Helper classes, FIXME: factor out
58 //////////////////////////////////////////////////////////////////////
59
60 class SGDoubleValue : public SGReferenced {
61 public:
62   virtual ~SGDoubleValue() {}
63   virtual double getValue() const = 0;
64 };
65
66 \f
67 //////////////////////////////////////////////////////////////////////
68 // Base class for animation installers
69 //////////////////////////////////////////////////////////////////////
70
71 class SGAnimation : protected osg::NodeVisitor {
72 public:
73   SGAnimation(const SGPropertyNode* configNode, SGPropertyNode* modelRoot);
74   virtual ~SGAnimation();
75
76   static bool animate(osg::Node* node, const SGPropertyNode* configNode,
77                       SGPropertyNode* modelRoot);
78
79 protected:
80   void apply(osg::Node* node);
81
82   virtual void install(osg::Node& node);
83   virtual osg::Group* createAnimationGroup(osg::Group& parent);
84
85   virtual void apply(osg::Group& group);
86
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);
95
96   std::string getType() const
97   { return std::string(_configNode->getStringValue("type", "")); }
98
99   const SGPropertyNode* getConfig() const
100   { return _configNode; }
101   SGPropertyNode* getModelRoot() const
102   { return _modelRoot; }
103
104   const SGCondition* getCondition() const;
105
106 private:
107   void installInGroup(const std::string& name, osg::Group& group,
108                       osg::ref_ptr<osg::Group>& animationGroup);
109
110   class RemoveModeVisitor;
111   class RemoveAttributeVisitor;
112   class RemoveTextureModeVisitor;
113   class RemoveTextureAttributeVisitor;
114   class BinToInheritVisitor;
115   class DrawableCloneVisitor;
116
117   bool _found;
118   std::string _name;
119   SGSharedPtr<SGPropertyNode const> _configNode;
120   SGPropertyNode* _modelRoot;
121   std::list<std::string> _objectNames;
122   bool _enableHOT;
123   bool _disableShadow;
124 };
125
126 \f
127 //////////////////////////////////////////////////////////////////////
128 // Null animation installer
129 //////////////////////////////////////////////////////////////////////
130
131 class SGGroupAnimation : public SGAnimation {
132 public:
133   SGGroupAnimation(const SGPropertyNode*, SGPropertyNode*);
134   virtual osg::Group* createAnimationGroup(osg::Group& parent);
135 };
136
137 \f
138 //////////////////////////////////////////////////////////////////////
139 // Translate animation installer
140 //////////////////////////////////////////////////////////////////////
141
142 class SGTranslateAnimation : public SGAnimation {
143 public:
144   SGTranslateAnimation(const SGPropertyNode* configNode,
145                        SGPropertyNode* modelRoot);
146   virtual osg::Group* createAnimationGroup(osg::Group& parent);
147 private:
148   class UpdateCallback;
149   class Transform;
150   SGSharedPtr<const SGCondition> _condition;
151   SGSharedPtr<const SGDoubleValue> _animationValue;
152   SGVec3d _axis;
153   double _initialValue;
154 };
155
156 \f
157 //////////////////////////////////////////////////////////////////////
158 // Rotate/Spin animation installer
159 //////////////////////////////////////////////////////////////////////
160
161 class SGRotateAnimation : public SGAnimation {
162 public:
163   SGRotateAnimation(const SGPropertyNode* configNode,
164                     SGPropertyNode* modelRoot);
165   virtual osg::Group* createAnimationGroup(osg::Group& parent);
166 private:
167   class UpdateCallback;
168   class SpinUpdateCallback;
169   class Transform;
170   SGSharedPtr<const SGCondition> _condition;
171   SGSharedPtr<const SGDoubleValue> _animationValue;
172   SGVec3d _axis;
173   SGVec3d _center;
174   double _initialValue;
175   bool _isSpin;
176 };
177
178 \f
179 //////////////////////////////////////////////////////////////////////
180 // Scale animation installer
181 //////////////////////////////////////////////////////////////////////
182
183 class SGScaleAnimation : public SGAnimation {
184 public:
185   SGScaleAnimation(const SGPropertyNode* configNode,
186                    SGPropertyNode* modelRoot);
187   virtual osg::Group* createAnimationGroup(osg::Group& parent);
188 private:
189   class UpdateCallback;
190   class Transform;
191   SGSharedPtr<const SGCondition> _condition;
192   SGSharedPtr<const SGDoubleValue> _animationValue[3];
193   SGVec3d _initialValue;
194   SGVec3d _center;
195 };
196
197 \f
198 //////////////////////////////////////////////////////////////////////
199 // dist scale animation installer
200 //////////////////////////////////////////////////////////////////////
201
202 class SGDistScaleAnimation : public SGAnimation {
203 public:
204   SGDistScaleAnimation(const SGPropertyNode* configNode,
205                        SGPropertyNode* modelRoot);
206   virtual osg::Group* createAnimationGroup(osg::Group& parent);
207 private:
208   class Transform;
209 };
210
211 \f
212 //////////////////////////////////////////////////////////////////////
213 // dist scale animation installer
214 //////////////////////////////////////////////////////////////////////
215
216 class SGFlashAnimation : public SGAnimation {
217 public:
218   SGFlashAnimation(const SGPropertyNode* configNode,
219                    SGPropertyNode* modelRoot);
220   virtual osg::Group* createAnimationGroup(osg::Group& parent);
221 private:
222   class Transform;
223 };
224
225 \f
226 //////////////////////////////////////////////////////////////////////
227 // dist scale animation installer
228 //////////////////////////////////////////////////////////////////////
229
230 class SGBillboardAnimation : public SGAnimation {
231 public:
232   SGBillboardAnimation(const SGPropertyNode* configNode,
233                        SGPropertyNode* modelRoot);
234   virtual osg::Group* createAnimationGroup(osg::Group& parent);
235 private:
236   class Transform;
237 };
238
239 \f
240 //////////////////////////////////////////////////////////////////////
241 // Range animation installer
242 //////////////////////////////////////////////////////////////////////
243
244 class SGRangeAnimation : public SGAnimation {
245 public:
246   SGRangeAnimation(const SGPropertyNode* configNode,
247                    SGPropertyNode* modelRoot);
248   virtual osg::Group* createAnimationGroup(osg::Group& parent);
249 private:
250   class UpdateCallback;
251   SGSharedPtr<const SGCondition> _condition;
252   SGSharedPtr<const SGDoubleValue> _minAnimationValue;
253   SGSharedPtr<const SGDoubleValue> _maxAnimationValue;
254   SGVec2d _initialValue;
255 };
256
257 \f
258 //////////////////////////////////////////////////////////////////////
259 // Select animation installer
260 //////////////////////////////////////////////////////////////////////
261
262 class SGSelectAnimation : public SGAnimation {
263 public:
264   SGSelectAnimation(const SGPropertyNode* configNode,
265                     SGPropertyNode* modelRoot);
266   virtual osg::Group* createAnimationGroup(osg::Group& parent);
267 private:
268   class UpdateCallback;
269 };
270
271 \f
272 //////////////////////////////////////////////////////////////////////
273 // Alpha test animation installer
274 //////////////////////////////////////////////////////////////////////
275
276 class SGAlphaTestAnimation : public SGAnimation {
277 public:
278   SGAlphaTestAnimation(const SGPropertyNode* configNode,
279                        SGPropertyNode* modelRoot);
280   virtual void install(osg::Node& node);
281 };
282
283 \f
284 //////////////////////////////////////////////////////////////////////
285 // Blend animation installer
286 //////////////////////////////////////////////////////////////////////
287
288 class SGBlendAnimation : public SGAnimation {
289 public:
290   SGBlendAnimation(const SGPropertyNode* configNode,
291                    SGPropertyNode* modelRoot);
292   virtual osg::Group* createAnimationGroup(osg::Group& parent);
293   virtual void install(osg::Node& node);
294 private:
295   class BlendVisitor;
296   class UpdateCallback;
297   SGSharedPtr<SGDoubleValue> _animationValue;
298 };
299
300 \f
301 //////////////////////////////////////////////////////////////////////
302 // Timed animation installer
303 //////////////////////////////////////////////////////////////////////
304
305 class SGTimedAnimation : public SGAnimation {
306 public:
307   SGTimedAnimation(const SGPropertyNode* configNode,
308                    SGPropertyNode* modelRoot);
309   virtual osg::Group* createAnimationGroup(osg::Group& parent);
310 private:
311   class UpdateCallback;
312 };
313
314 \f
315 //////////////////////////////////////////////////////////////////////
316 // Shadow animation installer
317 //////////////////////////////////////////////////////////////////////
318
319 class SGShadowAnimation : public SGAnimation {
320 public:
321   SGShadowAnimation(const SGPropertyNode* configNode,
322                     SGPropertyNode* modelRoot);
323   virtual osg::Group* createAnimationGroup(osg::Group& parent);
324 private:
325   class UpdateCallback;
326 };
327
328 \f
329 //////////////////////////////////////////////////////////////////////
330 // TextureTransform animation
331 //////////////////////////////////////////////////////////////////////
332
333 class SGTexTransformAnimation : public SGAnimation {
334 public:
335   SGTexTransformAnimation(const SGPropertyNode* configNode,
336                           SGPropertyNode* modelRoot);
337   virtual osg::Group* createAnimationGroup(osg::Group& parent);
338 private:
339   class Transform;
340   class Translation;
341   class Rotation;
342   class UpdateCallback;
343   void appendTexTranslate(const SGPropertyNode* config,
344                           UpdateCallback* updateCallback);
345   void appendTexRotate(const SGPropertyNode* config,
346                        UpdateCallback* updateCallback);
347 };
348
349 \f
350 //////////////////////////////////////////////////////////////////////
351 // Shader animation
352 //////////////////////////////////////////////////////////////////////
353
354 class SGShaderAnimation : public SGAnimation {
355 public:
356   SGShaderAnimation(const SGPropertyNode* configNode,
357                     SGPropertyNode* modelRoot);
358   virtual osg::Group* createAnimationGroup(osg::Group& parent);
359 private:
360   class UpdateCallback;
361 };
362
363 #endif // _SG_ANIMATION_HXX