imesh/animnode/skeleton2anim.h
Go to the documentation of this file.00001 /* 00002 Copyright (C) 2008 by Marten Svanfeldt 00003 00004 This library is free software; you can redistribute it and/or 00005 modify it under the terms of the GNU Library General Public 00006 License as published by the Free Software Foundation; either 00007 version 2 of the License, or (at your option) any later version. 00008 00009 This library is distributed in the hope that it will be useful, 00010 but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00012 Library General Public License for more details. 00013 00014 You should have received a copy of the GNU Library General Public 00015 License along with this library; if not, write to the Free 00016 Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00017 */ 00018 00019 #ifndef __CS_IMESH_ANIMNODE_SKELETON2ANIM_H__ 00020 #define __CS_IMESH_ANIMNODE_SKELETON2ANIM_H__ 00021 00022 #include "csutil/scf_interface.h" 00023 #include "csutil/ref.h" 00024 #include "csutil/refcount.h" 00025 #include "csutil/bitarray.h" 00026 #include "csgeom/dualquaternion.h" 00027 #include "imesh/skeleton2.h" 00028 00029 class csQuaternion; 00030 class csVector3; 00031 00036 namespace CS { 00037 namespace Animation { 00038 00039 struct iSkeleton; 00040 00041 struct iSkeletonAnimPacketFactory; 00042 struct iSkeletonAnimPacket; 00043 00044 struct iSkeletonAnimation; 00045 00046 struct iSkeletonAnimNodeFactory; 00047 struct iSkeletonAnimNode; 00048 00049 struct iSkeletonAnimationNodeFactory; 00050 struct iSkeletonAnimationNode; 00051 00052 struct iSkeletonBlendNodeFactory; 00053 struct iSkeletonBlendNode; 00054 00055 struct iSkeletonPriorityNodeFactory; 00056 struct iSkeletonPriorityNode; 00057 00058 struct iSkeletonRandomNodeFactory; 00059 struct iSkeletonRandomNode; 00060 00061 struct iSkeletonFSMNodeFactory; 00062 struct iSkeletonFSMNode; 00063 00064 class AnimatedMeshState; 00065 00066 00073 00074 typedef unsigned int ChannelID; 00075 00077 typedef unsigned int KeyFrameID; 00078 00080 typedef unsigned int StateID; 00081 00083 static const ChannelID InvalidChannelID = (ChannelID)~0; 00084 00086 static const KeyFrameID InvalidKeyframeID = (KeyFrameID)~0; 00087 00089 static const StateID InvalidStateID = (StateID)~0; 00090 00092 enum SynchronizationMode 00093 { 00095 SYNC_NONE, 00097 SYNC_FIRSTFRAME 00098 }; 00099 00100 00117 struct iSkeletonAnimPacketFactory : public virtual iBase 00118 { 00119 SCF_INTERFACE(CS::Animation::iSkeletonAnimPacketFactory, 2, 0, 3); 00120 00124 virtual csPtr<iSkeletonAnimPacket> CreateInstance (iSkeleton* skeleton) = 0; 00125 00129 virtual iSkeletonAnimation* CreateAnimation (const char* name) = 0; 00130 00134 virtual iSkeletonAnimation* FindAnimation (const char* name) = 0; 00135 00139 virtual void ClearAnimations () = 0; 00140 00144 virtual iSkeletonAnimation* GetAnimation (size_t index) = 0; 00145 00149 virtual size_t GetAnimationCount () const = 0; 00150 00154 virtual void SetAnimationRoot (iSkeletonAnimNodeFactory* root) = 0; 00155 00159 virtual iSkeletonAnimNodeFactory* GetAnimationRoot () const = 0; 00160 00164 virtual csPtr<iSkeletonAnimationNodeFactory> CreateAnimationNode (const char* name) = 0; 00165 00169 virtual csPtr<iSkeletonBlendNodeFactory> CreateBlendNode (const char* name) = 0; 00170 00174 virtual csPtr<iSkeletonPriorityNodeFactory> CreatePriorityNode (const char* name) = 0; 00175 00179 virtual csPtr<iSkeletonRandomNodeFactory> CreateRandomNode (const char* name) = 0; 00180 00184 virtual csPtr<iSkeletonFSMNodeFactory> CreateFSMNode (const char* name) = 0; 00185 00189 virtual void RemoveAnimation (const char* name) = 0; 00190 00194 virtual void RemoveAnimation (size_t index) = 0; 00195 00201 virtual size_t FindAnimationIndex (const char* name) = 0; 00202 00206 virtual const char* GetName () const = 0; 00207 }; 00208 00221 struct iSkeletonAnimPacket : public virtual iBase 00222 { 00223 SCF_INTERFACE(CS::Animation::iSkeletonAnimPacket, 2, 0, 0); 00224 00228 virtual iSkeletonAnimPacketFactory* GetFactory () const = 0; 00229 00233 virtual iSkeletonAnimNode* GetAnimationRoot () const = 0; 00234 }; 00235 00272 struct iSkeletonAnimation : public virtual iBase 00273 { 00274 SCF_INTERFACE(CS::Animation::iSkeletonAnimation, 2, 0, 5); 00275 00279 virtual const char* GetName () const = 0; 00280 00287 virtual ChannelID AddChannel (BoneID bone) = 0; 00288 00293 virtual ChannelID FindChannel (BoneID bone) const = 0; 00294 00304 virtual void AddKeyFrame (ChannelID channel, float time, 00305 const csQuaternion& rotation, const csVector3& offset) = 0; 00306 00311 virtual size_t GetKeyFrameCount (ChannelID channel) const = 0; 00312 00322 virtual void GetKeyFrame (ChannelID channel, 00323 KeyFrameID keyframe, BoneID& bone, 00324 float& time, csQuaternion& rotation, csVector3& offset) = 0; 00325 00338 CS_DEPRECATED_METHOD_MSG("Deprecated in 2.0. Don't use it anymore (or complain if you found a good reason to).") 00339 virtual void GetTwoKeyFrames (ChannelID channel, float time, BoneID& bone, 00340 float& timeBefore, csQuaternion& beforeRot, csVector3& beforeOffset, 00341 float& timeAfter, csQuaternion& afterRot, csVector3& afterOffset) = 0; 00342 00351 CS_DEPRECATED_METHOD_MSG("Deprecated in 2.0. Use instead the version without the 'isPlayingCyclic' parameter.") 00352 virtual void BlendState (AnimatedMeshState* state, 00353 float baseWeight, float playbackTime, bool isPlayingCyclic) const = 0; 00354 00359 virtual float GetDuration () const = 0; 00360 00368 virtual void SetKeyFrame (ChannelID channel, 00369 KeyFrameID keyframe, const csQuaternion& rotation, 00370 const csVector3& offset) = 0; 00371 00380 virtual void SetFramesInBindSpace (bool isBindSpace) = 0; 00381 00388 virtual bool GetFramesInBindSpace () const = 0; 00389 00394 virtual void ConvertFrameSpace (CS::Animation::iSkeletonFactory* skeleton) = 0; 00395 00399 virtual size_t GetChannelCount () const = 0; 00400 00404 virtual BoneID GetChannelBone (ChannelID channel) const = 0; 00405 00411 virtual void SetChannelBone (ChannelID channel, BoneID bone) = 0; 00412 00417 virtual void RemoveChannel (ChannelID channel) = 0; 00418 00427 virtual void AddOrSetKeyFrame (ChannelID channel, float time, 00428 const csQuaternion& rotation) = 0; 00429 00438 virtual void AddOrSetKeyFrame (ChannelID channel, float time, 00439 const csVector3& offset) = 0; 00440 00453 virtual void BlendState (AnimatedMeshState* state, 00454 float baseWeight, float playbackTime) const = 0; 00455 00462 virtual void ApplyTimeShift (ChannelID channel, float offset) = 0; 00463 }; 00464 00465 00473 struct iSkeletonAnimCallback : public virtual iBase 00474 { 00479 virtual void AnimationFinished (iSkeletonAnimNode* node) = 0; 00480 00484 virtual void AnimationCycled (iSkeletonAnimNode* node) = 0; 00485 00489 virtual void PlayStateChanged (iSkeletonAnimNode* node, bool isPlaying) = 0; 00490 00494 virtual void DurationChanged (iSkeletonAnimNode* node) = 0; 00495 }; 00496 00497 00510 struct iSkeletonAnimNodeFactory : public virtual iBase 00511 { 00512 SCF_INTERFACE(CS::Animation::iSkeletonAnimNodeFactory, 1, 0, 0); 00513 00517 virtual csPtr<iSkeletonAnimNode> CreateInstance ( 00518 iSkeletonAnimPacket* packet, iSkeleton* skeleton) = 0; 00519 00523 virtual const char* GetNodeName () const = 0; 00524 00528 virtual iSkeletonAnimNodeFactory* FindNode (const char* name) = 0; 00529 }; 00530 00545 struct iSkeletonAnimNode : public virtual iBase 00546 { 00547 SCF_INTERFACE(CS::Animation::iSkeletonAnimNode, 1, 0, 0); 00548 00552 virtual void Play () = 0; 00553 00557 virtual void Stop () = 0; 00558 00563 virtual void SetPlaybackPosition (float time) = 0; 00564 00568 virtual float GetPlaybackPosition () const = 0; 00569 00573 virtual float GetDuration () const = 0; 00574 00578 virtual void SetPlaybackSpeed (float speed) = 0; 00579 00583 virtual float GetPlaybackSpeed () const = 0; 00584 00591 virtual void BlendState (AnimatedMeshState* state, float baseWeight = 1.0f) = 0; 00592 00597 virtual void TickAnimation (float dt) = 0; 00598 00602 virtual bool IsActive () const = 0; 00603 00607 virtual iSkeletonAnimNodeFactory* GetFactory () const = 0; 00608 00612 virtual iSkeletonAnimNode* FindNode (const char* name) = 0; 00613 00618 virtual void AddAnimationCallback (iSkeletonAnimCallback* callback) = 0; 00619 00624 virtual void RemoveAnimationCallback (iSkeletonAnimCallback* callback) = 0; 00625 }; 00626 00640 struct iSkeletonAnimationNodeFactory : public iSkeletonAnimNodeFactory 00641 { 00642 SCF_INTERFACE(CS::Animation::iSkeletonAnimationNodeFactory, 1, 0, 0); 00643 00647 virtual void SetAnimation (iSkeletonAnimation* animation) = 0; 00648 00652 virtual iSkeletonAnimation* GetAnimation () const = 0; 00653 00657 virtual void SetCyclic (bool cyclic) = 0; 00658 00662 virtual bool IsCyclic () const = 0; 00663 00667 virtual void SetPlaybackSpeed (float speed) = 0; 00668 00672 virtual float GetPlaybackSpeed () const = 0; 00673 00678 virtual void SetAutomaticReset (bool reset) = 0; 00679 00684 virtual bool GetAutomaticReset () const = 0; 00685 00690 virtual void SetAutomaticStop (bool enabed) = 0; 00691 00696 virtual bool GetAutomaticStop () const = 0; 00697 }; 00698 00713 struct iSkeletonAnimationNode : public iSkeletonAnimNode 00714 { 00715 SCF_INTERFACE(CS::Animation::iSkeletonAnimationNode, 1, 0, 0); 00716 }; 00717 00732 struct iSkeletonBlendNodeFactory : public iSkeletonAnimNodeFactory 00733 { 00734 SCF_INTERFACE(CS::Animation::iSkeletonBlendNodeFactory, 1, 0, 0); 00735 00741 virtual void AddNode (iSkeletonAnimNodeFactory* node, float weight) = 0; 00742 00747 virtual void SetNodeWeight (uint node, float weight) = 0; 00748 00753 virtual void NormalizeWeights () = 0; 00754 00759 virtual iSkeletonAnimNodeFactory* GetNode (uint node) = 0; 00760 00764 virtual uint GetNodeCount () const = 0; 00765 00769 virtual void ClearNodes () = 0; 00770 00774 virtual void SetSynchronizationMode (SynchronizationMode mode) = 0; 00775 00779 virtual SynchronizationMode GetSynchronizationMode () const = 0; 00780 }; 00781 00782 00799 struct iSkeletonBlendNode : public iSkeletonAnimNode 00800 { 00801 SCF_INTERFACE(CS::Animation::iSkeletonBlendNode, 1, 0, 0); 00802 00806 virtual void SetNodeWeight (uint node, float weight) = 0; 00807 00811 virtual void NormalizeWeights () = 0; 00812 }; 00813 00814 00830 struct iSkeletonPriorityNodeFactory : public iSkeletonAnimNodeFactory 00831 { 00832 SCF_INTERFACE(CS::Animation::iSkeletonPriorityNodeFactory, 1, 0, 0); 00833 00839 virtual void AddNode (iSkeletonAnimNodeFactory* node, unsigned int priority) = 0; 00840 00844 virtual void SetNodePriority (uint node, unsigned int priority) = 0; 00845 00850 virtual iSkeletonAnimNodeFactory* GetNode (uint node) = 0; 00851 00855 virtual uint GetNodeCount () const = 0; 00856 00860 virtual void ClearNodes () = 0; 00861 }; 00862 00881 struct iSkeletonPriorityNode : public iSkeletonAnimNode 00882 { 00883 SCF_INTERFACE(CS::Animation::iSkeletonPriorityNode, 1, 0, 0); 00884 00888 virtual void SetNodePriority (uint node, unsigned int priority) = 0; 00889 }; 00890 00905 struct iSkeletonRandomNodeFactory : public iSkeletonAnimNodeFactory 00906 { 00907 SCF_INTERFACE(CS::Animation::iSkeletonRandomNodeFactory, 1, 0, 0); 00908 00922 virtual void AddNode (iSkeletonAnimNodeFactory* node, float probability) = 0; 00923 00929 virtual void SetNodeProbability (uint node, float weight) = 0; 00930 00936 virtual void SetAutomaticSwitch (bool automatic) = 0; 00937 00942 virtual iSkeletonAnimNodeFactory* GetNode (uint node) = 0; 00943 00947 virtual uint GetNodeCount () const = 0; 00948 00952 virtual void ClearNodes () = 0; 00953 }; 00954 00955 00969 struct iSkeletonRandomNode : public iSkeletonAnimNode 00970 { 00971 SCF_INTERFACE(CS::Animation::iSkeletonRandomNode, 1, 0, 0); 00972 00977 virtual void Switch () = 0; 00978 00982 virtual iSkeletonAnimNode* GetCurrentNode () const = 0; 00983 }; 00984 01006 struct iSkeletonFSMNodeFactory : public iSkeletonAnimNodeFactory 01007 { 01008 SCF_INTERFACE(CS::Animation::iSkeletonFSMNodeFactory, 1, 0, 2); 01009 01013 virtual StateID AddState () = 0; 01014 01019 virtual void SetStateNode (StateID id, iSkeletonAnimNodeFactory* nodeFact) = 0; 01020 01025 virtual iSkeletonAnimNodeFactory* GetStateNode (StateID id) const = 0; 01026 01030 virtual void SetStateName (StateID id, const char* name) = 0; 01031 01035 virtual const char* GetStateName (StateID id) const = 0; 01036 01040 virtual StateID FindState (const char* name) const = 0; 01041 01046 virtual void SetStartState (StateID id) = 0; 01047 01052 virtual StateID GetStartState () const = 0; 01053 01057 virtual uint GetStateCount () const = 0; 01058 01062 virtual void ClearStates () = 0; 01063 01072 virtual void SetStateTransition (StateID fromState, 01073 StateID toState, iSkeletonAnimNodeFactory* fact) = 0; 01074 01084 virtual void SetTransitionCrossfade (StateID fromState, 01085 StateID toState, float time1, float time2) = 0; 01086 01090 virtual StateID AddState (const char* name, 01091 iSkeletonAnimNodeFactory *nodeFact) = 0; 01092 01100 virtual void SetAutomaticTransition (StateID fromState, 01101 StateID toState, 01102 bool automatic) = 0; 01103 }; 01104 01105 01120 struct iSkeletonFSMNode : public iSkeletonAnimNode 01121 { 01122 SCF_INTERFACE(CS::Animation::iSkeletonFSMNode, 1, 0, 1); 01123 01134 virtual void SwitchToState (StateID newState) = 0; 01135 01139 virtual StateID GetCurrentState () const = 0; 01140 01144 virtual iSkeletonAnimNode* GetStateNode (StateID state) const = 0; 01145 }; 01146 01159 /* Implementation note: bump number before '*10' in 01160 * SCF_ISKELETONANIMNODEMANAGER_INTERFACE when changing this interface. */ 01161 template <class FactoryInterface> 01162 struct iSkeletonAnimNodeManager : public virtual iBase 01163 { 01164 typedef FactoryInterface FactoryInterfaceType; 01165 01167 virtual FactoryInterface* CreateAnimNodeFactory (const char* name) = 0; 01168 01170 virtual FactoryInterface* FindAnimNodeFactory (const char* name) = 0; 01171 01176 virtual void RemoveAnimNodeFactory (const char* name) = 0; 01177 01179 virtual void ClearAnimNodeFactories () = 0; 01180 }; 01181 01182 #define SCF_ISKELETONANIMNODEMANAGER_INTERFACE(Name, a, b, c) \ 01183 SCF_INTERFACE (Name, ((0*10)+(a)), (b), (c)) 01184 01185 01186 } // namespace Animation 01187 } // namespace CS 01188 01193 CS_DEPRECATED_METHOD_MSG("Use CS::Animation::iSkeletonAnimation instead") 01194 typedef CS::Animation::iSkeletonAnimation iSkeletonAnimation2; 01195 CS_DEPRECATED_METHOD_MSG("Use CS::Animation::iSkeletonAnimationNode instead") 01196 typedef CS::Animation::iSkeletonAnimationNode iSkeletonAnimationNode2; 01197 CS_DEPRECATED_METHOD_MSG("Use CS::Animation::iSkeletonAnimationNodeFactory instead") 01198 typedef CS::Animation::iSkeletonAnimationNodeFactory iSkeletonAnimationNodeFactory2; 01199 CS_DEPRECATED_METHOD_MSG("Use CS::Animation::iSkeletonAnimCallback instead") 01200 typedef CS::Animation::iSkeletonAnimCallback iSkeletonAnimCallback2; 01201 CS_DEPRECATED_METHOD_MSG("Use CS::Animation::iSkeletonAnimNode instead") 01202 typedef CS::Animation::iSkeletonAnimNode iSkeletonAnimNode2; 01203 CS_DEPRECATED_METHOD_MSG("Use CS::Animation::iSkeletonAnimNodeFactory instead") 01204 typedef CS::Animation::iSkeletonAnimNodeFactory iSkeletonAnimNodeFactory2; 01205 CS_DEPRECATED_METHOD_MSG("Use CS::Animation::iSkeletonAnimPacket instead") 01206 typedef CS::Animation::iSkeletonAnimPacket iSkeletonAnimPacket2; 01207 CS_DEPRECATED_METHOD_MSG("Use CS::Animation::iSkeletonAnimPacketFactory instead") 01208 typedef CS::Animation::iSkeletonAnimPacketFactory iSkeletonAnimPacketFactory2; 01209 CS_DEPRECATED_METHOD_MSG("Use CS::Animation::iSkeletonBlendNode instead") 01210 typedef CS::Animation::iSkeletonBlendNode iSkeletonBlendNode2; 01211 CS_DEPRECATED_METHOD_MSG("Use CS::Animation::iSkeletonBlendNodeFactory instead") 01212 typedef CS::Animation::iSkeletonBlendNodeFactory iSkeletonBlendNodeFactory2; 01213 CS_DEPRECATED_METHOD_MSG("Use CS::Animation::iSkeletonFSMNode instead") 01214 typedef CS::Animation::iSkeletonFSMNode iSkeletonFSMNode2; 01215 CS_DEPRECATED_METHOD_MSG("Use CS::Animation::iSkeletonFSMNodeFactory instead") 01216 typedef CS::Animation::iSkeletonFSMNodeFactory iSkeletonFSMNodeFactory2; 01217 CS_DEPRECATED_METHOD_MSG("Use CS::Animation::iSkeletonPriorityNode instead") 01218 typedef CS::Animation::iSkeletonPriorityNode iSkeletonPriorityNode2; 01219 CS_DEPRECATED_METHOD_MSG("Use CS::Animation::iSkeletonPriorityNodeFactory instead") 01220 typedef CS::Animation::iSkeletonPriorityNodeFactory iSkeletonPriorityNodeFactory2; 01221 CS_DEPRECATED_METHOD_MSG("Use CS::Animation::iSkeletonRandomNode instead") 01222 typedef CS::Animation::iSkeletonRandomNode iSkeletonRandomNode2; 01223 CS_DEPRECATED_METHOD_MSG("Use CS::Animation::iSkeletonRandomNodeFactory instead") 01224 typedef CS::Animation::iSkeletonRandomNodeFactory iSkeletonRandomNodeFactory2; 01225 01226 #endif // __CS_IMESH_ANIMNODE_SKELETON2ANIM_H__
Generated for Crystal Space 2.1 by doxygen 1.6.1
