imesh/skeleton2.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_SKELETON2_H__ 00020 #define __CS_IMESH_SKELETON2_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/quaternion.h" 00027 #include "csgeom/vector3.h" 00028 00029 class csDualQuaternion; 00030 00035 struct iSceneNode; 00036 00037 struct iSkeletonFactory2; 00038 struct iSkeleton2; 00039 00040 class csSkeletalState2; 00041 00042 struct iSkeletonAnimPacketFactory2; 00043 struct iSkeletonAnimPacket2; 00044 00052 00053 typedef unsigned int BoneID; 00054 00056 static const BoneID InvalidBoneID = (BoneID)~0; 00057 00062 struct iSkeletonManager2 : public virtual iBase 00063 { 00064 SCF_INTERFACE(iSkeletonManager2, 1, 0, 0); 00065 00069 virtual iSkeletonFactory2* CreateSkeletonFactory (const char* name) = 0; 00070 00074 virtual iSkeletonFactory2* FindSkeletonFactory (const char* name) = 0; 00075 00079 virtual void ClearSkeletonFactories () = 0; 00080 00084 virtual iSkeletonAnimPacketFactory2* CreateAnimPacketFactory (const char* name) = 0; 00085 00089 virtual iSkeletonAnimPacketFactory2* FindAnimPacketFactory (const char* name) = 0; 00090 00094 virtual void ClearAnimPacketFactories () = 0; 00095 00099 virtual void ClearAll () = 0; 00100 }; 00101 00113 struct iSkeletonFactory2 : public virtual iBase 00114 { 00115 SCF_INTERFACE(iSkeletonFactory2, 1, 0, 0); 00116 00125 virtual BoneID CreateBone (BoneID parent = InvalidBoneID) = 0; 00126 00127 /* 00128 * Find a bone id from its name 00129 * \param name bone name 00130 */ 00131 virtual BoneID FindBone (const char *name) const = 0; 00132 00138 virtual void RemoveBone (BoneID bone) = 0; 00139 00145 virtual BoneID GetBoneParent (BoneID bone) const = 0; 00146 00150 virtual bool HasBone (BoneID bone) const = 0; 00151 00155 virtual void SetBoneName (BoneID bone, const char* name) = 0; 00156 00160 virtual const char* GetBoneName (BoneID bone) const = 0; 00161 00165 virtual BoneID GetTopBoneID () const = 0; 00166 00173 virtual void GetTransformBoneSpace (BoneID bone, csQuaternion& rot, 00174 csVector3& offset) const = 0; 00175 00182 virtual void SetTransformBoneSpace (BoneID bone, const csQuaternion& rot, 00183 const csVector3& offset) = 0; 00184 00191 virtual void GetTransformAbsSpace (BoneID bone, csQuaternion& rot, 00192 csVector3& offset) const = 0; 00193 00200 virtual void SetTransformAbsSpace (BoneID bone, const csQuaternion& rot, 00201 const csVector3& offset) = 0; 00202 00208 virtual csPtr<iSkeleton2> CreateSkeleton () = 0; 00209 00213 virtual iSkeletonAnimPacketFactory2* GetAnimationPacket () const = 0; 00214 00218 virtual void SetAnimationPacket (iSkeletonAnimPacketFactory2* fact) = 0; 00219 }; 00220 00231 struct iSkeleton2 : public virtual iBase 00232 { 00233 SCF_INTERFACE(iSkeleton2, 1, 0, 0); 00234 00238 virtual iSceneNode* GetSceneNode () = 0; 00239 00249 virtual void GetTransformBoneSpace (BoneID bone, csQuaternion& rot, 00250 csVector3& offset) const = 0; 00251 00258 virtual void SetTransformBoneSpace (BoneID bone, const csQuaternion& rot, 00259 const csVector3& offset) = 0; 00260 00267 virtual void GetTransformAbsSpace (BoneID bone, csQuaternion& rot, 00268 csVector3& offset) const = 0; 00269 00276 virtual void SetTransformAbsSpace (BoneID bone, const csQuaternion& rot, 00277 const csVector3& offset) = 0; 00278 00285 virtual void GetTransformBindSpace (BoneID bone, csQuaternion& rot, 00286 csVector3& offset) const = 0; 00287 00288 00295 virtual void SetTransformBindSpace (BoneID bone, const csQuaternion& rot, 00296 const csVector3& offset) = 0; 00297 00301 virtual csPtr<csSkeletalState2> GetStateAbsSpace () = 0; 00302 00306 virtual csPtr<csSkeletalState2> GetStateBoneSpace () = 0; 00307 00311 virtual csPtr<csSkeletalState2> GetStateBindSpace () = 0; 00312 00318 virtual iSkeletonFactory2* GetFactory () const = 0; 00319 00320 00324 virtual iSkeletonAnimPacket2* GetAnimationPacket () const = 0; 00325 00329 virtual void SetAnimationPacket (iSkeletonAnimPacket2* packet) = 0; 00330 00331 00335 virtual void RecreateSkeleton () = 0; 00336 00340 virtual void UpdateSkeleton (float dt) = 0; 00341 00345 virtual unsigned int GetSkeletonStateVersion () const = 0; 00346 }; 00347 00351 class csSkeletalState2 : public csRefCount 00352 { 00353 public: 00354 00356 csSkeletalState2 () 00357 : boneVecs (0), boneQuats (0), numberOfBones (0) 00358 {} 00359 00360 // 00361 virtual inline ~csSkeletalState2 () 00362 { 00363 delete[] boneVecs; 00364 delete[] boneQuats; 00365 } 00366 00370 inline const csVector3& GetVector (size_t i) const 00371 { 00372 return boneVecs[i]; 00373 } 00374 00378 inline csVector3& GetVector (size_t i) 00379 { 00380 return boneVecs[i]; 00381 } 00382 00383 00387 inline const csQuaternion& GetQuaternion (size_t i) const 00388 { 00389 return boneQuats[i]; 00390 } 00391 00395 inline csQuaternion& GetQuaternion (size_t i) 00396 { 00397 return boneQuats[i]; 00398 } 00399 00403 inline bool IsBoneUsed (BoneID bone) const 00404 { 00405 return bitSet.IsBitSet (bone); 00406 } 00407 00411 inline void SetBoneUsed (BoneID bone) 00412 { 00413 bitSet.SetBit (bone); 00414 } 00415 00419 inline size_t GetBoneCount () const 00420 { 00421 return numberOfBones; 00422 } 00423 00427 inline void Setup (size_t numBones) 00428 { 00429 delete[] boneVecs; 00430 delete[] boneQuats; 00431 00432 bitSet.SetSize (numBones); 00433 bitSet.Clear (); 00434 boneVecs = new csVector3 [numBones]; 00435 boneQuats = new csQuaternion [numBones]; 00436 numberOfBones = numBones; 00437 00438 for (size_t i = 0; i < numBones; ++i) 00439 boneVecs[i].Set (0,0,0); 00440 } 00441 00442 protected: 00443 csBitArray bitSet; 00444 csVector3* boneVecs; 00445 csQuaternion* boneQuats; 00446 size_t numberOfBones; 00447 }; 00448 00449 00450 00456 #endif // __CS_IMESH_SKELETON2_H__ 00457
Generated for Crystal Space 1.4.0 by doxygen 1.5.8