diff --git a/Source/ui_js/CMakeLists.txt b/Source/ui_js/CMakeLists.txt index 114c22338..15f5d93b7 100644 --- a/Source/ui_js/CMakeLists.txt +++ b/Source/ui_js/CMakeLists.txt @@ -25,9 +25,11 @@ endif() list(APPEND PROJECT_LIBS gsh_opengl) add_executable(Play - Main.cpp GSH_OpenGLJs.cpp GSH_OpenGLJs.h + InputProviderEmscripten.cpp + InputProviderEmscripten.h + Main.cpp Ps2VmJs.cpp Ps2VmJs.h ) diff --git a/Source/ui_js/InputProviderEmscripten.cpp b/Source/ui_js/InputProviderEmscripten.cpp new file mode 100644 index 000000000..5d12394b8 --- /dev/null +++ b/Source/ui_js/InputProviderEmscripten.cpp @@ -0,0 +1,59 @@ +#include "InputProviderEmscripten.h" +#include "string_format.h" + +#define PROVIDER_ID 'EmSc' + +enum +{ + INPUT_ARROW_UP = 0xFF80, + INPUT_ARROW_DOWN, + INPUT_ARROW_LEFT, + INPUT_ARROW_RIGHT, + INPUT_ENTER, + INPUT_BACKSPACE, + INPUT_SHIFT_RIGHT, + INPUT_KEY_A, + INPUT_KEY_S, + INPUT_KEY_Z, + INPUT_KEY_X, +}; + +uint32 CInputProviderEmscripten::GetId() const +{ + return PROVIDER_ID; +} + +std::string CInputProviderEmscripten::GetTargetDescription(const BINDINGTARGET& target) const +{ + return std::string(); +} + +BINDINGTARGET CInputProviderEmscripten::MakeBindingTarget(const EM_UTF8* code) +{ + uint32 keyCode = 0; + if(!strcmp(code, "ArrowUp")) keyCode = INPUT_ARROW_UP; + else if(!strcmp(code, "ArrowDown")) keyCode = INPUT_ARROW_DOWN; + else if(!strcmp(code, "ArrowLeft")) keyCode = INPUT_ARROW_LEFT; + else if(!strcmp(code, "ArrowRight")) keyCode = INPUT_ARROW_RIGHT; + else if(!strcmp(code, "Enter")) keyCode = INPUT_ENTER; + else if(!strcmp(code, "ShiftRight")) keyCode = INPUT_SHIFT_RIGHT; + else if(!strcmp(code, "Backspace")) keyCode = INPUT_BACKSPACE; + else if(!strcmp(code, "KeyA")) keyCode = INPUT_KEY_A; + else if(!strcmp(code, "KeyS")) keyCode = INPUT_KEY_S; + else if(!strcmp(code, "KeyZ")) keyCode = INPUT_KEY_Z; + else if(!strcmp(code, "KeyX")) keyCode = INPUT_KEY_X; + else keyCode = code[0]; + return BINDINGTARGET(PROVIDER_ID, DeviceIdType{{0}}, keyCode, BINDINGTARGET::KEYTYPE::BUTTON); +} + +void CInputProviderEmscripten::OnKeyDown(const EM_UTF8* code) +{ + if(!OnInput) return; + OnInput(MakeBindingTarget(code), 1); +} + +void CInputProviderEmscripten::OnKeyUp(const EM_UTF8* code) +{ + if(!OnInput) return; + OnInput(MakeBindingTarget(code), 0); +} diff --git a/Source/ui_js/InputProviderEmscripten.h b/Source/ui_js/InputProviderEmscripten.h new file mode 100644 index 000000000..dbd059262 --- /dev/null +++ b/Source/ui_js/InputProviderEmscripten.h @@ -0,0 +1,16 @@ +#pragma once + +#include "input/InputProvider.h" +#include + +class CInputProviderEmscripten : public CInputProvider +{ +public: + uint32 GetId() const override; + std::string GetTargetDescription(const BINDINGTARGET&) const override; + + static BINDINGTARGET MakeBindingTarget(const EM_UTF8* code); + + void OnKeyDown(const EM_UTF8*); + void OnKeyUp(const EM_UTF8*); +}; diff --git a/Source/ui_js/Main.cpp b/Source/ui_js/Main.cpp index 0d84841f2..72665f7b7 100644 --- a/Source/ui_js/Main.cpp +++ b/Source/ui_js/Main.cpp @@ -4,15 +4,36 @@ #include "GSH_OpenGLJs.h" #include "PS2VM_Preferences.h" #include "AppConfig.h" +#include "input/PH_GenericInput.h" +#include "InputProviderEmscripten.h" CPs2VmJs* g_virtualMachine = nullptr; EMSCRIPTEN_WEBGL_CONTEXT_HANDLE g_context = 0; +std::shared_ptr g_inputProvider; int main(int argc, const char** argv) { return 0; } +EM_BOOL keyboardCallback(int eventType, const EmscriptenKeyboardEvent* keyEvent, void* userData) +{ + if(keyEvent->repeat) + { + return true; + } + switch(eventType) + { + case EMSCRIPTEN_EVENT_KEYDOWN: + g_inputProvider->OnKeyDown(keyEvent->code); + break; + case EMSCRIPTEN_EVENT_KEYUP: + g_inputProvider->OnKeyUp(keyEvent->code); + break; + } + return true; +} + extern "C" void initVm() { EmscriptenWebGLContextAttributes attr; @@ -27,6 +48,34 @@ extern "C" void initVm() g_virtualMachine->Initialize(); g_virtualMachine->CreateGSHandler(CGSH_OpenGLJs::GetFactoryFunction(g_context)); + { + g_virtualMachine->CreatePadHandler(CPH_GenericInput::GetFactoryFunction()); + auto padHandler = static_cast(g_virtualMachine->GetPadHandler()); + auto& bindingManager = padHandler->GetBindingManager(); + + g_inputProvider = std::make_shared(); + bindingManager.RegisterInputProvider(g_inputProvider); + + bindingManager.SetSimpleBinding(0, PS2::CControllerInfo::START, CInputProviderEmscripten::MakeBindingTarget("Enter")); + bindingManager.SetSimpleBinding(0, PS2::CControllerInfo::SELECT, CInputProviderEmscripten::MakeBindingTarget("Backspace")); + bindingManager.SetSimpleBinding(0, PS2::CControllerInfo::DPAD_LEFT, CInputProviderEmscripten::MakeBindingTarget("ArrowLeft")); + bindingManager.SetSimpleBinding(0, PS2::CControllerInfo::DPAD_RIGHT, CInputProviderEmscripten::MakeBindingTarget("ArrowRight")); + bindingManager.SetSimpleBinding(0, PS2::CControllerInfo::DPAD_UP, CInputProviderEmscripten::MakeBindingTarget("ArrowUp")); + bindingManager.SetSimpleBinding(0, PS2::CControllerInfo::DPAD_DOWN, CInputProviderEmscripten::MakeBindingTarget("ArrowDown")); + bindingManager.SetSimpleBinding(0, PS2::CControllerInfo::SQUARE, CInputProviderEmscripten::MakeBindingTarget("KeyA")); + bindingManager.SetSimpleBinding(0, PS2::CControllerInfo::CROSS, CInputProviderEmscripten::MakeBindingTarget("KeyZ")); + bindingManager.SetSimpleBinding(0, PS2::CControllerInfo::TRIANGLE, CInputProviderEmscripten::MakeBindingTarget("KeyS")); + bindingManager.SetSimpleBinding(0, PS2::CControllerInfo::CIRCLE, CInputProviderEmscripten::MakeBindingTarget("KeyX")); + } + + EMSCRIPTEN_RESULT result = EMSCRIPTEN_RESULT_SUCCESS; + + result = emscripten_set_keydown_callback("#outputCanvas", nullptr, false, &keyboardCallback); + assert(result == EMSCRIPTEN_RESULT_SUCCESS); + + result = emscripten_set_keyup_callback("#outputCanvas", nullptr, false, &keyboardCallback); + assert(result == EMSCRIPTEN_RESULT_SUCCESS); + //g_virtualMachine->Reset(); printf("Reset VM\r\n"); } diff --git a/js/play_browser/public/index.html b/js/play_browser/public/index.html index 09908b743..34b0feb53 100644 --- a/js/play_browser/public/index.html +++ b/js/play_browser/public/index.html @@ -29,7 +29,7 @@
- +