1 | /*
|
---|
2 | -----------------------------------------------------------------------------
|
---|
3 | This source file is part of OGRE
|
---|
4 | (Object-oriented Graphics Rendering Engine)
|
---|
5 | For the latest info, see http://www.ogre3d.org/
|
---|
6 |
|
---|
7 | Copyright (c) 2000-2005 The OGRE Team
|
---|
8 | Also see acknowledgements in Readme.html
|
---|
9 |
|
---|
10 | This program is free software; you can redistribute it and/or modify it under
|
---|
11 | the terms of the GNU Lesser General Public License as published by the Free Software
|
---|
12 | Foundation; either version 2 of the License, or (at your option) any later
|
---|
13 | version.
|
---|
14 |
|
---|
15 | This program is distributed in the hope that it will be useful, but WITHOUT
|
---|
16 | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
---|
17 | FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
---|
18 |
|
---|
19 | You should have received a copy of the GNU Lesser General Public License along with
|
---|
20 | this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
---|
21 | Place - Suite 330, Boston, MA 02111-1307, USA, or go to
|
---|
22 | http://www.gnu.org/copyleft/lesser.txt.
|
---|
23 | -----------------------------------------------------------------------------
|
---|
24 | */
|
---|
25 |
|
---|
26 | #ifndef __Animation_H__
|
---|
27 | #define __Animation_H__
|
---|
28 |
|
---|
29 | #include "OgrePrerequisites.h"
|
---|
30 | #include "OgreString.h"
|
---|
31 | #include "OgreIteratorWrappers.h"
|
---|
32 |
|
---|
33 | namespace Ogre {
|
---|
34 |
|
---|
35 | /** An animation sequence.
|
---|
36 | @remarks
|
---|
37 | This class defines the interface for a sequence of animation, whether that
|
---|
38 | be animation of a mesh, a path along a spline, or possibly more than one
|
---|
39 | type of animation in one. An animation is made up of many 'tracks', which are
|
---|
40 | the more specific types of animation.
|
---|
41 | @par
|
---|
42 | You should not create these animations directly. They will be created via a parent
|
---|
43 | object which owns the animation, e.g. Skeleton.
|
---|
44 | */
|
---|
45 | class _OgreExport Animation
|
---|
46 | {
|
---|
47 |
|
---|
48 | public:
|
---|
49 | /** The types of animation interpolation available. */
|
---|
50 | enum InterpolationMode
|
---|
51 | {
|
---|
52 | /** Values are interpolated along straight lines. */
|
---|
53 | IM_LINEAR,
|
---|
54 | /** Values are interpolated along a spline, resulting in smoother changes in direction. */
|
---|
55 | IM_SPLINE
|
---|
56 | };
|
---|
57 |
|
---|
58 | /** The types of rotational interpolation available. */
|
---|
59 | enum RotationInterpolationMode
|
---|
60 | {
|
---|
61 | /** Values are interpolated linearly. This is faster but does not
|
---|
62 | necessarily give a completely accurate result.
|
---|
63 | */
|
---|
64 | RIM_LINEAR,
|
---|
65 | /** Values are interpolated spherically. This is more accurate but
|
---|
66 | has a higher cost.
|
---|
67 | */
|
---|
68 | RIM_SPHERICAL
|
---|
69 | };
|
---|
70 | /** You should not use this constructor directly, use the parent object such as Skeleton instead.
|
---|
71 | @param name The name of the animation, should be unique within it's parent (e.g. Skeleton)
|
---|
72 | @param length The length of the animation in seconds.
|
---|
73 | */
|
---|
74 | Animation(const String& name, Real length);
|
---|
75 | virtual ~Animation();
|
---|
76 |
|
---|
77 | /** Gets the name of this animation. */
|
---|
78 | const String& getName(void) const;
|
---|
79 |
|
---|
80 | /** Gets the total length of the animation. */
|
---|
81 | Real getLength(void) const;
|
---|
82 |
|
---|
83 | /** Creates an AnimationTrack.
|
---|
84 | @param handle Numeric handle to give the track, used for accessing the track later.
|
---|
85 | Must be unique within this Animation.
|
---|
86 | */
|
---|
87 | AnimationTrack* createTrack(unsigned short handle);
|
---|
88 |
|
---|
89 | /** Creates a new AnimationTrack automatically associated with a Node.
|
---|
90 | @remarks
|
---|
91 | This method creates a standard AnimationTrack, but also associates it with a
|
---|
92 | target Node which will receive all keyframe effects.
|
---|
93 | @param handle Numeric handle to give the track, used for accessing the track later.
|
---|
94 | Must be unique within this Animation.
|
---|
95 | @param node A pointer to the Node object which will be affected by this track
|
---|
96 | */
|
---|
97 | AnimationTrack* createTrack(unsigned short handle, Node* node);
|
---|
98 |
|
---|
99 | /** Gets the number of AnimationTrack objects which make up this animation. */
|
---|
100 | unsigned short getNumTracks(void) const;
|
---|
101 |
|
---|
102 | /** Gets a track by it's handle. */
|
---|
103 | AnimationTrack* getTrack(unsigned short handle) const;
|
---|
104 |
|
---|
105 |
|
---|
106 | /** Destroys the track with the given handle. */
|
---|
107 | void destroyTrack(unsigned short handle);
|
---|
108 |
|
---|
109 | /** Removes and destroys all tracks making up this animation. */
|
---|
110 | void destroyAllTracks(void);
|
---|
111 |
|
---|
112 | /** Applies an animation given a specific time point and weight.
|
---|
113 | @remarks
|
---|
114 | Where you have associated animation tracks with Node objects, you can eaily apply
|
---|
115 | an animation to those nodes by calling this method.
|
---|
116 | @param timePos The time position in the animation to apply.
|
---|
117 | @param weight The influence to give to this track, 1.0 for full influence, less to blend with
|
---|
118 | other animations.
|
---|
119 | @param scale The scale to apply to translations and scalings, useful for
|
---|
120 | adapting an animation to a different size target.
|
---|
121 | */
|
---|
122 | void apply(Real timePos, Real weight = 1.0, bool accumulate = false,
|
---|
123 | Real scale = 1.0f);
|
---|
124 |
|
---|
125 | /** Applies an animation given a specific time point and weight to a given skeleton.
|
---|
126 | @remarks
|
---|
127 | Where you have associated animation tracks with Node objects, you can eaily apply
|
---|
128 | an animation to those nodes by calling this method.
|
---|
129 | @param timePos The time position in the animation to apply.
|
---|
130 | @param weight The influence to give to this track, 1.0 for full influence, less to blend with
|
---|
131 | other animations.
|
---|
132 | @param scale The scale to apply to translations and scalings, useful for
|
---|
133 | adapting an animation to a different size target.
|
---|
134 | */
|
---|
135 | void apply(Skeleton* skeleton, Real timePos, Real weight = 1.0,
|
---|
136 | bool accumulate = false, Real scale = 1.0f);
|
---|
137 |
|
---|
138 | /** Tells the animation how to interpolate between keyframes.
|
---|
139 | @remarks
|
---|
140 | By default, animations normally interpolate linearly between keyframes. This is
|
---|
141 | fast, but when animations include quick changes in direction it can look a little
|
---|
142 | unnatural because directions change instantly at keyframes. An alternative is to
|
---|
143 | tell the animation to interpolate along a spline, which is more expensive in terms
|
---|
144 | of calculation time, but looks smoother because major changes in direction are
|
---|
145 | distributed around the keyframes rather than just at the keyframe.
|
---|
146 | @par
|
---|
147 | You can also change the default animation behaviour by calling
|
---|
148 | Animation::setDefaultInterpolationMode.
|
---|
149 | */
|
---|
150 | void setInterpolationMode(InterpolationMode im);
|
---|
151 |
|
---|
152 | /** Gets the current interpolation mode of this animation.
|
---|
153 | @remarks
|
---|
154 | See setInterpolationMode for more info.
|
---|
155 | */
|
---|
156 | InterpolationMode getInterpolationMode(void) const;
|
---|
157 | /** Tells the animation how to interpolate rotations.
|
---|
158 | @remarks
|
---|
159 | By default, animations interpolate lieanrly between rotations. This
|
---|
160 | is fast but not necessarily completely accurate. If you want more
|
---|
161 | accurate interpolation, use spherical interpolation, but be aware
|
---|
162 | that it will incur a higher cost.
|
---|
163 | @par
|
---|
164 | You can also change the default rotation behaviour by calling
|
---|
165 | Animation::setDefaultRotationInterpolationMode.
|
---|
166 | */
|
---|
167 | void setRotationInterpolationMode(RotationInterpolationMode im);
|
---|
168 |
|
---|
169 | /** Gets the current rotation interpolation mode of this animation.
|
---|
170 | @remarks
|
---|
171 | See setRotationInterpolationMode for more info.
|
---|
172 | */
|
---|
173 | RotationInterpolationMode getRotationInterpolationMode(void) const;
|
---|
174 |
|
---|
175 | // Methods for setting the defaults
|
---|
176 | /** Sets the default animation interpolation mode.
|
---|
177 | @remarks
|
---|
178 | Every animation created after this option is set will have the new interpolation
|
---|
179 | mode specified. You can also change the mode per animation by calling the
|
---|
180 | setInterpolationMode method on the instance in question.
|
---|
181 | */
|
---|
182 | static void setDefaultInterpolationMode(InterpolationMode im);
|
---|
183 |
|
---|
184 | /** Gets the default interpolation mode for all animations. */
|
---|
185 | static InterpolationMode getDefaultInterpolationMode(void);
|
---|
186 |
|
---|
187 | /** Sets the default rotation interpolation mode.
|
---|
188 | @remarks
|
---|
189 | Every animation created after this option is set will have the new interpolation
|
---|
190 | mode specified. You can also change the mode per animation by calling the
|
---|
191 | setInterpolationMode method on the instance in question.
|
---|
192 | */
|
---|
193 | static void setDefaultRotationInterpolationMode(RotationInterpolationMode im);
|
---|
194 |
|
---|
195 | /** Gets the default rotation interpolation mode for all animations. */
|
---|
196 | static RotationInterpolationMode getDefaultRotationInterpolationMode(void);
|
---|
197 |
|
---|
198 | typedef std::map<unsigned short, AnimationTrack*> TrackList;
|
---|
199 | typedef ConstMapIterator<TrackList> TrackIterator;
|
---|
200 |
|
---|
201 | /// Fast access to NON-UPDATEABLE track list
|
---|
202 | const TrackList& _getTrackList(void) const;
|
---|
203 |
|
---|
204 | /// Get non-updateable iterator over tracks
|
---|
205 | TrackIterator getTrackIterator(void) const
|
---|
206 | { return TrackIterator(mTrackList.begin(), mTrackList.end()); }
|
---|
207 |
|
---|
208 | /** Optimise an animation by removing unnecessary tracks and keyframes.
|
---|
209 | @remarks
|
---|
210 | When you export an animation, it is possible that certain tracks
|
---|
211 | have been keyfamed but actually don't include anything useful - the
|
---|
212 | keyframes include no transformation. These tracks can be completely
|
---|
213 | eliminated from the animation and thus speed up the animation.
|
---|
214 | In addition, if several keyframes in a row have the same value,
|
---|
215 | then they are just adding overhead and can be removed.
|
---|
216 | */
|
---|
217 | void optimise(void);
|
---|
218 |
|
---|
219 |
|
---|
220 |
|
---|
221 | protected:
|
---|
222 | /// Tracks, indexed by handle
|
---|
223 | TrackList mTrackList;
|
---|
224 | String mName;
|
---|
225 |
|
---|
226 | Real mLength;
|
---|
227 |
|
---|
228 | InterpolationMode mInterpolationMode;
|
---|
229 | RotationInterpolationMode mRotationInterpolationMode;
|
---|
230 |
|
---|
231 | static InterpolationMode msDefaultInterpolationMode;
|
---|
232 | static RotationInterpolationMode msDefaultRotationInterpolationMode;
|
---|
233 |
|
---|
234 |
|
---|
235 | };
|
---|
236 |
|
---|
237 |
|
---|
238 |
|
---|
239 | }
|
---|
240 |
|
---|
241 |
|
---|
242 | #endif
|
---|
243 |
|
---|