BsScriptVirtualInput.cpp 4.2 KB

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