BabylonNode.cpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #include "stdafx.h"
  2. #include "BabylonNode.h"
  3. #include "NodeHelpers.h"
  4. BabylonNode::BabylonNode(FbxNode* fbxNode) : _node(fbxNode){
  5. _localTransform = ConvertToBabylonCoordinateSystem(CalculateLocalTransform( fbxNode));
  6. _globalTransform = ConvertToBabylonCoordinateSystem(CalculateLocalTransform(fbxNode));
  7. auto childCount = fbxNode->GetChildCount();
  8. for (int i = 0; i < childCount; ++i){
  9. _children.emplace_back(fbxNode->GetChild(i));
  10. }
  11. }
  12. BabylonNodeType BabylonNode::nodeType(){
  13. if (_node->GetMesh()){
  14. return BabylonNodeType::Mesh;
  15. }
  16. if (_node->GetCamera()){
  17. return BabylonNodeType::Camera;
  18. }
  19. if (_node->GetSkeleton()){
  20. return BabylonNodeType::Skeleton;
  21. }
  22. if (_node->GetLight()) {
  23. return BabylonNodeType::Light;
  24. }
  25. return BabylonNodeType::Empty;
  26. }
  27. bool BabylonNode::isEmptySkeletonOrEmptyMesh()
  28. {
  29. auto type = nodeType();
  30. switch (type)
  31. {
  32. case BabylonNodeType::Mesh:
  33. {
  34. auto mesh = _node->GetMesh();
  35. if (mesh->GetPolygonCount() == 0) {
  36. return true;
  37. }
  38. else {
  39. return false;
  40. }
  41. }
  42. case BabylonNodeType::Skeleton:
  43. case BabylonNodeType::Empty:
  44. return true;
  45. default:
  46. return false;
  47. }
  48. }
  49. bool BabylonNode::isEmptySkeletonOrEmptyMeshRecursive()
  50. {
  51. if (!isEmptySkeletonOrEmptyMesh()) {
  52. return false;
  53. }
  54. for (auto& c : children()) {
  55. if (!c.isEmptySkeletonOrEmptyMeshRecursive()) {
  56. return false;
  57. }
  58. }
  59. return true;
  60. }
  61. babylon_vector3 BabylonNode::localScale(FbxTime time){
  62. auto transform = ConvertToBabylonCoordinateSystem(CalculateLocalTransform(_node,time));
  63. return transform.GetS();
  64. }
  65. babylon_vector4 BabylonNode::localRotationQuat(){
  66. auto ret = _localTransform.GetQ();
  67. return babylon_vector4(static_cast<float>(ret[0]), static_cast<float>(ret[1]), static_cast<float>(ret[2]), static_cast<float>(ret[3]));
  68. }
  69. babylon_vector4 BabylonNode::localRotationQuat(FbxTime time){
  70. auto transform = ConvertToBabylonCoordinateSystem(CalculateLocalTransform(_node, time));
  71. auto ret = transform.GetQ();
  72. return babylon_vector4(static_cast<float>(ret[0]), static_cast<float>(ret[1]), static_cast<float>(ret[2]), static_cast<float>(ret[3]));
  73. }
  74. babylon_vector3 BabylonNode::localTranslate(FbxTime time){
  75. auto transform = ConvertToBabylonCoordinateSystem(CalculateLocalTransform(_node, time));
  76. return transform.GetT();
  77. }