BsScriptAnimation.cpp 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsScriptAnimation.h"
  4. #include "BsScriptMeta.h"
  5. #include "BsMonoField.h"
  6. #include "BsMonoClass.h"
  7. #include "BsMonoManager.h"
  8. #include "BsMonoUtil.h"
  9. #include "BsScriptAnimationClip.h"
  10. namespace BansheeEngine
  11. {
  12. ScriptAnimation::ScriptAnimation(MonoObject* managedInstance)
  13. :ScriptObject(managedInstance), mAnimation(nullptr)
  14. {
  15. mAnimation = Animation::create();
  16. }
  17. ScriptAnimation::~ScriptAnimation()
  18. { }
  19. void ScriptAnimation::initRuntimeData()
  20. {
  21. metaData.scriptClass->addInternalCall("Internal_Create", &ScriptAnimation::internal_Create);
  22. metaData.scriptClass->addInternalCall("Internal_Destroy", &ScriptAnimation::internal_Destroy);
  23. metaData.scriptClass->addInternalCall("Internal_SetWrapMode", &ScriptAnimation::internal_SetWrapMode);
  24. metaData.scriptClass->addInternalCall("Internal_SetSpeed", &ScriptAnimation::internal_SetSpeed);
  25. metaData.scriptClass->addInternalCall("Internal_Play", &ScriptAnimation::internal_Play);
  26. metaData.scriptClass->addInternalCall("Internal_BlendAdditive", &ScriptAnimation::internal_BlendAdditive);
  27. metaData.scriptClass->addInternalCall("Internal_BlendSequential", &ScriptAnimation::internal_BlendSequential);
  28. metaData.scriptClass->addInternalCall("Internal_Blend1D", &ScriptAnimation::internal_Blend1D);
  29. metaData.scriptClass->addInternalCall("Internal_Blend2D", &ScriptAnimation::internal_Blend2D);
  30. metaData.scriptClass->addInternalCall("Internal_CrossFade", &ScriptAnimation::internal_CrossFade);
  31. metaData.scriptClass->addInternalCall("Internal_Stop", &ScriptAnimation::internal_Stop);
  32. metaData.scriptClass->addInternalCall("Internal_StopAll", &ScriptAnimation::internal_StopAll);
  33. metaData.scriptClass->addInternalCall("Internal_IsPlaying", &ScriptAnimation::internal_IsPlaying);
  34. metaData.scriptClass->addInternalCall("Internal_GetState", &ScriptAnimation::internal_GetState);
  35. metaData.scriptClass->addInternalCall("Internal_SetState", &ScriptAnimation::internal_SetState);
  36. }
  37. void ScriptAnimation::internal_Create(MonoObject* instance)
  38. {
  39. new (bs_alloc<ScriptAnimation>()) ScriptAnimation(instance);
  40. }
  41. void ScriptAnimation::internal_Destroy(ScriptAnimation* thisPtr)
  42. {
  43. thisPtr->mAnimation = nullptr;
  44. }
  45. void ScriptAnimation::internal_SetWrapMode(ScriptAnimation* thisPtr, AnimWrapMode wrapMode)
  46. {
  47. thisPtr->getInternal()->setWrapMode(wrapMode);
  48. }
  49. void ScriptAnimation::internal_SetSpeed(ScriptAnimation* thisPtr, float speed)
  50. {
  51. thisPtr->getInternal()->setSpeed(speed);
  52. }
  53. void ScriptAnimation::internal_Play(ScriptAnimation* thisPtr, ScriptAnimationClip* clip)
  54. {
  55. HAnimationClip nativeClip;
  56. if (clip != nullptr)
  57. nativeClip = clip->getHandle();
  58. thisPtr->getInternal()->play(nativeClip);
  59. }
  60. void ScriptAnimation::internal_BlendAdditive(ScriptAnimation* thisPtr, ScriptAnimationClip* clip, float weight,
  61. float fadeLength, UINT32 layer)
  62. {
  63. HAnimationClip nativeClip;
  64. if (clip != nullptr)
  65. nativeClip = clip->getHandle();
  66. thisPtr->getInternal()->blendAdditive(nativeClip, weight, fadeLength, layer);
  67. }
  68. void ScriptAnimation::internal_BlendSequential(ScriptAnimation* thisPtr, MonoObject* info)
  69. {
  70. BlendSequentialInfo nativeInfo = ScriptBlendSequentialInfo::fromManaged(info);
  71. thisPtr->getInternal()->blendSequential(nativeInfo);
  72. }
  73. void ScriptAnimation::internal_Blend1D(ScriptAnimation* thisPtr, MonoObject* info, float t)
  74. {
  75. Blend1DInfo nativeInfo = ScriptBlend1DInfo::fromManaged(info);
  76. thisPtr->getInternal()->blend1D(nativeInfo, t);
  77. }
  78. void ScriptAnimation::internal_Blend2D(ScriptAnimation* thisPtr, MonoObject* info, Vector2* t)
  79. {
  80. Blend2DInfo nativeInfo = ScriptBlend2DInfo::fromManaged(info);
  81. thisPtr->getInternal()->blend2D(nativeInfo, *t);
  82. }
  83. void ScriptAnimation::internal_CrossFade(ScriptAnimation* thisPtr, ScriptAnimationClip* clip, float fadeLength)
  84. {
  85. HAnimationClip nativeClip;
  86. if (clip != nullptr)
  87. nativeClip = clip->getHandle();
  88. thisPtr->getInternal()->crossFade(nativeClip, fadeLength);
  89. }
  90. void ScriptAnimation::internal_Stop(ScriptAnimation* thisPtr, UINT32 layer)
  91. {
  92. thisPtr->getInternal()->stop(layer);
  93. }
  94. void ScriptAnimation::internal_StopAll(ScriptAnimation* thisPtr)
  95. {
  96. thisPtr->getInternal()->stopAll();
  97. }
  98. bool ScriptAnimation::internal_IsPlaying(ScriptAnimation* thisPtr)
  99. {
  100. return thisPtr->getInternal()->isPlaying();
  101. }
  102. bool ScriptAnimation::internal_GetState(ScriptAnimation* thisPtr, ScriptAnimationClip* clip, AnimationClipState* state)
  103. {
  104. HAnimationClip nativeClip;
  105. if (clip != nullptr)
  106. nativeClip = clip->getHandle();
  107. return thisPtr->getInternal()->getState(nativeClip, *state);
  108. }
  109. void ScriptAnimation::internal_SetState(ScriptAnimation* thisPtr, ScriptAnimationClip* clip, AnimationClipState* state)
  110. {
  111. HAnimationClip nativeClip;
  112. if (clip != nullptr)
  113. nativeClip = clip->getHandle();
  114. thisPtr->getInternal()->setState(nativeClip, *state);
  115. }
  116. MonoField* ScriptBlendSequentialInfo::clipsField = nullptr;
  117. ScriptBlendSequentialInfo::ScriptBlendSequentialInfo(MonoObject* instance)
  118. :ScriptObject(instance)
  119. { }
  120. void ScriptBlendSequentialInfo::initRuntimeData()
  121. {
  122. clipsField = metaData.scriptClass->getField("clips");
  123. }
  124. BlendSequentialInfo ScriptBlendSequentialInfo::fromManaged(MonoObject* instance)
  125. {
  126. MonoArray* managedClipsArray = (MonoArray*)clipsField->getValueBoxed(instance);
  127. if (managedClipsArray == nullptr)
  128. return BlendSequentialInfo(0);
  129. ScriptArray clipsArray(managedClipsArray);
  130. UINT32 numClips = clipsArray.size();
  131. BlendSequentialInfo output(numClips);
  132. for (UINT32 i = 0; i < numClips; i++)
  133. output.clips[i] = ScriptBlendSequentialClipInfo::fromManaged(clipsArray.get<MonoObject*>(i));
  134. return output;
  135. }
  136. MonoField* ScriptBlendSequentialClipInfo::clipField = nullptr;
  137. MonoField* ScriptBlendSequentialClipInfo::startTimeField = nullptr;
  138. MonoField* ScriptBlendSequentialClipInfo::endTimeField = nullptr;
  139. MonoField* ScriptBlendSequentialClipInfo::fadeTimeField = nullptr;
  140. ScriptBlendSequentialClipInfo::ScriptBlendSequentialClipInfo(MonoObject* instance)
  141. :ScriptObject(instance)
  142. { }
  143. void ScriptBlendSequentialClipInfo::initRuntimeData()
  144. {
  145. clipField = metaData.scriptClass->getField("clip");
  146. startTimeField = metaData.scriptClass->getField("startTime");
  147. endTimeField = metaData.scriptClass->getField("endTime");
  148. fadeTimeField = metaData.scriptClass->getField("fadeTime");
  149. }
  150. BlendSequentialClipInfo ScriptBlendSequentialClipInfo::fromManaged(MonoObject* instance)
  151. {
  152. BlendSequentialClipInfo output;
  153. MonoObject* managedAnimClip = clipField->getValueBoxed(instance);
  154. if(managedAnimClip)
  155. {
  156. ScriptAnimationClip* clip = ScriptAnimationClip::toNative(managedAnimClip);
  157. output.clip = clip->getHandle();
  158. }
  159. startTimeField->getValue(instance, &output.startTime);
  160. endTimeField->getValue(instance, &output.endTime);
  161. fadeTimeField->getValue(instance, &output.fadeTime);
  162. return output;
  163. }
  164. MonoField* ScriptBlend1DInfo::leftClipField = nullptr;
  165. MonoField* ScriptBlend1DInfo::rightClipField = nullptr;
  166. ScriptBlend1DInfo::ScriptBlend1DInfo(MonoObject* instance)
  167. :ScriptObject(instance)
  168. { }
  169. void ScriptBlend1DInfo::initRuntimeData()
  170. {
  171. leftClipField = metaData.scriptClass->getField("leftClip");
  172. rightClipField = metaData.scriptClass->getField("rightClip");
  173. }
  174. Blend1DInfo ScriptBlend1DInfo::fromManaged(MonoObject* instance)
  175. {
  176. Blend1DInfo output;
  177. MonoObject* managedLeftClip = leftClipField->getValueBoxed(instance);
  178. if (managedLeftClip != nullptr)
  179. {
  180. ScriptAnimationClip* clip = ScriptAnimationClip::toNative(managedLeftClip);
  181. output.leftClip = clip->getHandle();
  182. }
  183. MonoObject* managedRightClip = rightClipField->getValueBoxed(instance);
  184. if (managedRightClip != nullptr)
  185. {
  186. ScriptAnimationClip* clip = ScriptAnimationClip::toNative(managedRightClip);
  187. output.rightClip = clip->getHandle();
  188. }
  189. return output;
  190. }
  191. MonoField* ScriptBlend2DInfo::topLeftClipField = nullptr;
  192. MonoField* ScriptBlend2DInfo::topRightClipField = nullptr;
  193. MonoField* ScriptBlend2DInfo::botLeftClipField = nullptr;
  194. MonoField* ScriptBlend2DInfo::botRightClipField = nullptr;
  195. ScriptBlend2DInfo::ScriptBlend2DInfo(MonoObject* instance)
  196. :ScriptObject(instance)
  197. { }
  198. void ScriptBlend2DInfo::initRuntimeData()
  199. {
  200. topLeftClipField = metaData.scriptClass->getField("topLeftClip");
  201. topRightClipField = metaData.scriptClass->getField("topRightClip");
  202. botLeftClipField = metaData.scriptClass->getField("botLeftClip");
  203. botRightClipField = metaData.scriptClass->getField("botRightClip");
  204. }
  205. Blend2DInfo ScriptBlend2DInfo::fromManaged(MonoObject* instance)
  206. {
  207. Blend2DInfo output;
  208. MonoObject* managedTopLeftClip = topLeftClipField->getValueBoxed(instance);
  209. if (managedTopLeftClip != nullptr)
  210. {
  211. ScriptAnimationClip* clip = ScriptAnimationClip::toNative(managedTopLeftClip);
  212. output.topLeftClip = clip->getHandle();
  213. }
  214. MonoObject* managedTopRightClip = topRightClipField->getValueBoxed(instance);
  215. if (managedTopRightClip != nullptr)
  216. {
  217. ScriptAnimationClip* clip = ScriptAnimationClip::toNative(managedTopRightClip);
  218. output.topRightClip = clip->getHandle();
  219. }
  220. MonoObject* managedBotLeftClip = botLeftClipField->getValueBoxed(instance);
  221. if (managedBotLeftClip != nullptr)
  222. {
  223. ScriptAnimationClip* clip = ScriptAnimationClip::toNative(managedBotLeftClip);
  224. output.botLeftClip = clip->getHandle();
  225. }
  226. MonoObject* managedBotRightClip = botRightClipField->getValueBoxed(instance);
  227. if (managedBotRightClip != nullptr)
  228. {
  229. ScriptAnimationClip* clip = ScriptAnimationClip::toNative(managedBotRightClip);
  230. output.botRightClip = clip->getHandle();
  231. }
  232. return output;
  233. }
  234. }