BsScriptAnimationCurve.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsScriptAnimationCurve.h"
  4. #include "BsMonoUtil.h"
  5. #include "BsMonoClass.h"
  6. #include "BsMonoMethod.h"
  7. #include "BsAnimationCurve.h"
  8. using namespace std::placeholders;
  9. namespace bs
  10. {
  11. ScriptKeyFrame::ScriptKeyFrame(MonoObject* instance)
  12. :ScriptObject(instance)
  13. { }
  14. void ScriptKeyFrame::initRuntimeData()
  15. {
  16. // Do nothing
  17. }
  18. ScriptAnimationCurve::ScriptAnimationCurve(MonoObject* instance, const SPtr<TAnimationCurve<float>>& curve)
  19. :ScriptObject(instance), mCurve(curve)
  20. { }
  21. void ScriptAnimationCurve::initRuntimeData()
  22. {
  23. metaData.scriptClass->addInternalCall("Internal_Create", &ScriptAnimationCurve::internal_Create);
  24. metaData.scriptClass->addInternalCall("Internal_GetKeyFrames", &ScriptAnimationCurve::internal_GetKeyFrames);
  25. metaData.scriptClass->addInternalCall("Internal_SetKeyFrames", &ScriptAnimationCurve::internal_SetKeyFrames);
  26. metaData.scriptClass->addInternalCall("Internal_Evaluate", &ScriptAnimationCurve::internal_Evaluate);
  27. }
  28. MonoObject* ScriptAnimationCurve::create(const TAnimationCurve<float>& curve)
  29. {
  30. SPtr<TAnimationCurve<float>> curvePtr = bs_shared_ptr_new<TAnimationCurve<float>>();
  31. *curvePtr = curve;
  32. MonoObject* instance = metaData.scriptClass->createInstance();
  33. new (bs_alloc<ScriptAnimationCurve>()) ScriptAnimationCurve(instance, curvePtr);
  34. return instance;
  35. }
  36. void ScriptAnimationCurve::internal_Create(MonoObject* instance, MonoArray* keyFrames)
  37. {
  38. ScriptArray inArray(keyFrames);
  39. UINT32 numKeyframes = inArray.size();
  40. Vector<TKeyframe<float>> nativeKeyframes(numKeyframes);
  41. memcpy(nativeKeyframes.data(), (UINT8*)inArray.getRawPtr<TKeyframe<float>>(),
  42. numKeyframes * sizeof(TKeyframe<float>));
  43. SPtr<TAnimationCurve<float>> curve = bs_shared_ptr_new<TAnimationCurve<float>>(nativeKeyframes);
  44. new (bs_alloc<ScriptAnimationCurve>()) ScriptAnimationCurve(instance, curve);
  45. }
  46. MonoArray* ScriptAnimationCurve::internal_GetKeyFrames(ScriptAnimationCurve* thisPtr)
  47. {
  48. UINT32 numKeyframes = thisPtr->mCurve->getNumKeyFrames();
  49. ScriptArray output = ScriptArray::create<ScriptKeyFrame>(numKeyframes);
  50. for (UINT32 i = 0; i < numKeyframes; i++)
  51. output.set(i, thisPtr->mCurve->getKeyFrame(i));
  52. return output.getInternal();
  53. }
  54. void ScriptAnimationCurve::internal_SetKeyFrames(ScriptAnimationCurve* thisPtr, MonoArray* keyFrames)
  55. {
  56. ScriptArray inArray(keyFrames);
  57. UINT32 numKeyframes = inArray.size();
  58. Vector<TKeyframe<float>> nativeKeyframes(numKeyframes);
  59. memcpy(nativeKeyframes.data(), (UINT8*)inArray.getRawPtr<TKeyframe<float>>(),
  60. numKeyframes * sizeof(TKeyframe<float>));
  61. std::sort(nativeKeyframes.begin(), nativeKeyframes.end(),
  62. [](const TKeyframe<float>& x, const TKeyframe<float>& y)
  63. {
  64. return x.time < y.time;
  65. });
  66. thisPtr->mCurve = bs_shared_ptr_new<TAnimationCurve<float>>(nativeKeyframes);
  67. }
  68. float ScriptAnimationCurve::internal_Evaluate(ScriptAnimationCurve* thisPtr, float time, bool loop)
  69. {
  70. return thisPtr->mCurve->evaluate(time, loop);
  71. }
  72. }