BsScriptAnimationClip.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  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 BansheeEngine
  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_GetLength", &ScriptAnimationClip::internal_GetLength);
  22. metaData.scriptClass->addInternalCall("Internal_GetSampleRate", &ScriptAnimationClip::internal_GetSampleRate);
  23. metaData.scriptClass->addInternalCall("Internal_SetSampleRate", &ScriptAnimationClip::internal_SetSampleRate);
  24. }
  25. MonoObject* ScriptAnimationClip::createInstance()
  26. {
  27. bool dummy = false;
  28. void* params[1];
  29. params[0] = &dummy;
  30. return metaData.scriptClass->createInstance("bool", params);
  31. }
  32. void ScriptAnimationClip::internal_CreateInstance(MonoObject* instance)
  33. {
  34. HAnimationClip clip = AnimationClip::create();
  35. ScriptAnimationClip* scriptInstance;
  36. ScriptResourceManager::instance().createScriptResource(instance, clip, &scriptInstance);
  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. float ScriptAnimationClip::internal_GetLength(ScriptAnimationClip* thisPtr)
  72. {
  73. return thisPtr->getHandle()->getLength();
  74. }
  75. UINT32 ScriptAnimationClip::internal_GetSampleRate(ScriptAnimationClip* thisPtr)
  76. {
  77. return thisPtr->getHandle()->getSampleRate();
  78. }
  79. void ScriptAnimationClip::internal_SetSampleRate(ScriptAnimationClip* thisPtr, UINT32 sampleRate)
  80. {
  81. thisPtr->getHandle()->setSampleRate(sampleRate);
  82. }
  83. MonoField* ScriptAnimationEvent::sNameField = nullptr;
  84. MonoField* ScriptAnimationEvent::sTimeField = nullptr;
  85. ScriptAnimationEvent::ScriptAnimationEvent(MonoObject* instance)
  86. :ScriptObject(instance)
  87. { }
  88. void ScriptAnimationEvent::initRuntimeData()
  89. {
  90. sNameField = metaData.scriptClass->getField("Name");
  91. sTimeField = metaData.scriptClass->getField("Time");
  92. }
  93. AnimationEvent ScriptAnimationEvent::toNative(MonoObject* instance)
  94. {
  95. AnimationEvent output;
  96. MonoString* monoName = nullptr;
  97. sNameField->getValue(instance, &monoName);
  98. output.name = MonoUtil::monoToString(monoName);
  99. sTimeField->getValue(instance, &output.time);
  100. return output;
  101. }
  102. MonoObject* ScriptAnimationEvent::toManaged(const AnimationEvent& event)
  103. {
  104. MonoString* monoString = MonoUtil::stringToMono(event.name);
  105. float time = event.time;
  106. void* params[2] = { monoString, &time };
  107. return metaData.scriptClass->createInstance("string,single", params);
  108. }
  109. }