BsFBXImportData.cpp 1.6 KB

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