SkinInfo.h 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #pragma once
  2. #include <fbxsdk.h>
  3. #include <memory>
  4. #include <vector>
  5. #include <map>
  6. #include <string>
  7. #include "BabylonSkeleton.h"
  8. struct BoneAnimKeyFrame{
  9. int frame;
  10. FbxMatrix matrixLocal;
  11. FbxMatrix matrixGlobal;
  12. };
  13. struct BoneInfo{
  14. FbxNode* linkNode;
  15. FbxCluster* cluster;
  16. int FbxClusterIndex;
  17. int parentBoneIndex;
  18. std::wstring name;
  19. FbxMatrix matrixGlobalBindPose;
  20. FbxMatrix matrixLocalBindPose;
  21. std::vector<BoneAnimKeyFrame> keyFrames;
  22. BoneInfo(const BoneInfo&) = default;
  23. BoneInfo(BoneInfo&& moved) :
  24. linkNode(std::move(moved.linkNode)),
  25. cluster(std::move(moved.cluster)),
  26. FbxClusterIndex(std::move(moved.FbxClusterIndex)),
  27. parentBoneIndex(std::move(moved.parentBoneIndex)),
  28. name(std::move(moved.name)),
  29. matrixGlobalBindPose(std::move(moved.matrixGlobalBindPose)),
  30. matrixLocalBindPose(std::move(moved.matrixLocalBindPose)),
  31. keyFrames(std::move(moved.keyFrames))
  32. {
  33. }
  34. BoneInfo() = default;
  35. };
  36. struct BoneIndexAndWeight{
  37. int index;
  38. double weight;
  39. };
  40. class SkinInfo
  41. {
  42. private:
  43. FbxNode* _node;
  44. FbxMesh* _mesh;
  45. FbxSkin* _skin;
  46. std::vector<BoneInfo> _bones;
  47. std::map<int, int> _fbxClusterIndexToBoneIndex;
  48. std::map<int, std::vector<BoneIndexAndWeight>> _controlPointToBoneIndicesAndWeights;
  49. public:
  50. SkinInfo(FbxNode* meshNode);
  51. SkinInfo(const SkinInfo&) = default;
  52. SkinInfo(SkinInfo&& moved) :
  53. _node(std::move(moved._node)),
  54. _mesh(std::move(moved._mesh)),
  55. _skin(std::move(moved._skin)),
  56. _bones(std::move(moved._bones)),
  57. _fbxClusterIndexToBoneIndex(std::move(moved._fbxClusterIndexToBoneIndex)),
  58. _controlPointToBoneIndicesAndWeights(std::move(moved._controlPointToBoneIndicesAndWeights))
  59. {}
  60. bool hasSkin() const{
  61. return _skin != nullptr;
  62. }
  63. const std::vector<BoneIndexAndWeight>& controlPointBoneIndicesAndWeights(int cpIndex)const {
  64. return _controlPointToBoneIndicesAndWeights.find(cpIndex)->second;
  65. }
  66. int bonesCount() const{
  67. return static_cast<int>( _bones.size());
  68. }
  69. void buildBabylonSkeleton(BabylonSkeleton& skel);
  70. };