BsScriptAnimationClip.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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. }
  23. MonoObject* ScriptAnimationClip::createInstance()
  24. {
  25. bool dummy = false;
  26. void* params[1];
  27. params[0] = &dummy;
  28. return metaData.scriptClass->createInstance("bool", params);
  29. }
  30. void ScriptAnimationClip::internal_CreateInstance(MonoObject* instance)
  31. {
  32. HAnimationClip clip = AnimationClip::create();
  33. ScriptAnimationClip* scriptInstance;
  34. ScriptResourceManager::instance().createScriptResource(instance, clip, &scriptInstance);
  35. }
  36. MonoObject* ScriptAnimationClip::internal_GetAnimationCurves(ScriptAnimationClip* thisPtr)
  37. {
  38. SPtr<AnimationCurves> curves = thisPtr->getHandle()->getCurves();
  39. return ScriptAnimationCurves::toManaged(curves);
  40. }
  41. void ScriptAnimationClip::internal_SetAnimationCurves(ScriptAnimationClip* thisPtr, MonoObject* curves)
  42. {
  43. SPtr<AnimationCurves> nativeCurves = ScriptAnimationCurves::toNative(curves);
  44. thisPtr->getHandle()->setCurves(*nativeCurves);
  45. }
  46. MonoArray* ScriptAnimationClip::internal_GetAnimationEvents(ScriptAnimationClip* thisPtr)
  47. {
  48. const Vector<AnimationEvent>& events = thisPtr->getHandle()->getEvents();
  49. UINT32 numEvents = (UINT32)events.size();
  50. ScriptArray eventsArray = ScriptArray::create<ScriptAnimationEvent>(numEvents);
  51. for (UINT32 i = 0; i < numEvents; i++)
  52. eventsArray.set(i, ScriptAnimationEvent::toManaged(events[i]));
  53. return eventsArray.getInternal();
  54. }
  55. void ScriptAnimationClip::internal_SetAnimationEvents(ScriptAnimationClip* thisPtr, MonoArray* events)
  56. {
  57. Vector<AnimationEvent> nativeEvents;
  58. if (events != nullptr)
  59. {
  60. ScriptArray eventsArray(events);
  61. for (UINT32 i = 0; i < eventsArray.size(); i++)
  62. {
  63. AnimationEvent event = ScriptAnimationEvent::toNative(eventsArray.get<MonoObject*>(i));
  64. nativeEvents.push_back(event);
  65. }
  66. }
  67. thisPtr->getHandle()->setEvents(nativeEvents);
  68. }
  69. float ScriptAnimationClip::internal_GetLength(ScriptAnimationClip* thisPtr)
  70. {
  71. return thisPtr->getHandle()->getLength();
  72. }
  73. MonoField* ScriptAnimationEvent::sNameField = nullptr;
  74. MonoField* ScriptAnimationEvent::sTimeField = nullptr;
  75. ScriptAnimationEvent::ScriptAnimationEvent(MonoObject* instance)
  76. :ScriptObject(instance)
  77. { }
  78. void ScriptAnimationEvent::initRuntimeData()
  79. {
  80. sNameField = metaData.scriptClass->getField("Name");
  81. sTimeField = metaData.scriptClass->getField("Time");
  82. }
  83. AnimationEvent ScriptAnimationEvent::toNative(MonoObject* instance)
  84. {
  85. AnimationEvent output;
  86. MonoString* monoName = nullptr;
  87. sNameField->getValue(instance, &monoName);
  88. output.name = MonoUtil::monoToString(monoName);
  89. sTimeField->getValue(instance, &output.time);
  90. return output;
  91. }
  92. MonoObject* ScriptAnimationEvent::toManaged(const AnimationEvent& event)
  93. {
  94. MonoString* monoString = MonoUtil::stringToMono(event.name);
  95. float time = event.time;
  96. void* params[2] = { monoString, &time };
  97. return metaData.scriptClass->createInstance("string, float", params);
  98. }
  99. }