BsFBXImportData.cpp 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #include "BsFBXImportData.h"
  2. namespace BansheeEngine
  3. {
  4. FBXImportNode::~FBXImportNode()
  5. {
  6. for (auto& child : children)
  7. bs_delete(child);
  8. }
  9. FBXImportScene::FBXImportScene()
  10. :rootNode(nullptr)
  11. { }
  12. FBXImportScene::~FBXImportScene()
  13. {
  14. if (rootNode != nullptr)
  15. bs_delete(rootNode);
  16. for (auto& mesh : meshes)
  17. bs_delete(mesh);
  18. }
  19. float FBXAnimationCurve::evaluate(float time)
  20. {
  21. INT32 keyframeCount = (INT32)keyframes.size();
  22. if (keyframeCount == 0)
  23. return 0.0f;
  24. INT32 keyframeIdx = -1;
  25. for (INT32 i = 0; i < keyframeCount; i++)
  26. {
  27. if (time <= keyframes[i].time)
  28. {
  29. keyframeIdx = i;
  30. break;
  31. }
  32. }
  33. if (keyframeIdx == -1)
  34. keyframeIdx = keyframeCount - 1;
  35. if (keyframeIdx == 0)
  36. return keyframes[0].value;
  37. FBXKeyFrame& kfPrev = keyframes[keyframeIdx - 1];
  38. FBXKeyFrame& kfCur = keyframes[keyframeIdx];
  39. float delta = kfCur.time - kfPrev.time;
  40. float offset = time - kfPrev.time;
  41. float t = offset / delta;
  42. // Evaluate Cubic Hermite spline
  43. float t2 = t * t;
  44. float t3 = t2 * t;
  45. float x0 = (2 * t3 - 3 * t2 + 1) * kfPrev.value;
  46. float x1 = (t3 - 2 * t2 + t) * kfPrev.outTangent;
  47. float x2 = (-2 * t3 + 3 * t2) * kfCur.value;
  48. float x3 = (t3 - t2) * kfCur.inTangent;
  49. return x0 + x1 + x2 + x3;
  50. }
  51. }