BsScriptVirtualInput.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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. MonoObject* virtualButton = ScriptVirtualButton::box(btn);
  49. MonoUtil::invokeThunk(OnButtonDownThunk, virtualButton, deviceIdx);
  50. }
  51. void ScriptVirtualInput::onButtonUp(const VirtualButton& btn, UINT32 deviceIdx)
  52. {
  53. MonoObject* virtualButton = ScriptVirtualButton::box(btn);
  54. MonoUtil::invokeThunk(OnButtonUpThunk, virtualButton, deviceIdx);
  55. }
  56. void ScriptVirtualInput::onButtonHeld(const VirtualButton& btn, UINT32 deviceIdx)
  57. {
  58. MonoObject* virtualButton = ScriptVirtualButton::box(btn);
  59. MonoUtil::invokeThunk(OnButtonHeldThunk, virtualButton, deviceIdx);
  60. }
  61. MonoObject* ScriptVirtualInput::internal_getKeyConfig()
  62. {
  63. InputConfigurationPtr inputConfig = VirtualInput::instance().getConfiguration();
  64. ScriptInputConfiguration* scriptInputConfig = ScriptInputConfiguration::getScriptInputConfig(inputConfig);
  65. if (scriptInputConfig == nullptr)
  66. scriptInputConfig = ScriptInputConfiguration::createScriptInputConfig(inputConfig);
  67. return scriptInputConfig->getManagedInstance();
  68. }
  69. void ScriptVirtualInput::internal_setKeyConfig(MonoObject* keyConfig)
  70. {
  71. ScriptInputConfiguration* inputConfig = ScriptInputConfiguration::toNative(keyConfig);
  72. VirtualInput::instance().setConfiguration(inputConfig->getInternalValue());
  73. }
  74. bool ScriptVirtualInput::internal_isButtonHeld(VirtualButton btn, UINT32 deviceIdx)
  75. {
  76. return VirtualInput::instance().isButtonHeld(btn, deviceIdx);
  77. }
  78. bool ScriptVirtualInput::internal_isButtonDown(VirtualButton btn, UINT32 deviceIdx)
  79. {
  80. return VirtualInput::instance().isButtonDown(btn, deviceIdx);
  81. }
  82. bool ScriptVirtualInput::internal_isButtonUp(VirtualButton btn, UINT32 deviceIdx)
  83. {
  84. return VirtualInput::instance().isButtonUp(btn, deviceIdx);
  85. }
  86. float ScriptVirtualInput::internal_getAxisValue(VirtualAxis axis, UINT32 deviceIdx)
  87. {
  88. return VirtualInput::instance().getAxisValue(axis, deviceIdx);
  89. }
  90. }