BsScriptVirtualInput.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Wrappers/BsScriptVirtualInput.h"
  4. #include "BsMonoManager.h"
  5. #include "BsMonoClass.h"
  6. #include "BsMonoMethod.h"
  7. #include "BsMonoUtil.h"
  8. #include "Input/BsVirtualInput.h"
  9. #include "Wrappers/BsScriptVirtualButton.h"
  10. #include "Wrappers/BsScriptInputConfiguration.h"
  11. #include "BsPlayInEditorManager.h"
  12. namespace bs
  13. {
  14. ScriptVirtualInput::OnButtonEventThunkDef ScriptVirtualInput::OnButtonUpThunk;
  15. ScriptVirtualInput::OnButtonEventThunkDef ScriptVirtualInput::OnButtonDownThunk;
  16. ScriptVirtualInput::OnButtonEventThunkDef ScriptVirtualInput::OnButtonHeldThunk;
  17. HEvent ScriptVirtualInput::OnButtonPressedConn;
  18. HEvent ScriptVirtualInput::OnButtonReleasedConn;
  19. HEvent ScriptVirtualInput::OnButtonHeldConn;
  20. ScriptVirtualInput::ScriptVirtualInput(MonoObject* instance)
  21. :ScriptObject(instance)
  22. { }
  23. void ScriptVirtualInput::initRuntimeData()
  24. {
  25. metaData.scriptClass->addInternalCall("Internal_GetKeyConfig", (void*)&ScriptVirtualInput::internal_getKeyConfig);
  26. metaData.scriptClass->addInternalCall("Internal_SetKeyConfig", (void*)&ScriptVirtualInput::internal_setKeyConfig);
  27. metaData.scriptClass->addInternalCall("Internal_IsButtonHeld", (void*)&ScriptVirtualInput::internal_isButtonHeld);
  28. metaData.scriptClass->addInternalCall("Internal_IsButtonDown", (void*)&ScriptVirtualInput::internal_isButtonDown);
  29. metaData.scriptClass->addInternalCall("Internal_IsButtonUp", (void*)&ScriptVirtualInput::internal_isButtonUp);
  30. metaData.scriptClass->addInternalCall("Internal_GetAxisValue", (void*)&ScriptVirtualInput::internal_getAxisValue);
  31. OnButtonUpThunk = (OnButtonEventThunkDef)metaData.scriptClass->getMethodExact("Internal_TriggerButtonDown", "VirtualButton,int")->getThunk();
  32. OnButtonDownThunk = (OnButtonEventThunkDef)metaData.scriptClass->getMethodExact("Internal_TriggerButtonUp", "VirtualButton,int")->getThunk();
  33. OnButtonHeldThunk = (OnButtonEventThunkDef)metaData.scriptClass->getMethodExact("Internal_TriggerButtonHeld", "VirtualButton,int")->getThunk();
  34. }
  35. void ScriptVirtualInput::startUp()
  36. {
  37. VirtualInput& input = VirtualInput::instance();
  38. OnButtonPressedConn = input.onButtonDown.connect(&ScriptVirtualInput::onButtonDown);
  39. OnButtonReleasedConn = input.onButtonUp.connect(&ScriptVirtualInput::onButtonUp);
  40. OnButtonHeldConn = input.onButtonHeld.connect(&ScriptVirtualInput::onButtonHeld);
  41. }
  42. void ScriptVirtualInput::shutDown()
  43. {
  44. OnButtonPressedConn.disconnect();
  45. OnButtonReleasedConn.disconnect();
  46. OnButtonHeldConn.disconnect();
  47. }
  48. void ScriptVirtualInput::onButtonDown(const VirtualButton& btn, UINT32 deviceIdx)
  49. {
  50. if (PlayInEditorManager::instance().getState() != PlayInEditorState::Playing)
  51. return;
  52. MonoObject* virtualButton = ScriptVirtualButton::box(btn);
  53. MonoUtil::invokeThunk(OnButtonDownThunk, virtualButton, deviceIdx);
  54. }
  55. void ScriptVirtualInput::onButtonUp(const VirtualButton& btn, UINT32 deviceIdx)
  56. {
  57. if (PlayInEditorManager::instance().getState() != PlayInEditorState::Playing)
  58. return;
  59. MonoObject* virtualButton = ScriptVirtualButton::box(btn);
  60. MonoUtil::invokeThunk(OnButtonUpThunk, virtualButton, deviceIdx);
  61. }
  62. void ScriptVirtualInput::onButtonHeld(const VirtualButton& btn, UINT32 deviceIdx)
  63. {
  64. if (PlayInEditorManager::instance().getState() != PlayInEditorState::Playing)
  65. return;
  66. MonoObject* virtualButton = ScriptVirtualButton::box(btn);
  67. MonoUtil::invokeThunk(OnButtonHeldThunk, virtualButton, deviceIdx);
  68. }
  69. MonoObject* ScriptVirtualInput::internal_getKeyConfig()
  70. {
  71. SPtr<InputConfiguration> inputConfig = VirtualInput::instance().getConfiguration();
  72. ScriptInputConfiguration* scriptInputConfig = ScriptInputConfiguration::getScriptInputConfig(inputConfig);
  73. if (scriptInputConfig == nullptr)
  74. scriptInputConfig = ScriptInputConfiguration::createScriptInputConfig(inputConfig);
  75. return scriptInputConfig->getManagedInstance();
  76. }
  77. void ScriptVirtualInput::internal_setKeyConfig(MonoObject* keyConfig)
  78. {
  79. ScriptInputConfiguration* inputConfig = ScriptInputConfiguration::toNative(keyConfig);
  80. VirtualInput::instance().setConfiguration(inputConfig->getInternalValue());
  81. }
  82. bool ScriptVirtualInput::internal_isButtonHeld(VirtualButton* btn, UINT32 deviceIdx)
  83. {
  84. return VirtualInput::instance().isButtonHeld(*btn, deviceIdx);
  85. }
  86. bool ScriptVirtualInput::internal_isButtonDown(VirtualButton* btn, UINT32 deviceIdx)
  87. {
  88. return VirtualInput::instance().isButtonDown(*btn, deviceIdx);
  89. }
  90. bool ScriptVirtualInput::internal_isButtonUp(VirtualButton* btn, UINT32 deviceIdx)
  91. {
  92. return VirtualInput::instance().isButtonUp(*btn, deviceIdx);
  93. }
  94. float ScriptVirtualInput::internal_getAxisValue(VirtualAxis* axis, UINT32 deviceIdx)
  95. {
  96. return VirtualInput::instance().getAxisValue(*axis, deviceIdx);
  97. }
  98. }