SkeletonPose.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  2. // SPDX-License-Identifier: MIT
  3. #include <Jolt/Jolt.h>
  4. #include <Jolt/Skeleton/SkeletonPose.h>
  5. #ifdef JPH_DEBUG_RENDERER
  6. #include <Jolt/Renderer/DebugRenderer.h>
  7. #endif // JPH_DEBUG_RENDERER
  8. JPH_NAMESPACE_BEGIN
  9. void SkeletonPose::SetSkeleton(const Skeleton *inSkeleton)
  10. {
  11. mSkeleton = inSkeleton;
  12. mJoints.resize(mSkeleton->GetJointCount());
  13. mJointMatrices.resize(mSkeleton->GetJointCount());
  14. }
  15. void SkeletonPose::CalculateJointMatrices()
  16. {
  17. for (int i = 0; i < (int)mJoints.size(); ++i)
  18. {
  19. mJointMatrices[i] = mJoints[i].ToMatrix();
  20. int parent = mSkeleton->GetJoint(i).mParentJointIndex;
  21. if (parent >= 0)
  22. {
  23. JPH_ASSERT(parent < i, "Joints must be ordered: parents first");
  24. mJointMatrices[i] = mJointMatrices[parent] * mJointMatrices[i];
  25. }
  26. }
  27. }
  28. void SkeletonPose::CalculateJointStates()
  29. {
  30. for (int i = 0; i < (int)mJoints.size(); ++i)
  31. {
  32. Mat44 local_transform;
  33. int parent = mSkeleton->GetJoint(i).mParentJointIndex;
  34. if (parent >= 0)
  35. local_transform = mJointMatrices[parent].Inversed() * mJointMatrices[i];
  36. else
  37. local_transform = mJointMatrices[i];
  38. JointState &joint = mJoints[i];
  39. joint.mTranslation = local_transform.GetTranslation();
  40. joint.mRotation = local_transform.GetRotation().GetQuaternion();
  41. }
  42. }
  43. void SkeletonPose::CalculateLocalSpaceJointMatrices(Mat44 *outMatrices) const
  44. {
  45. for (int i = 0; i < (int)mJoints.size(); ++i)
  46. outMatrices[i] = mJoints[i].ToMatrix();
  47. }
  48. #ifdef JPH_DEBUG_RENDERER
  49. void SkeletonPose::Draw(const DrawSettings &inDrawSettings, DebugRenderer *inRenderer, Mat44Arg inOffset) const
  50. {
  51. const Skeleton::JointVector &joints = mSkeleton->GetJoints();
  52. for (int b = 0; b < mSkeleton->GetJointCount(); ++b)
  53. {
  54. Mat44 joint_transform = inOffset * mJointMatrices[b];
  55. if (inDrawSettings.mDrawJoints)
  56. {
  57. int parent = joints[b].mParentJointIndex;
  58. if (parent >= 0)
  59. inRenderer->DrawLine(inOffset * mJointMatrices[parent].GetTranslation(), joint_transform.GetTranslation(), Color::sGreen);
  60. }
  61. if (inDrawSettings.mDrawJointOrientations)
  62. inRenderer->DrawCoordinateSystem(joint_transform, 0.05f);
  63. if (inDrawSettings.mDrawJointNames)
  64. inRenderer->DrawText3D(joint_transform.GetTranslation(), joints[b].mName, Color::sWhite, 0.05f);
  65. }
  66. }
  67. #endif // JPH_DEBUG_RENDERER
  68. JPH_NAMESPACE_END