00001 /* 00002 ----------------------------------------------------------------------------- 00003 This source file is part of OGRE 00004 (Object-oriented Graphics Rendering Engine) 00005 For the latest info, see http://www.ogre3d.org/ 00006 00007 Copyright (c) 2000-2009 Torus Knot Software Ltd 00008 00009 Permission is hereby granted, free of charge, to any person obtaining a copy 00010 of this software and associated documentation files (the "Software"), to deal 00011 in the Software without restriction, including without limitation the rights 00012 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 00013 copies of the Software, and to permit persons to whom the Software is 00014 furnished to do so, subject to the following conditions: 00015 00016 The above copyright notice and this permission notice shall be included in 00017 all copies or substantial portions of the Software. 00018 00019 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 00020 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00021 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 00022 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00023 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 00024 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 00025 THE SOFTWARE. 00026 ----------------------------------------------------------------------------- 00027 */ 00028 00029 #ifndef __Animation_H__ 00030 #define __Animation_H__ 00031 00032 #include "OgrePrerequisites.h" 00033 #include "OgreString.h" 00034 #include "OgreIteratorWrappers.h" 00035 #include "OgreAnimable.h" 00036 #include "OgreAnimationTrack.h" 00037 #include "OgreAnimationState.h" 00038 00039 namespace Ogre { 00058 class _OgreExport Animation : public AnimationAlloc 00059 { 00060 00061 public: 00063 enum InterpolationMode 00064 { 00066 IM_LINEAR, 00068 IM_SPLINE 00069 }; 00070 00072 enum RotationInterpolationMode 00073 { 00077 RIM_LINEAR, 00081 RIM_SPHERICAL 00082 }; 00087 Animation(const String& name, Real length); 00088 virtual ~Animation(); 00089 00091 const String& getName(void) const; 00092 00094 Real getLength(void) const; 00095 00100 void setLength(Real len); 00101 00106 NodeAnimationTrack* createNodeTrack(unsigned short handle); 00107 00112 NumericAnimationTrack* createNumericTrack(unsigned short handle); 00113 00121 VertexAnimationTrack* createVertexTrack(unsigned short handle, VertexAnimationType animType); 00122 00131 NodeAnimationTrack* createNodeTrack(unsigned short handle, Node* node); 00132 00138 NumericAnimationTrack* createNumericTrack(unsigned short handle, 00139 const AnimableValuePtr& anim); 00140 00147 VertexAnimationTrack* createVertexTrack(unsigned short handle, 00148 VertexData* data, VertexAnimationType animType); 00149 00151 unsigned short getNumNodeTracks(void) const; 00152 00154 NodeAnimationTrack* getNodeTrack(unsigned short handle) const; 00155 00157 bool hasNodeTrack(unsigned short handle) const; 00158 00160 unsigned short getNumNumericTracks(void) const; 00161 00163 NumericAnimationTrack* getNumericTrack(unsigned short handle) const; 00164 00166 bool hasNumericTrack(unsigned short handle) const; 00167 00169 unsigned short getNumVertexTracks(void) const; 00170 00172 VertexAnimationTrack* getVertexTrack(unsigned short handle) const; 00173 00175 bool hasVertexTrack(unsigned short handle) const; 00176 00178 void destroyNodeTrack(unsigned short handle); 00179 00181 void destroyNumericTrack(unsigned short handle); 00182 00184 void destroyVertexTrack(unsigned short handle); 00185 00187 void destroyAllTracks(void); 00188 00190 void destroyAllNodeTracks(void); 00192 void destroyAllNumericTracks(void); 00194 void destroyAllVertexTracks(void); 00195 00206 void apply(Real timePos, Real weight = 1.0, Real scale = 1.0f); 00207 00218 void applyToNode(Node* node, Real timePos, Real weight = 1.0, Real scale = 1.0f); 00219 00230 void apply(Skeleton* skeleton, Real timePos, Real weight = 1.0, Real scale = 1.0f); 00231 00244 void apply(Skeleton* skeleton, Real timePos, float weight, 00245 const AnimationState::BoneBlendMask* blendMask, Real scale); 00246 00256 void apply(Entity* entity, Real timePos, Real weight, bool software, 00257 bool hardware); 00258 00268 void applyToAnimable(const AnimableValuePtr& anim, Real timePos, Real weight = 1.0, Real scale = 1.0f); 00269 00277 void applyToVertexData(VertexData* data, Real timePos, Real weight = 1.0); 00278 00291 void setInterpolationMode(InterpolationMode im); 00292 00297 InterpolationMode getInterpolationMode(void) const; 00308 void setRotationInterpolationMode(RotationInterpolationMode im); 00309 00314 RotationInterpolationMode getRotationInterpolationMode(void) const; 00315 00316 // Methods for setting the defaults 00323 static void setDefaultInterpolationMode(InterpolationMode im); 00324 00326 static InterpolationMode getDefaultInterpolationMode(void); 00327 00334 static void setDefaultRotationInterpolationMode(RotationInterpolationMode im); 00335 00337 static RotationInterpolationMode getDefaultRotationInterpolationMode(void); 00338 00339 typedef map<unsigned short, NodeAnimationTrack*>::type NodeTrackList; 00340 typedef ConstMapIterator<NodeTrackList> NodeTrackIterator; 00341 00342 typedef map<unsigned short, NumericAnimationTrack*>::type NumericTrackList; 00343 typedef ConstMapIterator<NumericTrackList> NumericTrackIterator; 00344 00345 typedef map<unsigned short, VertexAnimationTrack*>::type VertexTrackList; 00346 typedef ConstMapIterator<VertexTrackList> VertexTrackIterator; 00347 00349 const NodeTrackList& _getNodeTrackList(void) const; 00350 00352 NodeTrackIterator getNodeTrackIterator(void) const 00353 { return NodeTrackIterator(mNodeTrackList.begin(), mNodeTrackList.end()); } 00354 00356 const NumericTrackList& _getNumericTrackList(void) const; 00357 00359 NumericTrackIterator getNumericTrackIterator(void) const 00360 { return NumericTrackIterator(mNumericTrackList.begin(), mNumericTrackList.end()); } 00361 00363 const VertexTrackList& _getVertexTrackList(void) const; 00364 00366 VertexTrackIterator getVertexTrackIterator(void) const 00367 { return VertexTrackIterator(mVertexTrackList.begin(), mVertexTrackList.end()); } 00368 00388 void optimise(bool discardIdentityNodeTracks = true); 00389 00391 typedef set<ushort>::type TrackHandleList; 00392 00400 void _collectIdentityNodeTracks(TrackHandleList& tracks) const; 00401 00404 void _destroyNodeTracks(const TrackHandleList& tracks); 00405 00412 Animation* clone(const String& newName) const; 00413 00416 void _keyFrameListChanged(void) { mKeyFrameTimesDirty = true; } 00417 00428 TimeIndex _getTimeIndex(Real timePos) const; 00429 00430 protected: 00432 NodeTrackList mNodeTrackList; 00434 NumericTrackList mNumericTrackList; 00436 VertexTrackList mVertexTrackList; 00437 String mName; 00438 00439 Real mLength; 00440 00441 InterpolationMode mInterpolationMode; 00442 RotationInterpolationMode mRotationInterpolationMode; 00443 00444 static InterpolationMode msDefaultInterpolationMode; 00445 static RotationInterpolationMode msDefaultRotationInterpolationMode; 00446 00448 typedef vector<Real>::type KeyFrameTimeList; 00449 mutable KeyFrameTimeList mKeyFrameTimes; 00451 mutable bool mKeyFrameTimesDirty; 00452 00453 void optimiseNodeTracks(bool discardIdentityTracks); 00454 void optimiseVertexTracks(void); 00455 00457 void buildKeyFrameTimeList(void) const; 00458 }; 00459 00462 } 00463 00464 00465 #endif 00466
Copyright © 2008 Torus Knot Software Ltd
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Wed Nov 3 2010 19:24:51