BsScriptVirtualInput.cpp 4.5 KB

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