BsSkeleton.cpp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsSkeleton.h"
  4. #include "BsSkeletonRTTI.h"
  5. namespace BansheeEngine
  6. {
  7. Skeleton::Skeleton()
  8. :mBindPoses(nullptr), mBoneInfo(nullptr), mNumBones(0)
  9. { }
  10. Skeleton::Skeleton(BONE_DESC* bones, UINT32 numBones)
  11. :mBindPoses(bs_newN<Matrix4>(numBones)), mBoneInfo(bs_newN<SkeletonBoneInfo>(numBones)), mNumBones(numBones)
  12. {
  13. for(UINT32 i = 0; i < numBones; i++)
  14. {
  15. mBindPoses[i] = bones[i].invBindPose;
  16. mBoneInfo[i].name = bones[i].name;
  17. mBoneInfo[i].parent = bones[i].parent;
  18. }
  19. }
  20. Skeleton::~Skeleton()
  21. {
  22. if(mBindPoses != nullptr)
  23. bs_deleteN(mBindPoses, mNumBones);
  24. if (mBoneInfo != nullptr)
  25. bs_deleteN(mBoneInfo, mNumBones);
  26. }
  27. SPtr<Skeleton> Skeleton::create(BONE_DESC* bones, UINT32 numBones)
  28. {
  29. Skeleton* rawPtr = new (bs_alloc<Skeleton>()) Skeleton(bones, numBones);
  30. return bs_shared_ptr<Skeleton>(rawPtr);
  31. }
  32. void Skeleton::getPose(SkeletonPose& pose, const AnimationClip& clip, float time, bool loop)
  33. {
  34. ANIM_BLEND_STATE_DESC state;
  35. state.clip = &clip;
  36. state.layer = 0;
  37. state.loop = loop;
  38. state.weight = 1.0f;
  39. getPose(pose, &state, 1, time);
  40. }
  41. void Skeleton::getPose(SkeletonPose& pose, const ANIM_BLEND_STATE_DESC* states, UINT32 numStates, float time)
  42. {
  43. // TODO -Blend locally, normalize all weights to 1, layers for additive animations
  44. // TODO
  45. }
  46. SPtr<Skeleton> Skeleton::createEmpty()
  47. {
  48. Skeleton* rawPtr = new (bs_alloc<Skeleton>()) Skeleton();
  49. SPtr<Skeleton> newSkeleton = bs_shared_ptr<Skeleton>(rawPtr);
  50. return newSkeleton;
  51. }
  52. RTTITypeBase* Skeleton::getRTTIStatic()
  53. {
  54. return SkeletonRTTI::instance();
  55. }
  56. RTTITypeBase* Skeleton::getRTTI() const
  57. {
  58. return getRTTIStatic();
  59. }
  60. }