mirror of
https://github.com/jpd002/Play-.git
synced 2025-04-28 21:57:57 +03:00
161 lines
6.6 KiB
C++
161 lines
6.6 KiB
C++
#include <cstdio>
|
|
#include <emscripten/bind.h>
|
|
#include "Ps2VmJs.h"
|
|
#include "GSH_OpenGLJs.h"
|
|
#include "../../tools/PsfPlayer/Source/SH_OpenAL.h"
|
|
#include "../../tools/PsfPlayer/Source/ui_js/SH_OpenALProxy.h"
|
|
#include "input/PH_GenericInput.h"
|
|
#include "InputProviderEmscripten.h"
|
|
#include "ui_shared/StatsManager.h"
|
|
|
|
CPs2VmJs* g_virtualMachine = nullptr;
|
|
CGSHandler::NewFrameEvent::Connection g_gsNewFrameConnection;
|
|
EMSCRIPTEN_WEBGL_CONTEXT_HANDLE g_context = 0;
|
|
std::shared_ptr<CInputProviderEmscripten> g_inputProvider;
|
|
CSH_OpenAL* g_soundHandler = nullptr;
|
|
|
|
int main(int argc, const char** argv)
|
|
{
|
|
printf("Play! - Version %s\r\n", PLAY_VERSION);
|
|
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;
|
|
emscripten_webgl_init_context_attributes(&attr);
|
|
attr.majorVersion = 2;
|
|
attr.minorVersion = 0;
|
|
attr.alpha = false;
|
|
g_context = emscripten_webgl_create_context("#outputCanvas", &attr);
|
|
assert(g_context >= 0);
|
|
|
|
g_virtualMachine = new CPs2VmJs();
|
|
g_virtualMachine->Initialize();
|
|
g_virtualMachine->CreateGSHandler(CGSH_OpenGLJs::GetFactoryFunction(g_context));
|
|
|
|
{
|
|
//Size here needs to match the size of the canvas in HTML file.
|
|
|
|
CGSHandler::PRESENTATION_PARAMS presentationParams;
|
|
presentationParams.mode = CGSHandler::PRESENTATION_MODE_FIT;
|
|
presentationParams.windowWidth = 640;
|
|
presentationParams.windowHeight = 480;
|
|
|
|
g_virtualMachine->m_ee->m_gs->SetPresentationParams(presentationParams);
|
|
}
|
|
|
|
{
|
|
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"));
|
|
bindingManager.SetSimpleBinding(0, PS2::CControllerInfo::L1, CInputProviderEmscripten::MakeBindingTarget("Key1"));
|
|
bindingManager.SetSimpleBinding(0, PS2::CControllerInfo::L2, CInputProviderEmscripten::MakeBindingTarget("Key2"));
|
|
bindingManager.SetSimpleBinding(0, PS2::CControllerInfo::L3, CInputProviderEmscripten::MakeBindingTarget("Key3"));
|
|
bindingManager.SetSimpleBinding(0, PS2::CControllerInfo::R1, CInputProviderEmscripten::MakeBindingTarget("Key8"));
|
|
bindingManager.SetSimpleBinding(0, PS2::CControllerInfo::R2, CInputProviderEmscripten::MakeBindingTarget("Key9"));
|
|
bindingManager.SetSimpleBinding(0, PS2::CControllerInfo::R3, CInputProviderEmscripten::MakeBindingTarget("Key0"));
|
|
|
|
bindingManager.SetSimulatedAxisBinding(0, PS2::CControllerInfo::ANALOG_LEFT_X,
|
|
CInputProviderEmscripten::MakeBindingTarget("KeyF"),
|
|
CInputProviderEmscripten::MakeBindingTarget("KeyH"));
|
|
bindingManager.SetSimulatedAxisBinding(0, PS2::CControllerInfo::ANALOG_LEFT_Y,
|
|
CInputProviderEmscripten::MakeBindingTarget("KeyT"),
|
|
CInputProviderEmscripten::MakeBindingTarget("KeyG"));
|
|
|
|
bindingManager.SetSimulatedAxisBinding(0, PS2::CControllerInfo::ANALOG_RIGHT_X,
|
|
CInputProviderEmscripten::MakeBindingTarget("KeyJ"),
|
|
CInputProviderEmscripten::MakeBindingTarget("KeyL"));
|
|
bindingManager.SetSimulatedAxisBinding(0, PS2::CControllerInfo::ANALOG_RIGHT_Y,
|
|
CInputProviderEmscripten::MakeBindingTarget("KeyI"),
|
|
CInputProviderEmscripten::MakeBindingTarget("KeyK"));
|
|
}
|
|
|
|
{
|
|
g_soundHandler = new CSH_OpenAL();
|
|
g_virtualMachine->CreateSoundHandler(CSH_OpenALProxy::GetFactoryFunction(g_soundHandler));
|
|
}
|
|
|
|
g_gsNewFrameConnection = g_virtualMachine->GetGSHandler()->OnNewFrame.Connect(std::bind(&CStatsManager::OnGsNewFrame, &CStatsManager::GetInstance(), std::placeholders::_1));
|
|
|
|
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);
|
|
}
|
|
|
|
void bootElf(std::string path)
|
|
{
|
|
g_virtualMachine->BootElf(path);
|
|
}
|
|
|
|
void bootDiscImage(std::string path)
|
|
{
|
|
g_virtualMachine->BootDiscImage(path);
|
|
}
|
|
|
|
int getFrames()
|
|
{
|
|
return CStatsManager::GetInstance().GetFrames();
|
|
}
|
|
|
|
void clearStats()
|
|
{
|
|
CStatsManager::GetInstance().ClearStats();
|
|
}
|
|
|
|
void setFullscreen()
|
|
{
|
|
EmscriptenFullscreenStrategy strategy = {};
|
|
strategy.scaleMode = EMSCRIPTEN_FULLSCREEN_CANVAS_SCALE_NONE;
|
|
strategy.filteringMode = EMSCRIPTEN_FULLSCREEN_FILTERING_DEFAULT;
|
|
//strategy.canvasResizedCallback = emscripten_window_resized_callback;
|
|
//strategy.canvasResizedCallbackUserData = this;
|
|
emscripten_request_fullscreen_strategy("canvas", true, &strategy);
|
|
}
|
|
|
|
EMSCRIPTEN_BINDINGS(Play)
|
|
{
|
|
using namespace emscripten;
|
|
|
|
function("bootElf", &bootElf);
|
|
function("bootDiscImage", &bootDiscImage);
|
|
function("getFrames", &getFrames);
|
|
function("clearStats", &clearStats);
|
|
function("setFullscreen", &setFullscreen);
|
|
}
|