BsScriptInput.cpp 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsScriptInput.h"
  4. #include "BsMonoManager.h"
  5. #include "BsMonoClass.h"
  6. #include "BsMonoMethod.h"
  7. #include "BsMonoUtil.h"
  8. #include "BsInput.h"
  9. #include "BsScriptVector2I.h"
  10. #include "BsPlayInEditorManager.h"
  11. #include "BsSceneManager.h"
  12. #include "BsCamera.h"
  13. #include "BsViewport.h"
  14. #include "BsRenderTarget.h"
  15. #include "BsRenderWindow.h"
  16. #include "BsRenderTexture.h"
  17. #include "BsGUIManager.h"
  18. namespace BansheeEngine
  19. {
  20. ScriptInput::OnButtonEventThunkDef ScriptInput::OnButtonPressedThunk;
  21. ScriptInput::OnButtonEventThunkDef ScriptInput::OnButtonReleasedThunk;
  22. ScriptInput::OnCharInputEventThunkDef ScriptInput::OnCharInputThunk;
  23. ScriptInput::OnPointerEventThunkDef ScriptInput::OnPointerPressedThunk;
  24. ScriptInput::OnPointerEventThunkDef ScriptInput::OnPointerReleasedThunk;
  25. ScriptInput::OnPointerEventThunkDef ScriptInput::OnPointerMovedThunk;
  26. ScriptInput::OnPointerEventThunkDef ScriptInput::OnPointerDoubleClickThunk;
  27. HEvent ScriptInput::OnButtonPressedConn;
  28. HEvent ScriptInput::OnButtonReleasedConn;
  29. HEvent ScriptInput::OnCharInputConn;
  30. HEvent ScriptInput::OnPointerPressedConn;
  31. HEvent ScriptInput::OnPointerReleasedConn;
  32. HEvent ScriptInput::OnPointerMovedConn;
  33. HEvent ScriptInput::OnPointerDoubleClickConn;
  34. ScriptInput::ScriptInput(MonoObject* instance)
  35. :ScriptObject(instance)
  36. { }
  37. void ScriptInput::initRuntimeData()
  38. {
  39. metaData.scriptClass->addInternalCall("Internal_IsButtonHeld", &ScriptInput::internal_isButtonHeld);
  40. metaData.scriptClass->addInternalCall("Internal_IsButtonDown", &ScriptInput::internal_isButtonDown);
  41. metaData.scriptClass->addInternalCall("Internal_IsButtonUp", &ScriptInput::internal_isButtonUp);
  42. metaData.scriptClass->addInternalCall("Internal_IsPointerButtonHeld", &ScriptInput::internal_isPointerButtonHeld);
  43. metaData.scriptClass->addInternalCall("Internal_IsPointerButtonDown", &ScriptInput::internal_isPointerButtonDown);
  44. metaData.scriptClass->addInternalCall("Internal_IsPointerButtonUp", &ScriptInput::internal_isPointerButtonUp);
  45. metaData.scriptClass->addInternalCall("Internal_IsPointerDoubleClicked", &ScriptInput::internal_isPointerDoubleClicked);
  46. metaData.scriptClass->addInternalCall("Internal_GetAxisValue", &ScriptInput::internal_getAxisValue);
  47. metaData.scriptClass->addInternalCall("Internal_GetPointerPosition", &ScriptInput::internal_getPointerPosition);
  48. metaData.scriptClass->addInternalCall("Internal_GetPointerScreenPosition", &ScriptInput::internal_getPointerScreenPosition);
  49. metaData.scriptClass->addInternalCall("Internal_GetPointerDelta", &ScriptInput::internal_getPointerDelta);
  50. OnButtonPressedThunk = (OnButtonEventThunkDef)metaData.scriptClass->getMethodExact("Internal_TriggerButtonDown", "ButtonCode,int")->getThunk();
  51. OnButtonReleasedThunk = (OnButtonEventThunkDef)metaData.scriptClass->getMethodExact("Internal_TriggerButtonUp", "ButtonCode,int")->getThunk();
  52. OnCharInputThunk = (OnCharInputEventThunkDef)metaData.scriptClass->getMethodExact("Internal_TriggerCharInput", "int")->getThunk();
  53. OnPointerPressedThunk = (OnPointerEventThunkDef)metaData.scriptClass->getMethodExact("Internal_TriggerPointerPressed", "Vector2I,Vector2I,PointerButton,bool,bool,bool,single")->getThunk();
  54. OnPointerReleasedThunk = (OnPointerEventThunkDef)metaData.scriptClass->getMethodExact("Internal_TriggerPointerReleased", "Vector2I,Vector2I,PointerButton,bool,bool,bool,single")->getThunk();
  55. OnPointerMovedThunk = (OnPointerEventThunkDef)metaData.scriptClass->getMethodExact("Internal_TriggerPointerMove", "Vector2I,Vector2I,PointerButton,bool,bool,bool,single")->getThunk();
  56. OnPointerDoubleClickThunk = (OnPointerEventThunkDef)metaData.scriptClass->getMethodExact("Internal_TriggerPointerDoubleClick", "Vector2I,Vector2I,PointerButton,bool,bool,bool,single")->getThunk();
  57. }
  58. void ScriptInput::startUp()
  59. {
  60. Input& input = Input::instance();
  61. OnButtonPressedConn = input.onButtonDown.connect(&ScriptInput::onButtonDown);
  62. OnButtonReleasedConn = input.onButtonUp.connect(&ScriptInput::onButtonUp);
  63. OnCharInputConn = input.onCharInput.connect(&ScriptInput::onCharInput);
  64. OnPointerPressedConn = input.onPointerPressed.connect(&ScriptInput::onPointerPressed);
  65. OnPointerReleasedConn = input.onPointerReleased.connect(&ScriptInput::onPointerReleased);
  66. OnPointerMovedConn = input.onPointerMoved.connect(&ScriptInput::onPointerMoved);
  67. OnPointerDoubleClickConn = input.onPointerDoubleClick.connect(&ScriptInput::onPointerDoubleClick);
  68. }
  69. void ScriptInput::shutDown()
  70. {
  71. OnButtonPressedConn.disconnect();
  72. OnButtonReleasedConn.disconnect();
  73. OnCharInputConn.disconnect();
  74. OnPointerPressedConn.disconnect();
  75. OnPointerReleasedConn.disconnect();
  76. OnPointerMovedConn.disconnect();
  77. OnPointerDoubleClickConn.disconnect();
  78. }
  79. void ScriptInput::onButtonDown(const ButtonEvent& ev)
  80. {
  81. if (PlayInEditorManager::instance().getState() != PlayInEditorState::Playing)
  82. return;
  83. MonoUtil::invokeThunk(OnButtonPressedThunk, ev.buttonCode, ev.deviceIdx);
  84. }
  85. void ScriptInput::onButtonUp(const ButtonEvent& ev)
  86. {
  87. if (PlayInEditorManager::instance().getState() != PlayInEditorState::Playing)
  88. return;
  89. MonoUtil::invokeThunk(OnButtonReleasedThunk, ev.buttonCode, ev.deviceIdx);
  90. }
  91. void ScriptInput::onCharInput(const TextInputEvent& ev)
  92. {
  93. if (PlayInEditorManager::instance().getState() != PlayInEditorState::Playing)
  94. return;
  95. MonoUtil::invokeThunk(OnCharInputThunk, ev.textChar);
  96. }
  97. void ScriptInput::onPointerMoved(const PointerEvent& ev)
  98. {
  99. if (PlayInEditorManager::instance().getState() != PlayInEditorState::Playing)
  100. return;
  101. MonoObject* screenPos = ScriptVector2I::box(ev.screenPos);
  102. MonoObject* delta = ScriptVector2I::box(ev.delta);
  103. MonoUtil::invokeThunk(OnPointerMovedThunk, screenPos, delta,
  104. ev.button, ev.shift, ev.control, ev.alt, ev.mouseWheelScrollAmount);
  105. }
  106. void ScriptInput::onPointerPressed(const PointerEvent& ev)
  107. {
  108. if (PlayInEditorManager::instance().getState() != PlayInEditorState::Playing)
  109. return;
  110. MonoObject* screenPos = ScriptVector2I::box(ev.screenPos);
  111. MonoObject* delta = ScriptVector2I::box(ev.delta);
  112. MonoUtil::invokeThunk(OnPointerPressedThunk, screenPos, delta,
  113. ev.button, ev.shift, ev.control, ev.alt, ev.mouseWheelScrollAmount);
  114. }
  115. void ScriptInput::onPointerReleased(const PointerEvent& ev)
  116. {
  117. if (PlayInEditorManager::instance().getState() != PlayInEditorState::Playing)
  118. return;
  119. MonoObject* screenPos = ScriptVector2I::box(ev.screenPos);
  120. MonoObject* delta = ScriptVector2I::box(ev.delta);
  121. MonoUtil::invokeThunk(OnPointerReleasedThunk, screenPos, delta,
  122. ev.button, ev.shift, ev.control, ev.alt, ev.mouseWheelScrollAmount);
  123. }
  124. void ScriptInput::onPointerDoubleClick(const PointerEvent& ev)
  125. {
  126. if (PlayInEditorManager::instance().getState() != PlayInEditorState::Playing)
  127. return;
  128. MonoObject* screenPos = ScriptVector2I::box(ev.screenPos);
  129. MonoObject* delta = ScriptVector2I::box(ev.delta);
  130. MonoUtil::invokeThunk(OnPointerDoubleClickThunk, screenPos, delta,
  131. ev.button, ev.shift, ev.control, ev.alt, ev.mouseWheelScrollAmount);
  132. }
  133. bool ScriptInput::internal_isButtonHeld(ButtonCode code, UINT32 deviceIdx)
  134. {
  135. return Input::instance().isButtonHeld(code, deviceIdx);
  136. }
  137. bool ScriptInput::internal_isButtonDown(ButtonCode code, UINT32 deviceIdx)
  138. {
  139. return Input::instance().isButtonDown(code, deviceIdx);
  140. }
  141. bool ScriptInput::internal_isButtonUp(ButtonCode code, UINT32 deviceIdx)
  142. {
  143. return Input::instance().isButtonUp(code, deviceIdx);
  144. }
  145. bool ScriptInput::internal_isPointerButtonHeld(PointerEventButton code)
  146. {
  147. return Input::instance().isPointerButtonHeld(code);
  148. }
  149. bool ScriptInput::internal_isPointerButtonDown(PointerEventButton code)
  150. {
  151. return Input::instance().isPointerButtonDown(code);
  152. }
  153. bool ScriptInput::internal_isPointerButtonUp(PointerEventButton code)
  154. {
  155. return Input::instance().isPointerButtonUp(code);
  156. }
  157. bool ScriptInput::internal_isPointerDoubleClicked()
  158. {
  159. return Input::instance().isPointerDoubleClicked();
  160. }
  161. float ScriptInput::internal_getAxisValue(UINT32 axisType, UINT32 deviceIdx)
  162. {
  163. return Input::instance().getAxisValue(axisType, deviceIdx);
  164. }
  165. void ScriptInput::internal_getPointerPosition(Vector2I* position)
  166. {
  167. *position = Input::instance().getPointerPosition();
  168. SceneCameraData mainCamera = gSceneManager().getMainCamera();
  169. if (mainCamera.camera == nullptr)
  170. return;
  171. // The main camera could be rendering to a standalone window, or be a part of the editor GUI. Find out which
  172. // and transform the pointer position appropriately.
  173. RenderTargetPtr target = mainCamera.camera->getViewport()->getTarget();
  174. if (target == nullptr)
  175. return;
  176. if(target->getProperties().isWindow())
  177. {
  178. RenderWindowPtr window = std::static_pointer_cast<RenderWindow>(target);
  179. *position = window->screenToWindowPos(*position);
  180. }
  181. else
  182. {
  183. RenderTexturePtr texture = std::static_pointer_cast<RenderTexture>(target);
  184. RenderWindowPtr window = GUIManager::instance().getBridgeWindow(texture);
  185. if (window == nullptr)
  186. return;
  187. *position = window->screenToWindowPos(*position);
  188. *position = GUIManager::instance().windowToBridgedCoords(target, *position);
  189. }
  190. }
  191. void ScriptInput::internal_getPointerScreenPosition(Vector2I* position)
  192. {
  193. *position = Input::instance().getPointerPosition();
  194. }
  195. void ScriptInput::internal_getPointerDelta(Vector2I* position)
  196. {
  197. *position = Input::instance().getPointerDelta();
  198. }
  199. }