mirror of
https://github.com/jpd002/Play-.git
synced 2025-04-28 21:57:57 +03:00
Add basic input support.
This commit is contained in:
parent
4b3a64e193
commit
1216f3a1a4
5 changed files with 128 additions and 2 deletions
|
@ -25,9 +25,11 @@ endif()
|
||||||
list(APPEND PROJECT_LIBS gsh_opengl)
|
list(APPEND PROJECT_LIBS gsh_opengl)
|
||||||
|
|
||||||
add_executable(Play
|
add_executable(Play
|
||||||
Main.cpp
|
|
||||||
GSH_OpenGLJs.cpp
|
GSH_OpenGLJs.cpp
|
||||||
GSH_OpenGLJs.h
|
GSH_OpenGLJs.h
|
||||||
|
InputProviderEmscripten.cpp
|
||||||
|
InputProviderEmscripten.h
|
||||||
|
Main.cpp
|
||||||
Ps2VmJs.cpp
|
Ps2VmJs.cpp
|
||||||
Ps2VmJs.h
|
Ps2VmJs.h
|
||||||
)
|
)
|
||||||
|
|
59
Source/ui_js/InputProviderEmscripten.cpp
Normal file
59
Source/ui_js/InputProviderEmscripten.cpp
Normal 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);
|
||||||
|
}
|
16
Source/ui_js/InputProviderEmscripten.h
Normal file
16
Source/ui_js/InputProviderEmscripten.h
Normal 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*);
|
||||||
|
};
|
|
@ -4,15 +4,36 @@
|
||||||
#include "GSH_OpenGLJs.h"
|
#include "GSH_OpenGLJs.h"
|
||||||
#include "PS2VM_Preferences.h"
|
#include "PS2VM_Preferences.h"
|
||||||
#include "AppConfig.h"
|
#include "AppConfig.h"
|
||||||
|
#include "input/PH_GenericInput.h"
|
||||||
|
#include "InputProviderEmscripten.h"
|
||||||
|
|
||||||
CPs2VmJs* g_virtualMachine = nullptr;
|
CPs2VmJs* g_virtualMachine = nullptr;
|
||||||
EMSCRIPTEN_WEBGL_CONTEXT_HANDLE g_context = 0;
|
EMSCRIPTEN_WEBGL_CONTEXT_HANDLE g_context = 0;
|
||||||
|
std::shared_ptr<CInputProviderEmscripten> g_inputProvider;
|
||||||
|
|
||||||
int main(int argc, const char** argv)
|
int main(int argc, const char** argv)
|
||||||
{
|
{
|
||||||
return 0;
|
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()
|
extern "C" void initVm()
|
||||||
{
|
{
|
||||||
EmscriptenWebGLContextAttributes attr;
|
EmscriptenWebGLContextAttributes attr;
|
||||||
|
@ -27,6 +48,34 @@ extern "C" void initVm()
|
||||||
g_virtualMachine->Initialize();
|
g_virtualMachine->Initialize();
|
||||||
g_virtualMachine->CreateGSHandler(CGSH_OpenGLJs::GetFactoryFunction(g_context));
|
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();
|
//g_virtualMachine->Reset();
|
||||||
printf("Reset VM\r\n");
|
printf("Reset VM\r\n");
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
<body>
|
<body>
|
||||||
<noscript>You need to enable JavaScript to run this app.</noscript>
|
<noscript>You need to enable JavaScript to run this app.</noscript>
|
||||||
<div>
|
<div>
|
||||||
<canvas id="outputCanvas" width="640" height="480"/>
|
<canvas id="outputCanvas" width="640" height="480" tabindex="-1"/>
|
||||||
</div>
|
</div>
|
||||||
<div id="root"></div>
|
<div id="root"></div>
|
||||||
<!--
|
<!--
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue