BsScriptAnimationClip.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsScriptAnimationClip.h"
  4. #include "BsScriptAnimationCurves.h"
  5. #include "BsScriptMeta.h"
  6. #include "BsMonoClass.h"
  7. #include "BsScriptResourceManager.h"
  8. namespace bs
  9. {
  10. ScriptAnimationClip::ScriptAnimationClip(MonoObject* instance, const HAnimationClip& animationClip)
  11. :TScriptResource(instance, animationClip)
  12. {
  13. }
  14. void ScriptAnimationClip::initRuntimeData()
  15. {
  16. metaData.scriptClass->addInternalCall("Internal_CreateInstance", &ScriptAnimationClip::internal_CreateInstance);
  17. metaData.scriptClass->addInternalCall("Internal_GetAnimationCurves", &ScriptAnimationClip::internal_GetAnimationCurves);
  18. metaData.scriptClass->addInternalCall("Internal_SetAnimationCurves", &ScriptAnimationClip::internal_SetAnimationCurves);
  19. metaData.scriptClass->addInternalCall("Internal_GetAnimationEvents", &ScriptAnimationClip::internal_GetAnimationEvents);
  20. metaData.scriptClass->addInternalCall("Internal_SetAnimationEvents", &ScriptAnimationClip::internal_SetAnimationEvents);
  21. metaData.scriptClass->addInternalCall("Internal_GetRootMotion", &ScriptAnimationClip::internal_GetRootMotion);
  22. metaData.scriptClass->addInternalCall("Internal_GetLength", &ScriptAnimationClip::internal_GetLength);
  23. metaData.scriptClass->addInternalCall("Internal_GetSampleRate", &ScriptAnimationClip::internal_GetSampleRate);
  24. metaData.scriptClass->addInternalCall("Internal_SetSampleRate", &ScriptAnimationClip::internal_SetSampleRate);
  25. }
  26. MonoObject* ScriptAnimationClip::createInstance()
  27. {
  28. bool dummy = false;
  29. void* params[1];
  30. params[0] = &dummy;
  31. return metaData.scriptClass->createInstance("bool", params);
  32. }
  33. void ScriptAnimationClip::internal_CreateInstance(MonoObject* instance)
  34. {
  35. HAnimationClip clip = AnimationClip::create();
  36. ScriptResourceBase* scriptInstance = ScriptResourceManager::instance().createBuiltinScriptResource(clip, instance);
  37. }
  38. MonoObject* ScriptAnimationClip::internal_GetAnimationCurves(ScriptAnimationClip* thisPtr)
  39. {
  40. SPtr<AnimationCurves> curves = thisPtr->getHandle()->getCurves();
  41. return ScriptAnimationCurves::toManaged(curves);
  42. }
  43. void ScriptAnimationClip::internal_SetAnimationCurves(ScriptAnimationClip* thisPtr, MonoObject* curves)
  44. {
  45. SPtr<AnimationCurves> nativeCurves = ScriptAnimationCurves::toNative(curves);
  46. thisPtr->getHandle()->setCurves(*nativeCurves);
  47. }
  48. MonoArray* ScriptAnimationClip::internal_GetAnimationEvents(ScriptAnimationClip* thisPtr)
  49. {
  50. const Vector<AnimationEvent>& events = thisPtr->getHandle()->getEvents();
  51. UINT32 numEvents = (UINT32)events.size();
  52. ScriptArray eventsArray = ScriptArray::create<ScriptAnimationEvent>(numEvents);
  53. for (UINT32 i = 0; i < numEvents; i++)
  54. eventsArray.set(i, ScriptAnimationEvent::toManaged(events[i]));
  55. return eventsArray.getInternal();
  56. }
  57. void ScriptAnimationClip::internal_SetAnimationEvents(ScriptAnimationClip* thisPtr, MonoArray* events)
  58. {
  59. Vector<AnimationEvent> nativeEvents;
  60. if (events != nullptr)
  61. {
  62. ScriptArray eventsArray(events);
  63. for (UINT32 i = 0; i < eventsArray.size(); i++)
  64. {
  65. AnimationEvent event = ScriptAnimationEvent::toNative(eventsArray.get<MonoObject*>(i));
  66. nativeEvents.push_back(event);
  67. }
  68. }
  69. thisPtr->getHandle()->setEvents(nativeEvents);
  70. }
  71. MonoObject* ScriptAnimationClip::internal_GetRootMotion(ScriptAnimationClip* thisPtr)
  72. {
  73. SPtr<RootMotion> rootMotion = thisPtr->getHandle()->getRootMotion();
  74. return ScriptRootMotion::toManaged(rootMotion);
  75. }
  76. float ScriptAnimationClip::internal_GetLength(ScriptAnimationClip* thisPtr)
  77. {
  78. return thisPtr->getHandle()->getLength();
  79. }
  80. UINT32 ScriptAnimationClip::internal_GetSampleRate(ScriptAnimationClip* thisPtr)
  81. {
  82. return thisPtr->getHandle()->getSampleRate();
  83. }
  84. void ScriptAnimationClip::internal_SetSampleRate(ScriptAnimationClip* thisPtr, UINT32 sampleRate)
  85. {
  86. thisPtr->getHandle()->setSampleRate(sampleRate);
  87. }
  88. MonoField* ScriptAnimationEvent::sNameField = nullptr;
  89. MonoField* ScriptAnimationEvent::sTimeField = nullptr;
  90. ScriptAnimationEvent::ScriptAnimationEvent(MonoObject* instance)
  91. :ScriptObject(instance)
  92. { }
  93. void ScriptAnimationEvent::initRuntimeData()
  94. {
  95. sNameField = metaData.scriptClass->getField("Name");
  96. sTimeField = metaData.scriptClass->getField("Time");
  97. }
  98. AnimationEvent ScriptAnimationEvent::toNative(MonoObject* instance)
  99. {
  100. AnimationEvent output;
  101. MonoString* monoName = nullptr;
  102. sNameField->get(instance, &monoName);
  103. output.name = MonoUtil::monoToString(monoName);
  104. sTimeField->get(instance, &output.time);
  105. return output;
  106. }
  107. MonoObject* ScriptAnimationEvent::toManaged(const AnimationEvent& event)
  108. {
  109. MonoString* monoString = MonoUtil::stringToMono(event.name);
  110. float time = event.time;
  111. void* params[2] = { monoString, &time };
  112. return metaData.scriptClass->createInstance("string,single", params);
  113. }
  114. }