Add basic input support.

This commit is contained in:
Jean-Philip Desjardins 2021-12-28 21:41:24 -05:00
parent 4b3a64e193
commit 1216f3a1a4
5 changed files with 128 additions and 2 deletions

View file

@ -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
)

View file

@ -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);
}

View file

@ -0,0 +1,16 @@
#pragma once
#include "input/InputProvider.h"
#include <emscripten/html5.h>
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*);
};

View file

@ -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<CInputProviderEmscripten> 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<CPH_GenericInput*>(g_virtualMachine->GetPadHandler());
auto& bindingManager = padHandler->GetBindingManager();
g_inputProvider = std::make_shared<CInputProviderEmscripten>();
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");
}

View file

@ -29,7 +29,7 @@
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div>
<canvas id="outputCanvas" width="640" height="480"/>
<canvas id="outputCanvas" width="640" height="480" tabindex="-1"/>
</div>
<div id="root"></div>
<!--