Skeleton.cpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  2. // SPDX-License-Identifier: MIT
  3. #include <Jolt/Jolt.h>
  4. #include <Jolt/Skeleton/Skeleton.h>
  5. #include <Jolt/ObjectStream/TypeDeclarations.h>
  6. #include <Jolt/Core/StreamIn.h>
  7. #include <Jolt/Core/StreamOut.h>
  8. JPH_NAMESPACE_BEGIN
  9. JPH_IMPLEMENT_SERIALIZABLE_NON_VIRTUAL(Skeleton::Joint)
  10. {
  11. JPH_ADD_ATTRIBUTE(Joint, mName)
  12. JPH_ADD_ATTRIBUTE(Joint, mParentName)
  13. }
  14. JPH_IMPLEMENT_SERIALIZABLE_NON_VIRTUAL(Skeleton)
  15. {
  16. JPH_ADD_ATTRIBUTE(Skeleton, mJoints)
  17. }
  18. int Skeleton::GetJointIndex(const string_view &inName) const
  19. {
  20. for (int i = 0; i < (int)mJoints.size(); ++i)
  21. if (mJoints[i].mName == inName)
  22. return i;
  23. return -1;
  24. }
  25. void Skeleton::CalculateParentJointIndices()
  26. {
  27. for (Joint &j : mJoints)
  28. j.mParentJointIndex = GetJointIndex(j.mParentName);
  29. }
  30. bool Skeleton::AreJointsCorrectlyOrdered() const
  31. {
  32. for (int i = 0; i < (int)mJoints.size(); ++i)
  33. if (mJoints[i].mParentJointIndex >= i)
  34. return false;
  35. return true;
  36. }
  37. void Skeleton::SaveBinaryState(StreamOut &inStream) const
  38. {
  39. inStream.Write((uint32)mJoints.size());
  40. for (const Joint &j : mJoints)
  41. {
  42. inStream.Write(j.mName);
  43. inStream.Write(j.mParentJointIndex);
  44. inStream.Write(j.mParentName);
  45. }
  46. }
  47. Skeleton::SkeletonResult Skeleton::sRestoreFromBinaryState(StreamIn &inStream)
  48. {
  49. Ref<Skeleton> skeleton = new Skeleton;
  50. uint32 len = 0;
  51. inStream.Read(len);
  52. skeleton->mJoints.resize(len);
  53. for (Joint &j : skeleton->mJoints)
  54. {
  55. inStream.Read(j.mName);
  56. inStream.Read(j.mParentJointIndex);
  57. inStream.Read(j.mParentName);
  58. }
  59. SkeletonResult result;
  60. if (inStream.IsEOF() || inStream.IsFailed())
  61. result.SetError("Failed to read skeleton from stream");
  62. else
  63. result.Set(skeleton);
  64. return result;
  65. }
  66. JPH_NAMESPACE_END