BsSkeletonRTTI.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #pragma once
  4. #include "BsCorePrerequisites.h"
  5. #include "BsRTTIType.h"
  6. #include "BsSkeleton.h"
  7. namespace BansheeEngine
  8. {
  9. /** @cond RTTI */
  10. /** @addtogroup RTTI-Impl-Core
  11. * @{
  12. */
  13. class BS_CORE_EXPORT SkeletonRTTI : public RTTIType <Skeleton, IReflectable, SkeletonRTTI>
  14. {
  15. private:
  16. Matrix4& getBindPose(Skeleton* obj, UINT32 idx) { return obj->mInvBindPoses[idx]; }
  17. void setBindPose(Skeleton* obj, UINT32 idx, Matrix4& value) { obj->mInvBindPoses[idx] = value; }
  18. void setNumBindPoses(Skeleton* obj, UINT32 size)
  19. {
  20. obj->mNumBones = size;
  21. assert(obj->mInvBindPoses == nullptr);
  22. obj->mInvBindPoses = bs_newN<Matrix4>(size);
  23. }
  24. SkeletonBoneInfo& getBoneInfo(Skeleton* obj, UINT32 idx) { return obj->mBoneInfo[idx]; }
  25. void setBoneInfo(Skeleton* obj, UINT32 idx, SkeletonBoneInfo& value) { obj->mBoneInfo[idx] = value; }
  26. void setNumBoneInfos(Skeleton* obj, UINT32 size)
  27. {
  28. obj->mNumBones = size;
  29. assert(obj->mBoneInfo == nullptr);
  30. obj->mBoneInfo = bs_newN<SkeletonBoneInfo>(size);
  31. }
  32. UINT32 getNumBones(Skeleton* obj) { return obj->mNumBones; }
  33. public:
  34. SkeletonRTTI()
  35. {
  36. addPlainArrayField("bindPoses", 0, &SkeletonRTTI::getBindPose, &SkeletonRTTI::getNumBones,
  37. &SkeletonRTTI::setBindPose, &SkeletonRTTI::setNumBindPoses);
  38. addPlainArrayField("boneInfo", 1, &SkeletonRTTI::getBoneInfo, &SkeletonRTTI::getNumBones,
  39. &SkeletonRTTI::setBoneInfo, &SkeletonRTTI::setNumBoneInfos);
  40. }
  41. const String& getRTTIName() override
  42. {
  43. static String name = "Skeleton";
  44. return name;
  45. }
  46. UINT32 getRTTIId() override
  47. {
  48. return TID_Skeleton;
  49. }
  50. SPtr<IReflectable> newRTTIObject() override
  51. {
  52. return Skeleton::createEmpty();
  53. }
  54. };
  55. template<> struct RTTIPlainType<SkeletonBoneInfo>
  56. {
  57. enum { id = TID_SkeletonBoneInfo }; enum { hasDynamicSize = 1 };
  58. /** @copydoc RTTIPlainType::toMemory */
  59. static void toMemory(const SkeletonBoneInfo& data, char* memory)
  60. {
  61. UINT32 size = sizeof(UINT32);
  62. char* memoryStart = memory;
  63. memory += sizeof(UINT32);
  64. memory = rttiWriteElem(data.name, memory, size);
  65. memory = rttiWriteElem(data.parent, memory, size);
  66. memcpy(memoryStart, &size, sizeof(UINT32));
  67. }
  68. /** @copydoc RTTIPlainType::fromMemory */
  69. static UINT32 fromMemory(SkeletonBoneInfo& data, char* memory)
  70. {
  71. UINT32 size = 0;
  72. memory = rttiReadElem(size, memory);
  73. memory = rttiReadElem(data.name, memory);
  74. memory = rttiReadElem(data.parent, memory);
  75. return size;
  76. }
  77. /** @copydoc RTTIPlainType::getDynamicSize */
  78. static UINT32 getDynamicSize(const SkeletonBoneInfo& data)
  79. {
  80. UINT64 dataSize = sizeof(UINT32);
  81. dataSize += rttiGetElemSize(data.name);
  82. dataSize += rttiGetElemSize(data.parent);
  83. assert(dataSize <= std::numeric_limits<UINT32>::max());
  84. return (UINT32)dataSize;
  85. }
  86. };
  87. /** @} */
  88. /** @endcond */
  89. }