BsScriptAnimationClip.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  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. ScriptAnimationClip* scriptInstance;
  37. ScriptResourceManager::instance().createScriptResource(instance, clip, &scriptInstance);
  38. }
  39. MonoObject* ScriptAnimationClip::internal_GetAnimationCurves(ScriptAnimationClip* thisPtr)
  40. {
  41. SPtr<AnimationCurves> curves = thisPtr->getHandle()->getCurves();
  42. return ScriptAnimationCurves::toManaged(curves);
  43. }
  44. void ScriptAnimationClip::internal_SetAnimationCurves(ScriptAnimationClip* thisPtr, MonoObject* curves)
  45. {
  46. SPtr<AnimationCurves> nativeCurves = ScriptAnimationCurves::toNative(curves);
  47. thisPtr->getHandle()->setCurves(*nativeCurves);
  48. }
  49. MonoArray* ScriptAnimationClip::internal_GetAnimationEvents(ScriptAnimationClip* thisPtr)
  50. {
  51. const Vector<AnimationEvent>& events = thisPtr->getHandle()->getEvents();
  52. UINT32 numEvents = (UINT32)events.size();
  53. ScriptArray eventsArray = ScriptArray::create<ScriptAnimationEvent>(numEvents);
  54. for (UINT32 i = 0; i < numEvents; i++)
  55. eventsArray.set(i, ScriptAnimationEvent::toManaged(events[i]));
  56. return eventsArray.getInternal();
  57. }
  58. void ScriptAnimationClip::internal_SetAnimationEvents(ScriptAnimationClip* thisPtr, MonoArray* events)
  59. {
  60. Vector<AnimationEvent> nativeEvents;
  61. if (events != nullptr)
  62. {
  63. ScriptArray eventsArray(events);
  64. for (UINT32 i = 0; i < eventsArray.size(); i++)
  65. {
  66. AnimationEvent event = ScriptAnimationEvent::toNative(eventsArray.get<MonoObject*>(i));
  67. nativeEvents.push_back(event);
  68. }
  69. }
  70. thisPtr->getHandle()->setEvents(nativeEvents);
  71. }
  72. MonoObject* ScriptAnimationClip::internal_GetRootMotion(ScriptAnimationClip* thisPtr)
  73. {
  74. SPtr<RootMotion> rootMotion = thisPtr->getHandle()->getRootMotion();
  75. return ScriptRootMotion::toManaged(rootMotion);
  76. }
  77. float ScriptAnimationClip::internal_GetLength(ScriptAnimationClip* thisPtr)
  78. {
  79. return thisPtr->getHandle()->getLength();
  80. }
  81. UINT32 ScriptAnimationClip::internal_GetSampleRate(ScriptAnimationClip* thisPtr)
  82. {
  83. return thisPtr->getHandle()->getSampleRate();
  84. }
  85. void ScriptAnimationClip::internal_SetSampleRate(ScriptAnimationClip* thisPtr, UINT32 sampleRate)
  86. {
  87. thisPtr->getHandle()->setSampleRate(sampleRate);
  88. }
  89. MonoField* ScriptAnimationEvent::sNameField = nullptr;
  90. MonoField* ScriptAnimationEvent::sTimeField = nullptr;
  91. ScriptAnimationEvent::ScriptAnimationEvent(MonoObject* instance)
  92. :ScriptObject(instance)
  93. { }
  94. void ScriptAnimationEvent::initRuntimeData()
  95. {
  96. sNameField = metaData.scriptClass->getField("Name");
  97. sTimeField = metaData.scriptClass->getField("Time");
  98. }
  99. AnimationEvent ScriptAnimationEvent::toNative(MonoObject* instance)
  100. {
  101. AnimationEvent output;
  102. MonoString* monoName = nullptr;
  103. sNameField->getValue(instance, &monoName);
  104. output.name = MonoUtil::monoToString(monoName);
  105. sTimeField->getValue(instance, &output.time);
  106. return output;
  107. }
  108. MonoObject* ScriptAnimationEvent::toManaged(const AnimationEvent& event)
  109. {
  110. MonoString* monoString = MonoUtil::stringToMono(event.name);
  111. float time = event.time;
  112. void* params[2] = { monoString, &time };
  113. return metaData.scriptClass->createInstance("string,single", params);
  114. }
  115. }