From 21f9e9fbc20014bf53a32f37d3b7c7c414ac753d Mon Sep 17 00:00:00 2001 From: Flyinghead Date: Tue, 3 Dec 2024 21:04:51 +0100 Subject: [PATCH] android,ios: arcade vgamepad layout. android vgamepad rewrite Refactor common virtual gamepad code. Distinct layouts for console and arcade. Add arcade buttons 5 and 6, insert card button, service mode toggle. System SP support --- CMakeLists.txt | 7 +- core/input/gamepad.h | 1 + core/input/virtual_gamepad.h | 117 + core/ui/gui.cpp | 2 +- core/ui/vgamepad.cpp | 363 ++- core/ui/vgamepad.h | 16 +- resources/picture/buttons-arcade.png | Bin 0 -> 230003 bytes resources/picture/buttons-arcade.svg | 2279 +++++++++++++++++ .../com/flycast/emulator/BaseGLActivity.java | 3 +- .../java/com/flycast/emulator/Emulator.java | 38 +- .../flycast/emulator/NativeGLActivity.java | 31 +- .../emu/EditVirtualJoystickDelegate.java | 111 + .../java/com/flycast/emulator/emu/JNIdc.java | 7 - .../flycast/emulator/emu/NativeGLView.java | 40 +- .../emulator/emu/TouchEventHandler.java | 27 + .../com/flycast/emulator/emu/VGamepad.java | 35 + .../emulator/emu/VirtualJoystickDelegate.java | 544 ++-- .../emulator/periph/InputDeviceManager.java | 18 +- .../com/flycast/emulator/periph/VJoy.java | 219 -- .../flycast/src/main/jni/src/Android.cpp | 176 +- .../src/main/jni/src/android_gamepad.h | 103 +- .../src/main/jni/src/android_input.cpp | 225 ++ .../flycast/src/main/jni/src/jni_util.h | 2 +- .../emulator/PadViewController.mm | 40 +- .../apple/emulator-ios/emulator/ios_gamepad.h | 113 +- 25 files changed, 3399 insertions(+), 1118 deletions(-) create mode 100644 core/input/virtual_gamepad.h create mode 100644 resources/picture/buttons-arcade.png create mode 100644 resources/picture/buttons-arcade.svg create mode 100644 shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/EditVirtualJoystickDelegate.java create mode 100644 shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/TouchEventHandler.java create mode 100644 shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/VGamepad.java delete mode 100644 shell/android-studio/flycast/src/main/java/com/flycast/emulator/periph/VJoy.java create mode 100644 shell/android-studio/flycast/src/main/jni/src/android_input.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 24130ada9d..2c76bfb520 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1032,7 +1032,8 @@ if(NOT LIBRETRO) if(ANDROID OR IOS) cmrc_add_resources(flycast-resources WHENCE resources - resources/picture/buttons.png) + resources/picture/buttons.png + resources/picture/buttons-arcade.png) endif() endif() @@ -1617,6 +1618,10 @@ if(NOT LIBRETRO) target_sources(${PROJECT_NAME} PRIVATE shell/android-studio/flycast/src/main/jni/src/Android.cpp shell/android-studio/flycast/src/main/jni/src/android_gamepad.h + shell/android-studio/flycast/src/main/jni/src/android_storage.h + shell/android-studio/flycast/src/main/jni/src/http_client.h + shell/android-studio/flycast/src/main/jni/src/jni_util.h + shell/android-studio/flycast/src/main/jni/src/android_input.cpp shell/android-studio/flycast/src/main/jni/src/android_keyboard.h) target_link_libraries(${PROJECT_NAME} PRIVATE android log) diff --git a/core/input/gamepad.h b/core/input/gamepad.h index 88bce6fe7b..e4fdc049bd 100644 --- a/core/input/gamepad.h +++ b/core/input/gamepad.h @@ -52,6 +52,7 @@ enum DreamcastKey EMU_BTN_SAVESTATE, EMU_BTN_BYPASS_KB, EMU_BTN_SCREENSHOT, + EMU_BTN_SRVMODE, // used internally by virtual gamepad // Real axes DC_AXIS_TRIGGERS = 0x1000000, diff --git a/core/input/virtual_gamepad.h b/core/input/virtual_gamepad.h new file mode 100644 index 0000000000..69adc28285 --- /dev/null +++ b/core/input/virtual_gamepad.h @@ -0,0 +1,117 @@ +/* + Copyright 2024 flyinghead + + This file is part of Flycast. + + Flycast is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Flycast. If not, see . +*/ +#pragma once +#include "gamepad_device.h" +#include "ui/vgamepad.h" + +class VirtualGamepad : public GamepadDevice +{ +public: + VirtualGamepad(const char *api_name, int maple_port = 0) + : GamepadDevice(maple_port, api_name, false) + { + _name = "Virtual Gamepad"; + _unique_id = "virtual_gamepad_uid"; + input_mapper = std::make_shared(); + // hasAnalogStick = true; // TODO has an analog stick but input mapping isn't persisted + + leftTrigger = DC_AXIS_LT; + rightTrigger = DC_AXIS_RT; + } + + bool is_virtual_gamepad() override { + return true; + }; + + // normalized coordinates [-1, 1] + void joystickInput(float x, float y) + { + vgamepad::setAnalogStick(x, y); + int joyx = std::round(x * 32767.f); + int joyy = std::round(y * 32767.f); + if (joyx >= 0) + gamepad_axis_input(DC_AXIS_RIGHT, joyx); + else + gamepad_axis_input(DC_AXIS_LEFT, -joyx); + if (joyy >= 0) + gamepad_axis_input(DC_AXIS_DOWN, joyy); + else + gamepad_axis_input(DC_AXIS_UP, -joyy); + } + + void releaseAll() + { + for (int i = 0; i < 32; i++) + if (buttonState & (1 << i)) + gamepad_btn_input(1 << i, false); + buttonState = 0; + joystickInput(0, 0); + gamepad_axis_input(DC_AXIS_LT, 0); + gamepad_axis_input(DC_AXIS_RT, 0); + if (previousFastForward) + gamepad_btn_input(EMU_BTN_FFORWARD, false); + previousFastForward = false; + } + + virtual bool handleButtonInput(u32& state, u32 key, bool pressed) { + // can be overridden in derived classes to handle specific key combos + // (iOS up+down or left+right) + return false; + } + + void buttonInput(vgamepad::ControlId controlId, bool pressed) + { + u32 kcode = vgamepad::controlToDcKey(controlId); + if (kcode == 0) + return; + if (handleButtonInput(buttonState, kcode, pressed)) + return; + if (kcode == DC_AXIS_LT) { + gamepad_axis_input(DC_AXIS_LT, pressed ? 0x7fff : 0); + } + else if (kcode == DC_AXIS_RT) { + gamepad_axis_input(DC_AXIS_RT, pressed ? 0x7fff : 0); + } + else if (kcode == EMU_BTN_SRVMODE) { + if (pressed) + vgamepad::toggleServiceMode(); + } + else + { + if (pressed) + buttonState |= kcode; + else + buttonState &= ~kcode; + if ((kcode & (DC_DPAD_LEFT | DC_DPAD_RIGHT)) != 0 + && (kcode & (DC_DPAD_UP | DC_DPAD_DOWN)) != 0) + { + // diagonals + gamepad_btn_input(kcode & (DC_DPAD_LEFT | DC_DPAD_RIGHT), pressed); + gamepad_btn_input(kcode & (DC_DPAD_UP | DC_DPAD_DOWN), pressed); + } + else { + gamepad_btn_input(kcode, pressed); + } + } + } + +private: + u32 buttonState = 0; + bool previousFastForward = false; +}; diff --git a/core/ui/gui.cpp b/core/ui/gui.cpp index 6d6ceb4943..e826a6b77f 100644 --- a/core/ui/gui.cpp +++ b/core/ui/gui.cpp @@ -1467,7 +1467,7 @@ static void gamepadSettingsPopup(const std::shared_ptr& gamepad) #if defined(__ANDROID__) || defined(TARGET_IPHONE) vgamepad::ImguiVGamepadTexture tex; - ImGui::Image(tex.getId(), ScaledVec2(300, 112.5f), ImVec2(0, 1), ImVec2(1, 0.25f)); + ImGui::Image(tex.getId(), ScaledVec2(300.f, 150.f), ImVec2(0, 1), ImVec2(1, 0)); #endif const char *gamepadPngTitle = "Select a PNG file"; if (ImGui::Button("Choose Image...", ScaledVec2(150, 30))) diff --git a/core/ui/vgamepad.cpp b/core/ui/vgamepad.cpp index b4d7e1d586..53867fdf51 100644 --- a/core/ui/vgamepad.cpp +++ b/core/ui/vgamepad.cpp @@ -31,14 +31,13 @@ #include "cfg/cfg.h" #include "input/gamepad.h" #include "hw/naomi/naomi_cart.h" +#include "hw/naomi/card_reader.h" #include "hw/maple/maple_devs.h" #include namespace vgamepad { -static void loadLayout(); - struct Control { Control() = default; @@ -53,9 +52,11 @@ struct Control }; static Control Controls[_Count]; static bool Visible = true; +static bool serviceMode; static float AlphaTrans = 1.f; static ImVec2 StickPos; // analog stick position [-1, 1] constexpr char const *BTN_PATH = "picture/buttons.png"; +constexpr char const *BTN_PATH_ARCADE = "picture/buttons-arcade.png"; constexpr char const *CFG_SECTION = "vgamepad"; void displayCommands() @@ -87,6 +88,14 @@ void displayCommands() ImGui::End(); } +static const char *getButtonsResPath() { + return settings.platform.isConsole() ? BTN_PATH : BTN_PATH_ARCADE; +} + +static const char *getButtonsCfgName() { + return settings.platform.isConsole() ? "image" : "image_arcade"; +} + static bool loadOSDButtons(const std::string& path) { if (path.empty()) @@ -102,7 +111,7 @@ static bool loadOSDButtons(const std::string& path) if (image_data == nullptr) return false; try { - imguiDriver->updateTexture(BTN_PATH, image_data, width, height, false); + imguiDriver->updateTexture(getButtonsResPath(), image_data, width, height, false); } catch (...) { // vulkan can throw during resizing } @@ -115,25 +124,28 @@ static ImTextureID loadOSDButtons() { ImTextureID id{}; // custom image - std::string path = cfgLoadStr(CFG_SECTION, "image", ""); + std::string path = cfgLoadStr(CFG_SECTION, getButtonsCfgName(), ""); if (loadOSDButtons(path)) return id; - // legacy buttons.png in data folder - if (loadOSDButtons(get_readonly_data_path("buttons.png"))) - return id; - // also try the home folder (android) - if (loadOSDButtons(get_readonly_config_path("buttons.png"))) - return id; + if (settings.platform.isConsole()) + { + // legacy buttons.png in data folder + if (loadOSDButtons(get_readonly_data_path("buttons.png"))) + return id; + // also try the home folder (android) + if (loadOSDButtons(get_readonly_config_path("buttons.png"))) + return id; + } // default in resource size_t size; - std::unique_ptr data = resource::load(BTN_PATH, size); + std::unique_ptr data = resource::load(getButtonsResPath(), size); stbi_set_flip_vertically_on_load(1); int width, height, n; u8 *image_data = stbi_load_from_memory(data.get(), (int)size, &width, &height, &n, STBI_rgb_alpha); if (image_data != nullptr) { try { - id = imguiDriver->updateTexture(BTN_PATH, image_data, width, height, false); + id = imguiDriver->updateTexture(getButtonsResPath(), image_data, width, height, false); } catch (...) { // vulkan can throw during resizing } @@ -144,42 +156,100 @@ static ImTextureID loadOSDButtons() ImTextureID ImguiVGamepadTexture::getId() { - ImTextureID id = imguiDriver->getTexture(BTN_PATH); + ImTextureID id = imguiDriver->getTexture(getButtonsResPath()); if (id == ImTextureID()) id = loadOSDButtons(); return id; } -constexpr float vjoy_sz[2][_Count] = { - // L U R D X Y B A St LT RT Ana Stck FF LU RU LD RD - { 64,64,64,64, 64,64,64,64, 64, 90,90, 128, 64, 64, 64,64,64,64 }, - { 64,64,64,64, 64,64,64,64, 64, 64,64, 128, 64, 64, 64,64,64,64 }, +constexpr float vjoy_tex[_Count][4] = { + // L + { 0, 0, 64, 64 }, + // U + { 64, 0, 64, 64 }, + // R + { 128, 0, 64, 64 }, + // D + { 192, 0, 64, 64 }, + // Y, btn3 + { 256, 0, 64, 64 }, + // X, btn2 + { 320, 0, 64, 64 }, + // B, btn1 + { 384, 0, 64, 64 }, + // A, btn0 + { 448, 0, 64, 64 }, + + // Start + { 0, 64, 64, 64 }, + // LT + { 64, 64, 90, 64 }, + // RT + { 154, 64, 90, 64 }, + // Analog + { 244, 64, 128, 128 }, + // Stick + { 372, 64, 64, 64 }, + // Fast forward + { 436, 64, 64, 64 }, + + // C, btn4 + { 0, 128, 64, 64 }, + // Z, btn5 + { 64, 128, 64, 64 }, + + // service mode + { 0, 192, 64, 64 }, + // insert card + { 64, 192, 64, 64 }, + + // Special controls + // service + { 128, 128, 64, 64 }, + // coin + { 384, 128, 64, 64 }, + // test + { 448, 128, 64, 64 }, }; +static ImVec2 coinUV0, coinUV1; +static ImVec2 serviceUV0, serviceUV1; +static ImVec2 testUV0, testUV1; + constexpr float OSD_TEX_W = 512.f; constexpr float OSD_TEX_H = 256.f; static void setUV() { - float u = 0; - float v = 0; int i = 0; for (auto& control : Controls) { - control.uv0.x = (u + 1) / OSD_TEX_W; - control.uv0.y = 1.f - (v + 1) / OSD_TEX_H; - control.uv1.x = (u + vjoy_sz[0][i] - 1) / OSD_TEX_W; - control.uv1.y = 1.f - (v + vjoy_sz[1][i] - 1) / OSD_TEX_H; - - u += vjoy_sz[0][i]; - if (u >= OSD_TEX_W) { - u -= OSD_TEX_W; - v += vjoy_sz[1][i]; - } + control.uv0.x = (vjoy_tex[i][0] + 1) / OSD_TEX_W; + control.uv0.y = 1.f - (vjoy_tex[i][1] + 1) / OSD_TEX_H; + control.uv1.x = (vjoy_tex[i][0] + vjoy_tex[i][2] - 1) / OSD_TEX_W; + control.uv1.y = 1.f - (vjoy_tex[i][1] + vjoy_tex[i][3] - 1) / OSD_TEX_H; i++; + if (i >= _VisibleCount) + break; } + serviceUV0.x = (vjoy_tex[i][0] + 1) / OSD_TEX_W; + serviceUV0.y = 1.f - (vjoy_tex[i][1] + 1) / OSD_TEX_H; + serviceUV1.x = (vjoy_tex[i][0] + vjoy_tex[i][2] - 1) / OSD_TEX_W; + serviceUV1.y = 1.f - (vjoy_tex[i][1] + vjoy_tex[i][3] - 1) / OSD_TEX_H; + i++; + coinUV0.x = (vjoy_tex[i][0] + 1) / OSD_TEX_W; + coinUV0.y = 1.f - (vjoy_tex[i][1] + 1) / OSD_TEX_H; + coinUV1.x = (vjoy_tex[i][0] + vjoy_tex[i][2] - 1) / OSD_TEX_W; + coinUV1.y = 1.f - (vjoy_tex[i][1] + vjoy_tex[i][3] - 1) / OSD_TEX_H; + i++; + testUV0.x = (vjoy_tex[i][0] + 1) / OSD_TEX_W; + testUV0.y = 1.f - (vjoy_tex[i][1] + 1) / OSD_TEX_H; + testUV1.x = (vjoy_tex[i][0] + vjoy_tex[i][2] - 1) / OSD_TEX_W; + testUV1.y = 1.f - (vjoy_tex[i][1] + vjoy_tex[i][3] - 1) / OSD_TEX_H; + i++; + } static OnLoad _(&setUV); @@ -191,18 +261,6 @@ void hide() { Visible = false; } -void setPosition(ControlId id, float x, float y, float w, float h) -{ - verify(id >= 0 && id < _VisibleCount); - auto& control = Controls[id]; - control.pos.x = x; - control.pos.y = y; - if (w != 0) - control.size.x = w; - if (h != 0) - control.size.y = h; -} - ControlId hitTest(float x, float y) { for (const auto& control : Controls) @@ -215,16 +273,17 @@ ControlId hitTest(float x, float y) u32 controlToDcKey(ControlId control) { + const bool arcade = settings.platform.isArcade(); switch (control) { case Left: return DC_DPAD_LEFT; case Up: return DC_DPAD_UP; case Right: return DC_DPAD_RIGHT; case Down: return DC_DPAD_DOWN; - case X: return DC_BTN_X; - case Y: return DC_BTN_Y; - case B: return DC_BTN_B; - case A: return DC_BTN_A; + case X: return serviceMode ? DC_DPAD2_DOWN : arcade ? DC_BTN_C : DC_BTN_X; + case Y: return arcade ? DC_BTN_X : DC_BTN_Y; + case B: return serviceMode ? DC_DPAD2_UP : DC_BTN_B; + case A: return serviceMode ? DC_BTN_D : DC_BTN_A; case Start: return DC_BTN_START; case LeftTrigger: return DC_AXIS_LT; case RightTrigger: return DC_AXIS_RT; @@ -233,6 +292,11 @@ u32 controlToDcKey(ControlId control) case RightUp: return DC_DPAD_RIGHT | DC_DPAD_UP; case LeftDown: return DC_DPAD_LEFT | DC_DPAD_DOWN; case RightDown: return DC_DPAD_RIGHT | DC_DPAD_DOWN; + // Arcade + case Btn4: return DC_BTN_Y; + case Btn5: return DC_BTN_Z; + case InsertCard: return DC_BTN_INSERT_CARD; + case ServiceMode: return EMU_BTN_SRVMODE; default: return 0; } } @@ -246,6 +310,19 @@ float getControlWidth(ControlId control) { return Controls[control].size.x; } +void toggleServiceMode() +{ + serviceMode = !serviceMode; + if (serviceMode) { + Controls[A].disabled = false; + Controls[B].disabled = false; + Controls[X].disabled = false; + } + else { + startGame(); + } +} + static void drawButtonDim(ImDrawList *drawList, const Control& control, int state) { if (control.disabled) @@ -255,15 +332,37 @@ static void drawButtonDim(ImDrawList *drawList, const Control& control, int stat ImVec2 pos = control.pos * scale_h; ImVec2 size = control.size * scale_h; pos.x += offs_x; - if (static_cast(&control - &Controls[0]) == AnalogStick) + ControlId controlId = static_cast(&control - &Controls[0]); + if (controlId == AnalogStick) pos += StickPos * size; float col = (0.5f - 0.25f * state / 255) * AlphaTrans; float alpha = (100.f - config::VirtualGamepadTransparency) / 100.f * AlphaTrans; ImVec4 color(col, col, col, alpha); + const ImVec2* uv0 = &control.uv0; + const ImVec2* uv1 = &control.uv1; + if (serviceMode) + switch (controlId) + { + case A: + uv0 = &coinUV0; + uv1 = &coinUV1; + break; + case B: + uv0 = &serviceUV0; + uv1 = &serviceUV1; + break; + case X: + uv0 = &testUV0; + uv1 = &testUV1; + break; + default: + break; + } + ImguiVGamepadTexture tex; - tex.draw(drawList, pos, size, control.uv0, control.uv1, color); + tex.draw(drawList, pos, size, *uv0, *uv1, color); } static void drawButton(ImDrawList *drawList, const Control& control, bool state) { @@ -272,7 +371,6 @@ static void drawButton(ImDrawList *drawList, const Control& control, bool state) void draw() { -#ifndef __ANDROID__ if (Controls[Left].pos.x == 0.f) { loadLayout(); @@ -280,7 +378,6 @@ void draw() // mark done Controls[Left].pos.x = 1e-12f; } -#endif ImDrawList *drawList = ImGui::GetBackgroundDrawList(); drawButton(drawList, Controls[Left], kcode[0] & DC_DPAD_LEFT); @@ -288,10 +385,10 @@ void draw() drawButton(drawList, Controls[Right], kcode[0] & DC_DPAD_RIGHT); drawButton(drawList, Controls[Down], kcode[0] & DC_DPAD_DOWN); - drawButton(drawList, Controls[X], kcode[0] & (settings.platform.isConsole() ? DC_BTN_X : DC_BTN_C)); + drawButton(drawList, Controls[X], kcode[0] & (serviceMode ? DC_DPAD2_DOWN : settings.platform.isConsole() ? DC_BTN_X : DC_BTN_C)); drawButton(drawList, Controls[Y], kcode[0] & (settings.platform.isConsole() ? DC_BTN_Y : DC_BTN_X)); - drawButton(drawList, Controls[B], kcode[0] & DC_BTN_B); - drawButton(drawList, Controls[A], kcode[0] & DC_BTN_A); + drawButton(drawList, Controls[B], kcode[0] & (serviceMode ? DC_DPAD2_UP : DC_BTN_B)); + drawButton(drawList, Controls[A], kcode[0] & (serviceMode ? DC_BTN_D : DC_BTN_A)); drawButton(drawList, Controls[Start], kcode[0] & DC_BTN_START); @@ -303,6 +400,12 @@ void draw() drawButton(drawList, Controls[AnalogStick], false); drawButton(drawList, Controls[FastForward], false); + + drawButton(drawList, Controls[Btn4], kcode[0] & DC_BTN_Y); + drawButton(drawList, Controls[Btn5], kcode[0] & DC_BTN_Z); + drawButton(drawList, Controls[ServiceMode], !serviceMode); + drawButton(drawList, Controls[InsertCard], kcode[0] & DC_BTN_INSERT_CARD); + AlphaTrans += ((float)Visible - AlphaTrans) / 2; } @@ -349,6 +452,7 @@ struct LayoutElement void reset() { + applyUiScale(); scale = 1.f; const float dcw = 480.f * (float)settings.display.width / settings.display.height; const float uiscale = getUIScale(); @@ -374,6 +478,11 @@ static LayoutElement Layout[] { { "RT", -32.f,-240.f, 90.f, 64.f }, { "analog", 40.f,-320.f, 128.f, 128.f }, { "fforward", -24.f, 24.f, 64.f, 64.f }, + + { "btn4", -24.f,-216.f, 64.f, 64.f }, + { "btn5", -152.f,-216.f, 64.f, 64.f }, + { "service", -24.f, 96.f, 64.f, 64.f }, + { "inscard", 40.f,-250.f, 64.f, 64.f }, }; static void applyLayout() @@ -440,6 +549,26 @@ static void applyLayout() scale = Layout[Elem_FForward].scale * uiscale; Controls[FastForward].pos = { Layout[Elem_FForward].x * dcw - dx, Layout[Elem_FForward].y * 480.f }; Controls[FastForward].size = { Layout[Elem_FForward].dw * scale, Layout[Elem_FForward].dh * scale }; + + // ARCADE + // Button 4 + scale = Layout[Elem_Btn4].scale * uiscale; + Controls[Btn4].pos = { Layout[Elem_Btn4].x * dcw - dx, Layout[Elem_Btn4].y * 480.f }; + Controls[Btn4].size = { Layout[Elem_Btn4].dw * scale, Layout[Elem_Btn4].dh * scale }; + // Button 5 + scale = Layout[Elem_Btn5].scale * uiscale; + Controls[Btn5].pos = { Layout[Elem_Btn5].x * dcw - dx, Layout[Elem_Btn5].y * 480.f }; + Controls[Btn5].size = { Layout[Elem_Btn5].dw * scale, Layout[Elem_Btn5].dh * scale }; + + // Service Mode + scale = Layout[Elem_ServiceMode].scale * uiscale; + Controls[ServiceMode].pos = { Layout[Elem_ServiceMode].x * dcw - dx, Layout[Elem_ServiceMode].y * 480.f }; + Controls[ServiceMode].size = { Layout[Elem_ServiceMode].dw * scale, Layout[Elem_ServiceMode].dh * scale }; + + // Insert Card + scale = Layout[Elem_InsertCard].scale * uiscale; + Controls[InsertCard].pos = { Layout[Elem_InsertCard].x * dcw - dx, Layout[Elem_InsertCard].y * 480.f }; + Controls[InsertCard].size = { Layout[Elem_InsertCard].dw * scale, Layout[Elem_InsertCard].dh * scale }; } void applyUiScale() { @@ -447,7 +576,7 @@ void applyUiScale() { element.applyUiScale(); } -static void loadLayout() +void loadLayout() { for (auto& element : Layout) { element.reset(); @@ -456,7 +585,7 @@ static void loadLayout() applyLayout(); } -static void saveLayout() +void saveLayout() { cfgSetAutoSave(false); for (auto& element : Layout) @@ -500,11 +629,11 @@ void scaleElement(Element element, float factor) void loadImage(const std::string& path) { if (path.empty()) { - cfgSaveStr(CFG_SECTION, "image", ""); + cfgSaveStr(CFG_SECTION, getButtonsCfgName(), ""); loadOSDButtons(); } else if (loadOSDButtons(path)) { - cfgSaveStr(CFG_SECTION, "image", path); + cfgSaveStr(CFG_SECTION, getButtonsCfgName(), path); } } @@ -554,8 +683,13 @@ static void disableControl(ControlId ctrlId) void startGame() { enableAllControls(); + serviceMode = false; if (settings.platform.isConsole()) { + disableControl(Btn4); + disableControl(Btn5); + disableControl(ServiceMode); + disableControl(InsertCard); switch (config::MapleMainDevices[0]) { case MDT_LightGun: @@ -590,9 +724,17 @@ void startGame() else { // arcade game - // FIXME RT is used as mod key for coin, test, service (ABX) - // FIXME RT and LT are buttons 4 & 5 in arcade mode - // TODO insert card button for card games + if (!card_reader::readerAvailable()) + disableControl(InsertCard); + if (settings.platform.isAtomiswave()) { + disableControl(Btn5); + } + else if (settings.platform.isSystemSP()) + { + disableControl(Y); + disableControl(Btn4); + disableControl(Btn5); + } if (NaomiGameInputs != nullptr) { bool fullAnalog = false; @@ -618,6 +760,14 @@ void startGame() } if (!fullAnalog) disableControl(AnalogArea); + if (!lt) + disableControl(LeftTrigger); + else + disableControl(Btn5); + if (!rt) + disableControl(RightTrigger); + else + disableControl(Btn4); u32 usedButtons = 0; for (const auto& button : NaomiGameInputs->buttons) { @@ -627,21 +777,17 @@ void startGame() } if (settings.platform.isAtomiswave()) { - // button order: A B X Y RT - /* these ones are always needed for now + // button order: A B X Y B4 if ((usedButtons & AWAVE_BTN0_KEY) == 0) disableControl(A); if ((usedButtons & AWAVE_BTN1_KEY) == 0) disableControl(B); if ((usedButtons & AWAVE_BTN2_KEY) == 0) disableControl(X); - if ((usedButtons & AWAVE_BTN4_KEY) == 0 && !rt) - disableControl(RightTrigger); - */ if ((usedButtons & AWAVE_BTN3_KEY) == 0) disableControl(Y); - if (!lt) - disableControl(LeftTrigger); + if ((usedButtons & AWAVE_BTN4_KEY) == 0) + disableControl(Btn4); if ((usedButtons & AWAVE_UP_KEY) == 0) disableControl(Up); if ((usedButtons & AWAVE_DOWN_KEY) == 0) @@ -650,10 +796,30 @@ void startGame() disableControl(Left); if ((usedButtons & AWAVE_RIGHT_KEY) == 0) disableControl(Right); + if ((usedButtons & AWAVE_START_KEY) == 0) + disableControl(Start); + } + else if (settings.platform.isSystemSP()) + { + if ((usedButtons & DC_BTN_A) == 0) + disableControl(A); + if ((usedButtons & DC_BTN_B) == 0) + disableControl(B); + if ((usedButtons & DC_BTN_C) == 0) + disableControl(X); + if ((usedButtons & DC_DPAD_UP) == 0) + disableControl(Up); + if ((usedButtons & DC_DPAD_DOWN) == 0) + disableControl(Down); + if ((usedButtons & DC_DPAD_LEFT) == 0) + disableControl(Left); + if ((usedButtons & DC_DPAD_RIGHT) == 0) + disableControl(Right); + if ((usedButtons & DC_BTN_START) == 0) + disableControl(Start); } else { - /* these ones are always needed for now if ((usedButtons & NAOMI_BTN0_KEY) == 0) disableControl(A); if ((usedButtons & NAOMI_BTN1_KEY) == 0) @@ -661,16 +827,15 @@ void startGame() if ((usedButtons & NAOMI_BTN2_KEY) == 0) // C disableControl(X); - if ((usedButtons & NAOMI_BTN4_KEY) == 0 && !rt) - // Y - disableControl(RightTrigger); - */ if ((usedButtons & NAOMI_BTN3_KEY) == 0) // X disableControl(Y); - if ((usedButtons & NAOMI_BTN5_KEY) == 0 && !lt) + if ((usedButtons & NAOMI_BTN4_KEY) == 0) + // Y + disableControl(Btn4); + if ((usedButtons & NAOMI_BTN5_KEY) == 0) // Z - disableControl(LeftTrigger); + disableControl(Btn5); if ((usedButtons & NAOMI_UP_KEY) == 0) disableControl(Up); if ((usedButtons & NAOMI_DOWN_KEY) == 0) @@ -679,28 +844,41 @@ void startGame() disableControl(Left); if ((usedButtons & NAOMI_RIGHT_KEY) == 0) disableControl(Right); + if ((usedButtons & NAOMI_START_KEY) == 0) + disableControl(Start); } } - else if (settings.input.lightgunGame) - { - disableControl(Y); - disableControl(AnalogArea); - disableControl(LeftTrigger); - disableControl(Up); - disableControl(Down); - disableControl(Left); - disableControl(Right); - } else { - // all analog games *should* have an input description - disableControl(AnalogArea); + if (settings.input.lightgunGame) + { + // TODO enable mouse? + disableControl(A); + disableControl(X); + disableControl(Y); + disableControl(Btn4); + disableControl(Btn5); + disableControl(AnalogArea); + disableControl(LeftTrigger); + disableControl(RightTrigger); + disableControl(Up); + disableControl(Down); + disableControl(Left); + disableControl(Right); + } + else + { + // all analog games *should* have an input description + disableControl(AnalogArea); + disableControl(LeftTrigger); + disableControl(RightTrigger); + } } } - bool enabledState[_Count]; - for (int i = 0; i < _Count; i++) - enabledState[i] = !Controls[i].disabled; - setEnabledControls(enabledState); +} + +void resetEditing() { + resetLayout(); } #ifndef __ANDROID__ @@ -721,13 +899,6 @@ void stopEditing(bool canceled) saveLayout(); } -void resetEditing() { - resetLayout(); -} - -void setEnabledControls(bool enabled[_Count]) { -} - #endif } // namespace vgamepad diff --git a/core/ui/vgamepad.h b/core/ui/vgamepad.h index 86b099aa77..d97fb21f0d 100644 --- a/core/ui/vgamepad.h +++ b/core/ui/vgamepad.h @@ -40,13 +40,18 @@ enum ControlId AnalogStick, FastForward, + Btn4, + Btn5, + ServiceMode, + InsertCard, + LeftUp, RightUp, LeftDown, RightDown, _Count, - _VisibleCount = FastForward + 1, + _VisibleCount = LeftUp, }; enum Element @@ -59,6 +64,10 @@ enum Element Elem_RT, Elem_Analog, Elem_FForward, + Elem_Btn4, + Elem_Btn5, + Elem_ServiceMode, + Elem_InsertCard, }; class ImguiVGamepadTexture : public ImguiTexture @@ -69,8 +78,6 @@ class ImguiVGamepadTexture : public ImguiTexture #if defined(__ANDROID__) || defined(TARGET_IPHONE) -void setPosition(ControlId id, float x, float y, float w = 0.f, float h = 0.f); // Legacy android -void setEnabledControls(bool enabled[_Count]); // Legacy android void enableAllControls(); void show(); void hide(); @@ -87,11 +94,14 @@ ControlId hitTest(float x, float y); u32 controlToDcKey(ControlId control); void setAnalogStick(float x, float y); float getControlWidth(ControlId); +void toggleServiceMode(); void applyUiScale(); Element layoutHitTest(float x, float y); void translateElement(Element element, float dx, float dy); void scaleElement(Element element, float factor); +void loadLayout(); +void saveLayout(); #else diff --git a/resources/picture/buttons-arcade.png b/resources/picture/buttons-arcade.png new file mode 100644 index 0000000000000000000000000000000000000000..980212cffc6f4ca38dbdf17d83d3ede431f19c3f GIT binary patch literal 230003 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�CV1w1!Z@rD*1+VLs6u@DNOr&Za}>!7=z9lH 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

ig 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

j6#`L}_T|j0)BGrg!V_5Etm|SEU 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

F~`3~0kv8c|TR?n$tz!5!`P7)j% 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 + + +124356S$T111111LTRT diff --git a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/BaseGLActivity.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/BaseGLActivity.java index 4766949585..01505f39c9 100644 --- a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/BaseGLActivity.java +++ b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/BaseGLActivity.java @@ -49,7 +49,6 @@ public abstract class BaseGLActivity extends Activity implements ActivityCompat. private static final int AUDIO_PERM_REQUEST = 1002; protected SharedPreferences prefs; - protected float[][] vjoy_d_cached; // Used for VJoy editing private AudioBackend audioBackend; protected Handler handler = new Handler(); private boolean audioPermissionRequested = false; @@ -406,7 +405,7 @@ else if (requestCode == STORAGE_PERM_REQUEST) { } //setup mic - if (Emulator.micPluggedIn()) + if (InputDeviceManager.isMicPluggedIn()) requestRecordAudioPermission(); } diff --git a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/Emulator.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/Emulator.java index 28d8ba14e2..5a089d2bf0 100644 --- a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/Emulator.java +++ b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/Emulator.java @@ -10,7 +10,8 @@ import androidx.appcompat.app.AppCompatDelegate; import com.flycast.emulator.config.Config; -import com.flycast.emulator.emu.JNIdc; +import com.flycast.emulator.emu.VGamepad; +import com.flycast.emulator.periph.InputDeviceManager; public class Emulator extends Application { private static Context context; @@ -18,32 +19,14 @@ public class Emulator extends Application { private WifiManager wifiManager = null; private WifiManager.MulticastLock multicastLock = null; - // see MapleDeviceType in hw/maple/maple_devs.h - public static final int MDT_Microphone = 2; - public static final int MDT_None = 8; - public static int vibrationPower = 80; - public static int[] maple_devices = { - MDT_None, - MDT_None, - MDT_None, - MDT_None - }; - public static int[][] maple_expansion_devices = { - { MDT_None, MDT_None }, - { MDT_None, MDT_None }, - { MDT_None, MDT_None }, - { MDT_None, MDT_None }, - }; - /** * Load the settings from native code * */ public void getConfigurationPrefs() { - Emulator.vibrationPower = JNIdc.getVirtualGamepadVibration(); - JNIdc.getControllers(maple_devices, maple_expansion_devices); + Emulator.vibrationPower = VGamepad.getVibrationPower(); } /** @@ -54,26 +37,17 @@ public void SaveAndroidSettings(String homeDirectory) { Log.i("flycast", "SaveAndroidSettings: saving preferences"); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); - Emulator.vibrationPower = JNIdc.getVirtualGamepadVibration(); - JNIdc.getControllers(maple_devices, maple_expansion_devices); + Emulator.vibrationPower = VGamepad.getVibrationPower(); prefs.edit() .putString(Config.pref_home, homeDirectory).apply(); - if (micPluggedIn() && currentActivity instanceof BaseGLActivity) { + if (InputDeviceManager.isMicPluggedIn() && currentActivity instanceof BaseGLActivity) { + Log.i("flycast", "SaveAndroidSettings: MIC PLUGGED IN"); ((BaseGLActivity)currentActivity).requestRecordAudioPermission(); } } - public static boolean micPluggedIn() { - JNIdc.getControllers(maple_devices, maple_expansion_devices); - for (int[] maple_expansion_device : maple_expansion_devices) - if (maple_expansion_device[0] == MDT_Microphone - || maple_expansion_device[1] == MDT_Microphone) - return true; - return false; - } - @Override public void onCreate() { super.onCreate(); diff --git a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/NativeGLActivity.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/NativeGLActivity.java index 4f84b6e2b5..a729a92b65 100644 --- a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/NativeGLActivity.java +++ b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/NativeGLActivity.java @@ -16,10 +16,8 @@ import androidx.annotation.Nullable; -import com.flycast.emulator.emu.JNIdc; import com.flycast.emulator.emu.NativeGLView; import com.flycast.emulator.periph.InputDeviceManager; -import com.flycast.emulator.periph.VJoy; public final class NativeGLActivity extends BaseGLActivity { @@ -61,38 +59,35 @@ public boolean isSurfaceReady() { return mView != null && mView.isSurfaceReady(); } - // Called from native code - private void VJoyStartEditing() { - vjoy_d_cached = VJoy.readCustomVjoyValues(getApplicationContext()); - JNIdc.showVirtualGamepad(); - mView.setEditVjoyMode(true); + @Override + public void onGameStateChange(boolean started) { + super.onGameStateChange(started); + runOnUiThread(new Runnable() { + public void run() { + if (started) + mView.showVGamepad(); + } + }); } + // Called from native code - private void VJoyResetEditing() { - VJoy.resetCustomVjoyValues(getApplicationContext()); - mView.readCustomVjoyValues(); - mView.resetEditMode(); + private void VJoyStartEditing() { handler.post(new Runnable() { @Override public void run() { - mView.requestLayout(); + mView.setEditVjoyMode(true); } }); } // Called from native code - private void VJoyStopEditing(final boolean canceled) { + private void VJoyStopEditing() { handler.post(new Runnable() { @Override public void run() { - if (canceled) - mView.restoreCustomVjoyValues(vjoy_d_cached); mView.setEditVjoyMode(false); } }); } - private void VJoyEnableControls(boolean[] state) { - mView.enableVjoy(state); - } // On-screen keyboard borrowed from SDL core android code class ShowTextInputTask implements Runnable { diff --git a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/EditVirtualJoystickDelegate.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/EditVirtualJoystickDelegate.java new file mode 100644 index 0000000000..422dfd1456 --- /dev/null +++ b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/EditVirtualJoystickDelegate.java @@ -0,0 +1,111 @@ +/* + Copyright 2024 flyinghead + + This file is part of Flycast. + + Flycast is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Flycast. If not, see . +*/ +package com.flycast.emulator.emu; + +import android.view.MotionEvent; +import android.view.ScaleGestureDetector; +import android.view.View; + +import androidx.annotation.NonNull; + +public class EditVirtualJoystickDelegate implements TouchEventHandler +{ + private View view; + private ScaleGestureDetector scaleGestureDetector; + private int currentElement = -1; + private float lastX, lastY; + + public EditVirtualJoystickDelegate(View view) { + this.view = view; + scaleGestureDetector = new ScaleGestureDetector(view.getContext(), new EditVirtualJoystickDelegate.ScaleGestureListener()); + } + + @Override + public void stop() { + } + @Override + public void show() { + VGamepad.show(); + } + + @Override + public boolean onTouchEvent(MotionEvent event, int width, int height) + { + scaleGestureDetector.onTouchEvent(event); + if (scaleGestureDetector.isInProgress()) + return true; + + int actionMasked = event.getActionMasked(); + int actionIndex = event.getActionIndex(); + switch (actionMasked) + { + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: + currentElement = -1; + break; + + case MotionEvent.ACTION_DOWN: + lastX = event.getX(actionIndex) / view.getWidth(); + lastY = event.getY(actionIndex) / view.getHeight(); + currentElement = VGamepad.layoutHitTest(lastX, lastY); + return currentElement != -1; + + case MotionEvent.ACTION_MOVE: + if (currentElement != -1 && event.getPointerCount() == 1) + { + float x = event.getX(actionIndex) / view.getWidth(); + float y = event.getY(actionIndex) / view.getHeight(); + VGamepad.translateElement(currentElement, x - lastX, y - lastY); + lastX = x; + lastY = y; + return true; + } + break; + + default: + break; + } + + return false; + } + + private class ScaleGestureListener implements ScaleGestureDetector.OnScaleGestureListener { + private int elemId = -1; + @Override + public boolean onScaleBegin(@NonNull ScaleGestureDetector detector) + { + elemId = VGamepad.layoutHitTest(detector.getFocusX() / view.getWidth(), detector.getFocusY() / view.getHeight()); + return elemId != -1; + } + + @Override + public boolean onScale(ScaleGestureDetector detector) + { + if (elemId == -1) + return false; + VGamepad.scaleElement(elemId, detector.getScaleFactor()); + return true; + } + + @Override + public void onScaleEnd(ScaleGestureDetector detector) { + elemId = -1; + } + } +} diff --git a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/JNIdc.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/JNIdc.java index 45aecceea3..ff06fd2376 100644 --- a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/JNIdc.java +++ b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/JNIdc.java @@ -18,12 +18,7 @@ public final class JNIdc public static native void rendinitNative(Surface surface, int w, int h); - public static native void vjoy(int id, float x, float y, float w, float h); - - public static native void getControllers(int[] controllers, int[][] peripherals); - public static native void setupMic(SipEmulator sip); - public static native int getVirtualGamepadVibration(); public static native void screenCharacteristics(float screenDpi, float refreshRate); public static native void guiOpenSettings(); @@ -31,6 +26,4 @@ public final class JNIdc public static native boolean guiIsContentBrowser(); public static native void guiSetInsets(int left, int right, int top, int bottom); - public static native void showVirtualGamepad(); - public static native void hideVirtualGamepad(); } diff --git a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/NativeGLView.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/NativeGLView.java index b70cda441c..da10864e1c 100644 --- a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/NativeGLView.java +++ b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/NativeGLView.java @@ -10,6 +10,7 @@ import android.util.Log; import android.view.Display; import android.view.DisplayCutout; +import android.view.InputDevice; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; @@ -24,11 +25,7 @@ public class NativeGLView extends SurfaceView implements SurfaceHolder.Callback { private boolean surfaceReady = false; private boolean paused = false; - VirtualJoystickDelegate vjoyDelegate; - - public void restoreCustomVjoyValues(float[][] vjoy_d_cached) { - vjoyDelegate.restoreCustomVjoyValues(vjoy_d_cached); - } + private TouchEventHandler vjoyDelegate = null; public NativeGLView(Context context) { this(context, null); @@ -63,20 +60,21 @@ public void onSystemUiVisibilityChange(int visibility) { @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); - vjoyDelegate = new VirtualJoystickDelegate(this); + if (InputDeviceManager.getInstance().hasTouchscreen()) + vjoyDelegate = new VirtualJoystickDelegate(this); } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); - vjoyDelegate.stop(); + if (vjoyDelegate != null) + vjoyDelegate.stop(); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); - vjoyDelegate.layout(getWidth(), getHeight()); DisplayMetrics dm = getContext().getResources().getDisplayMetrics(); Display d; @@ -101,10 +99,6 @@ protected void onLayout(boolean changed, int left, int top, int right, int botto } } - public void resetEditMode() { - vjoyDelegate.resetEditMode(); - } - @Override public boolean onTouchEvent(final MotionEvent event) { @@ -113,13 +107,13 @@ public boolean onTouchEvent(final MotionEvent event) InputDeviceManager.getInstance().mouseEvent(Math.round(event.getX()), Math.round(event.getY()), event.getButtonState()); return true; } - else + if (vjoyDelegate != null && (event.getSource() & InputDevice.SOURCE_TOUCHSCREEN) == InputDevice.SOURCE_TOUCHSCREEN) return vjoyDelegate.onTouchEvent(event, getWidth(), getHeight()); + return false; } @Override public void surfaceCreated(SurfaceHolder surfaceHolder) { - } @Override @@ -179,14 +173,18 @@ public void onWindowFocusChanged(boolean hasFocus) { } } - public void readCustomVjoyValues() { - vjoyDelegate.readCustomVjoyValues(); + public void setEditVjoyMode(boolean editVjoyMode) + { + if (!InputDeviceManager.getInstance().hasTouchscreen()) + return; + if (editVjoyMode && !(vjoyDelegate instanceof EditVirtualJoystickDelegate)) + vjoyDelegate = new EditVirtualJoystickDelegate(this); + else if (!editVjoyMode && !(vjoyDelegate instanceof VirtualJoystickDelegate)) + vjoyDelegate = new VirtualJoystickDelegate(this); } - public void setEditVjoyMode(boolean editVjoyMode) { - vjoyDelegate.setEditVjoyMode(editVjoyMode); - } - public void enableVjoy(boolean[] state) { - vjoyDelegate.enableVjoy(state); + public void showVGamepad() { + if (vjoyDelegate != null) + vjoyDelegate.show(); } } diff --git a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/TouchEventHandler.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/TouchEventHandler.java new file mode 100644 index 0000000000..40f3513371 --- /dev/null +++ b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/TouchEventHandler.java @@ -0,0 +1,27 @@ +/* + Copyright 2024 flyinghead + + This file is part of Flycast. + + Flycast is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Flycast. If not, see . +*/ +package com.flycast.emulator.emu; + +import android.view.MotionEvent; + +public interface TouchEventHandler { + boolean onTouchEvent(MotionEvent event, int width, int height); + void stop(); + void show(); +} diff --git a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/VGamepad.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/VGamepad.java new file mode 100644 index 0000000000..4b85c8ce68 --- /dev/null +++ b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/VGamepad.java @@ -0,0 +1,35 @@ +/* + Copyright 2024 flyinghead + + This file is part of Flycast. + + Flycast is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Flycast. If not, see . +*/ +package com.flycast.emulator.emu; + +public class VGamepad +{ + static { System.loadLibrary("flycast"); } + + public static native int getVibrationPower(); + + public static native void show(); + public static native void hide(); + public static native int hitTest(float x, float y); + public static native float getControlWidth(int controlId); + + public static native int layoutHitTest(float x, float y); + public static native void scaleElement(int elemId, float scale); + public static native void translateElement(int elemId, float x, float y); +} diff --git a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/VirtualJoystickDelegate.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/VirtualJoystickDelegate.java index 813ef79815..a0276225f7 100644 --- a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/VirtualJoystickDelegate.java +++ b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/VirtualJoystickDelegate.java @@ -1,409 +1,273 @@ +/* + Copyright 2024 flyinghead + + This file is part of Flycast. + + Flycast is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Flycast. If not, see . +*/ package com.flycast.emulator.emu; import android.content.Context; -import android.content.res.Configuration; import android.os.Handler; -import android.view.InputDevice; import android.view.MotionEvent; -import android.view.ScaleGestureDetector; import android.view.View; import com.flycast.emulator.periph.InputDeviceManager; -import com.flycast.emulator.periph.VJoy; import com.flycast.emulator.periph.VibratorThread; -import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; -public class VirtualJoystickDelegate { - private VibratorThread vibratorThread; - - private boolean editVjoyMode = false; - private int selectedVjoyElement = VJoy.ELEM_NONE; - private ScaleGestureDetector scaleGestureDetector; +public class VirtualJoystickDelegate implements TouchEventHandler +{ + private static final int CTLID_ANARING = 11; + private static final int CTLID_ANASTICK = 12; + private VibratorThread vibratorThread; private Handler handler = new Handler(); private Runnable hideVGamepadRunnable = new Runnable() { @Override public void run() { - JNIdc.hideVirtualGamepad(); + VGamepad.hide(); } }; - - private float[][] vjoy_d_custom; - private boolean[] vjoy_enabled; - - private static final float[][] vjoy = VJoy.baseVJoy(); - private Context context; private View view; + private int joyPointerId = -1; + private float joyBiasX, joyBiasY; + private Map pidToControlId = new HashMap<>(); + private int mouseButtons = 0; + private int[] mousePos = { -32768, -32768 }; + private int mousePid = -1; public VirtualJoystickDelegate(View view) { this.view = view; this.context = view.getContext(); vibratorThread = VibratorThread.getInstance(); - - readCustomVjoyValues(); - vjoy_enabled = new boolean[VJoy.VJoyCount + 4]; // include diagonals - Arrays.fill(vjoy_enabled, true); - scaleGestureDetector = new ScaleGestureDetector(context, new OscOnScaleGestureListener()); } + @Override public void stop() { vibratorThread.stopThread(); vibratorThread = null; } - public void readCustomVjoyValues() { - vjoy_d_custom = VJoy.readCustomVjoyValues(context); - } - - public void restoreCustomVjoyValues(float[][] vjoy_d_cached) { - vjoy_d_custom = vjoy_d_cached; - VJoy.writeCustomVjoyValues(vjoy_d_cached, context); - - resetEditMode(); - view.requestLayout(); - } - - private void reset_analog() - { - - int j=11; - vjoy[j+1][0]=vjoy[j][0]+vjoy[j][2]/2-vjoy[j+1][2]/2; - vjoy[j+1][1]=vjoy[j][1]+vjoy[j][3]/2-vjoy[j+1][3]/2; - JNIdc.vjoy(j+1, vjoy[j+1][0], vjoy[j+1][1], vjoy[j+1][2], vjoy[j+1][3]); - } - - private int get_anal(int j, int axis) - { - return (int) (((vjoy[j+1][axis]+vjoy[j+1][axis+2]/2) - vjoy[j][axis] - vjoy[j][axis+2]/2)*254/vjoy[j][axis+2]); - } - - private float vbase(float p, float m, float scl) - { - return (int) ( m - (m -p)*scl); - } - - private float vbase(float p, float scl) + private boolean touchMouseEvent(MotionEvent event) { - return (int) (p*scl ); - } - - private boolean isTablet() { - return (context.getResources().getConfiguration().screenLayout - & Configuration.SCREENLAYOUT_SIZE_MASK) - >= Configuration.SCREENLAYOUT_SIZE_LARGE; - } - - public void layout(int width, int height) - { - //dcpx/cm = dcpx/px * px/cm - float magic = isTablet() ? 0.8f : 0.7f; - float scl = 480.0f / height * context.getResources().getDisplayMetrics().density * magic; - float scl_dc = height / 480.0f; - float tx = (width - 640.0f * scl_dc) / 2 / scl_dc; - - float a_x = -tx + 24 * scl; - float a_y = -24 * scl; - - // Not sure how this can happen - if (vjoy_d_custom == null) - return; - - float[][] vjoy_d = VJoy.getVjoy_d(vjoy_d_custom); - - for (int i=0;i vjoy[j][0] && x <= (vjoy[j][0] + vjoy[j][2]) - && y > vjoy[j][1] && y <= (vjoy[j][1] + vjoy[j][3])) - { - if (vjoy[j][4] >= VJoy.BTN_RTRIG) { - // Not for analog - if (vjoy[j][5] == 0) - if (!editVjoyMode) { - vibratorThread.click(); - } - vjoy[j][5] = 2; - } - - - if (vjoy[j][4] == VJoy.BTN_ANARING) { - if (editVjoyMode) { - selectedVjoyElement = VJoy.ELEM_ANALOG; - resetEditMode(); - } else { - vjoy[j + 1][0] = x - vjoy[j + 1][2] / 2; - vjoy[j + 1][1] = y - vjoy[j + 1][3] / 2; - - JNIdc.vjoy(j + 1, vjoy[j + 1][0], vjoy[j + 1][1], vjoy[j + 1][2], vjoy[j + 1][3]); - anal_id = event.getPointerId(i); - } - } else if (vjoy[j][4] != VJoy.BTN_ANAPOINT) { - if (vjoy[j][4] == VJoy.BTN_LTRIG) { - if (editVjoyMode) { - selectedVjoyElement = VJoy.ELEM_LTRIG; - resetEditMode(); - } else { - left_trigger = 255; - lt_id = event.getPointerId(i); - } - } else if (vjoy[j][4] == VJoy.BTN_RTRIG) { - if (editVjoyMode) { - selectedVjoyElement = VJoy.ELEM_RTRIG; - resetEditMode(); - } else { - right_trigger = 255; - rt_id = event.getPointerId(i); - } - } else { - if (editVjoyMode) { - selectedVjoyElement = getElementIdFromButtonId(j); - resetEditMode(); - } else if (vjoy[j][4] == VJoy.key_CONT_FFORWARD) - fastForward = true; - else - rv &= ~(int)vjoy[j][4]; - } - } - } - } - } else if (vjoy_enabled[11]) { - // Analog stick - if (x < vjoy[11][0]) - x = vjoy[11][0]; - else if (x > (vjoy[11][0] + vjoy[11][2])) - x = vjoy[11][0] + vjoy[11][2]; - - if (y < vjoy[11][1]) - y = vjoy[11][1]; - else if (y > (vjoy[11][1] + vjoy[11][3])) - y = vjoy[11][1] + vjoy[11][3]; - - int j = 11; - vjoy[j + 1][0] = x - vjoy[j + 1][2] / 2; - vjoy[j + 1][1] = y - vjoy[j + 1][3] / 2; - - JNIdc.vjoy(j + 1, vjoy[j + 1][0], vjoy[j + 1][1], vjoy[j + 1][2], vjoy[j + 1][3]); - - } - } - - for (int j = 0; j < vjoy.length; j++) { - if (vjoy[j][5] == 2) - vjoy[j][5] = 1; - else if (vjoy[j][5] == 1) - vjoy[j][5] = 0; - } - } - - switch(aid) + int actionIndex = event.getActionIndex(); + switch (event.getActionMasked()) { case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: - selectedVjoyElement = -1; - reset_analog(); - anal_id = -1; - rv = 0xFFFFFFFF; - fastForward = false; - right_trigger = 0; - left_trigger = 0; - lt_id = -1; - rt_id = -1; - for (int j= 0 ;j < vjoy.length; j++) - vjoy[j][5] = 0; - mouse_btns = 0; + // Release all + pidToControlId.clear(); + joyPointerId = -1; + InputDeviceManager.getInstance().virtualReleaseAll(); break; - case MotionEvent.ACTION_POINTER_UP: - if (event.getPointerId(event.getActionIndex())==anal_id) - { - reset_analog(); - anal_id = -1; - } - else if (event.getPointerId(event.getActionIndex())==lt_id) - { - left_trigger = 0; - lt_id = -1; - } - else if (event.getPointerId(event.getActionIndex())==rt_id) + case MotionEvent.ACTION_DOWN: + // First release all + pidToControlId.clear(); + joyPointerId = -1; + InputDeviceManager.getInstance().virtualReleaseAll(); + // Release the mouse too + mousePid = -1; + mouseButtons = 0; + InputDeviceManager.getInstance().mouseEvent(mousePos[0], mousePos[1], mouseButtons); + // Then fall through + case MotionEvent.ACTION_POINTER_DOWN: + { + Point p = new Point(event.getX(actionIndex), event.getY(actionIndex)); + p = translateCoords(p, new Point(width, height)); + int control = VGamepad.hitTest(p.x, p.y); + if (control != -1) { - right_trigger = 0; - rt_id = -1; + int pid = event.getPointerId(actionIndex); + if (control == CTLID_ANARING || control == CTLID_ANASTICK) + { + if (joyPointerId == -1) + { + // Analog stick down + joyPointerId = pid; + joyBiasX = p.x; + joyBiasY = p.y; + InputDeviceManager.getInstance().virtualJoystick(0, 0); + return true; + } + } + else + { + // Button down + InputDeviceManager.getInstance().virtualButtonInput(control, true); + pidToControlId.put(pid, control); + vibratorThread.click(); + return true; + } } break; + } - case MotionEvent.ACTION_POINTER_DOWN: - case MotionEvent.ACTION_DOWN: - if (event.getPointerCount() != 1) - { - mouse_btns = 0; - } - else + case MotionEvent.ACTION_MOVE: + for (int i = 0; i < event.getPointerCount(); i++) { - mouse_pos[0] = Math.round(event.getX()); - mouse_pos[1] = Math.round(event.getY()); - mouse_btns = MotionEvent.BUTTON_PRIMARY; // Mouse left button down + int pid = event.getPointerId(i); + Point p = new Point(event.getX(i), event.getY(i)); + p = translateCoords(p, new Point(width, height)); + if (joyPointerId == pid) + { + // Analog stick + float dx = p.x - joyBiasX; + float dy = p.y - joyBiasY; + float sz = VGamepad.getControlWidth(CTLID_ANASTICK); + dx = Math.max(Math.min(1.f, dx / sz), -1.f); + dy = Math.max(Math.min(1.f, dy / sz), -1.f); + InputDeviceManager.getInstance().virtualJoystick(dx, dy); + continue; + } + // Buttons + int control = VGamepad.hitTest(p.x, p.y); + int oldControl = pidToControlId.containsKey(pid) ? pidToControlId.get(pid) : -1; + if (oldControl == control) + // same button still pressed, or none at all + continue; + if (oldControl != -1) { + // Previous button up + InputDeviceManager.getInstance().virtualButtonInput(oldControl, false); + pidToControlId.remove(pid); + } + if (control != -1 && control != CTLID_ANARING && control != CTLID_ANASTICK) + { + // New button down + InputDeviceManager.getInstance().virtualButtonInput(control, true); + pidToControlId.put(pid, control); + vibratorThread.click(); + } } break; - case MotionEvent.ACTION_MOVE: - if (event.getPointerCount() == 1) + case MotionEvent.ACTION_POINTER_UP: + { + int pid = event.getPointerId(actionIndex); + if (joyPointerId == pid) + { + // Analog up + InputDeviceManager.getInstance().virtualJoystick(0, 0); + joyPointerId = -1; + return true; + } + if (pidToControlId.containsKey(pid)) { - mouse_pos[0] = Math.round(event.getX()); - mouse_pos[1] = Math.round(event.getY()); + // Button up + int controlId = pidToControlId.get(pid); + InputDeviceManager.getInstance().virtualButtonInput(controlId, false); + return true; } break; - } - int joyx = get_anal(11, 0); - int joyy = get_anal(11, 1); - InputDeviceManager.getInstance().virtualGamepadEvent(rv, joyx, joyy, left_trigger, right_trigger, fastForward); - // Only register the mouse event if no virtual gamepad button is down - if (!editVjoyMode && ((rv == 0xFFFFFFFF && left_trigger == 0 && right_trigger == 0 && joyx == 0 && joyy == 0 && !fastForward) - || JNIdc.guiIsOpen())) - InputDeviceManager.getInstance().mouseEvent(mouse_pos[0], mouse_pos[1], mouse_btns); - return(true); - } - - public void setEditVjoyMode(boolean editVjoyMode) { - this.editVjoyMode = editVjoyMode; - selectedVjoyElement = -1; - if (editVjoyMode) { - this.handler.removeCallbacks(hideVGamepadRunnable); - Arrays.fill(vjoy_enabled, true); - } - resetEditMode(); - } - - public void enableVjoy(boolean[] state) { - vjoy_enabled = state; - } - - private class OscOnScaleGestureListener extends - ScaleGestureDetector.SimpleOnScaleGestureListener { - - @Override - public boolean onScale(ScaleGestureDetector detector) { - if (editVjoyMode && selectedVjoyElement != -1) { - vjoy_d_custom[selectedVjoyElement][2] *= detector.getScaleFactor(); - view.requestLayout(); - - return true; } - - return false; } + return touchMouseEvent(event); + } - @Override - public void onScaleEnd(ScaleGestureDetector detector) { - selectedVjoyElement = -1; - } + @Override + public void show() + { + VGamepad.show(); + this.handler.removeCallbacks(hideVGamepadRunnable); + this.handler.postDelayed(hideVGamepadRunnable, 10000); } } diff --git a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/periph/InputDeviceManager.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/periph/InputDeviceManager.java index a8078f0634..09947d9440 100644 --- a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/periph/InputDeviceManager.java +++ b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/periph/InputDeviceManager.java @@ -24,6 +24,8 @@ public final class InputDeviceManager implements InputManager.InputDeviceListene private InputManager inputManager; private int maple_port = 0; + private boolean hasTouchscreen = false; + private static class VibrationParams { float power; float inclination; @@ -39,9 +41,10 @@ public InputDeviceManager() public void startListening(Context applicationContext) { maple_port = 0; - if (applicationContext.getPackageManager().hasSystemFeature("android.hardware.touchscreen")) - joystickAdded(VIRTUAL_GAMEPAD_ID, "Virtual Gamepad", 0, "virtual_gamepad_uid", - new int[0], new int[0], getVibrator(VIRTUAL_GAMEPAD_ID) != null); + hasTouchscreen = applicationContext.getPackageManager().hasSystemFeature("android.hardware.touchscreen"); + if (hasTouchscreen) + joystickAdded(VIRTUAL_GAMEPAD_ID, null, 0, null, + null, null, getVibrator(VIRTUAL_GAMEPAD_ID) != null); int[] ids = InputDevice.getDeviceIds(); for (int id : ids) onInputDeviceAdded(id); @@ -202,12 +205,18 @@ public void stopRumble() } } + public boolean hasTouchscreen() { + return hasTouchscreen; + } + public static InputDeviceManager getInstance() { return INSTANCE; } public native void init(); - public native void virtualGamepadEvent(int kcode, int joyx, int joyy, int lt, int rt, boolean fastForward); + public native void virtualReleaseAll(); + public native void virtualJoystick(float x, float y); + public native void virtualButtonInput(int key, boolean pressed); public native boolean joystickButtonEvent(int id, int button, boolean pressed); public native boolean joystickAxisEvent(int id, int button, int value); public native void mouseEvent(int xpos, int ypos, int buttons); @@ -216,4 +225,5 @@ public static InputDeviceManager getInstance() { private native void joystickRemoved(int id); public native boolean keyboardEvent(int key, boolean pressed); public native void keyboardText(int c); + public static native boolean isMicPluggedIn(); } diff --git a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/periph/VJoy.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/periph/VJoy.java deleted file mode 100644 index c94950aed8..0000000000 --- a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/periph/VJoy.java +++ /dev/null @@ -1,219 +0,0 @@ -package com.flycast.emulator.periph; - -import android.content.Context; -import android.content.SharedPreferences; -import android.preference.PreferenceManager; - -public class VJoy { - - public static final int key_CONT_C = 0x0001; - public static final int key_CONT_B = 0x0002; - public static final int key_CONT_A = 0x0004; - public static final int key_CONT_START = 0x0008; - public static final int key_CONT_DPAD_UP = 0x0010; - public static final int key_CONT_DPAD_DOWN = 0x0020; - public static final int key_CONT_DPAD_LEFT = 0x0040; - public static final int key_CONT_DPAD_RIGHT = 0x0080; - public static final int key_CONT_Y = 0x0200; - public static final int key_CONT_X = 0x0400; - public static final int key_CONT_FFORWARD = 0x3000002; - - public static final int BTN_LTRIG = -1; - public static final int BTN_RTRIG = -2; - public static final int BTN_ANARING = -3; - public static final int BTN_ANAPOINT = -4; - - public static final int ELEM_NONE = -1; - public static final int ELEM_DPAD = 0; - public static final int ELEM_BUTTONS = 1; - public static final int ELEM_START = 2; - public static final int ELEM_LTRIG = 3; - public static final int ELEM_RTRIG = 4; - public static final int ELEM_ANALOG = 5; - public static final int ELEM_FFORWARD = 6; - - public static int VJoyCount = 14; - - public static float[][] baseVJoy() { - return new float[][] { - new float[] { 24, 24+64, 64,64, key_CONT_DPAD_LEFT, 0}, - new float[] { 24+64, 24, 64,64, key_CONT_DPAD_UP, 0}, - new float[] { 24+128, 24+64, 64,64, key_CONT_DPAD_RIGHT, 0}, - new float[] { 24+64, 24+128, 64,64, key_CONT_DPAD_DOWN, 0}, - - new float[] { 440, 280+64, 64,64, key_CONT_X, 0}, - new float[] { 440+64, 280, 64,64, key_CONT_Y, 0}, - new float[] { 440+128, 280+64, 64,64, key_CONT_B, 0}, - new float[] { 440+64, 280+128,64,64, key_CONT_A, 0}, - - new float[] { 320-32, 360+32, 64,64, key_CONT_START, 0}, - - new float[] { 440, 200, 90,64, BTN_LTRIG, 0}, // LT - new float[] { 542, 200, 90,64, BTN_RTRIG, 0}, // RT - - new float[] { 0, 128+224,128,128,BTN_ANARING, 0}, // Analog ring - new float[] { 32, 128+256,64,64, BTN_ANAPOINT, 0}, // Analog point - - new float[] { 320-32, 12, 64,64, key_CONT_FFORWARD, 0}, // Fast-forward - - new float[] { 20, 288, 64,64, key_CONT_DPAD_LEFT|key_CONT_DPAD_UP, 0}, // DPad diagonals - new float[] { 20+128, 288, 64,64, key_CONT_DPAD_RIGHT|key_CONT_DPAD_UP, 0}, - new float[] { 20, 288+128,64,64, key_CONT_DPAD_LEFT|key_CONT_DPAD_DOWN, 0}, - new float[] { 20+128, 288+128,64,64, key_CONT_DPAD_RIGHT|key_CONT_DPAD_DOWN, 0}, - }; - } - - public static float[][] readCustomVjoyValues(Context context) { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - - return new float[][] { - // x-shift, y-shift, sizing-factor - new float[] { prefs.getFloat("touch_x_shift_dpad", 0), - prefs.getFloat("touch_y_shift_dpad", 0), - prefs.getFloat("touch_scale_dpad", 1) - }, // DPAD - new float[] { prefs.getFloat("touch_x_shift_buttons", 0), - prefs.getFloat("touch_y_shift_buttons", 0), - prefs.getFloat("touch_scale_buttons", 1) - }, // X, Y, B, A Buttons - new float[] { prefs.getFloat("touch_x_shift_start", 0), - prefs.getFloat("touch_y_shift_start", 0), - prefs.getFloat("touch_scale_start", 1) - }, // Start - new float[] { prefs.getFloat("touch_x_shift_left_trigger", 0), - prefs.getFloat("touch_y_shift_left_trigger", 0), - prefs.getFloat("touch_scale_left_trigger", 1) - }, // Left Trigger - new float[] { prefs.getFloat("touch_x_shift_right_trigger", 0), - prefs.getFloat("touch_y_shift_right_trigger", 0), - prefs.getFloat("touch_scale_right_trigger", 1) - }, // Right Trigger - new float[] { prefs.getFloat("touch_x_shift_analog", 0), - prefs.getFloat("touch_y_shift_analog", 0), - prefs.getFloat("touch_scale_analog", 1) - }, // Analog Stick - new float[] { prefs.getFloat("touch_x_shift_fforward", 0), - prefs.getFloat("touch_y_shift_fforward", 0), - prefs.getFloat("touch_scale_fforward", 1) - } // Fast-forward - }; - } - - public static float[][] getVjoy_d(float[][] vjoy_d_custom) { - return new float[][] { - // LEFT, UP, RIGHT, DOWN - new float[] { 20+0*vjoy_d_custom[0][2]+vjoy_d_custom[0][0], 288+64*vjoy_d_custom[0][2]+vjoy_d_custom[0][1], - 64*vjoy_d_custom[0][2],64*vjoy_d_custom[0][2], key_CONT_DPAD_LEFT}, - new float[] { 20+64*vjoy_d_custom[0][2]+vjoy_d_custom[0][0], 288+0*vjoy_d_custom[0][2]+vjoy_d_custom[0][1], - 64*vjoy_d_custom[0][2],64*vjoy_d_custom[0][2], key_CONT_DPAD_UP}, - new float[] { 20+128*vjoy_d_custom[0][2]+vjoy_d_custom[0][0], 288+64*vjoy_d_custom[0][2]+vjoy_d_custom[0][1], - 64*vjoy_d_custom[0][2],64*vjoy_d_custom[0][2], key_CONT_DPAD_RIGHT}, - new float[] { 20+64*vjoy_d_custom[0][2]+vjoy_d_custom[0][0], 288+128*vjoy_d_custom[0][2]+vjoy_d_custom[0][1], - 64*vjoy_d_custom[0][2],64*vjoy_d_custom[0][2], key_CONT_DPAD_DOWN}, - - // X, Y, B, A - new float[] { 448+0*vjoy_d_custom[1][2]+vjoy_d_custom[1][0], 288+64*vjoy_d_custom[1][2]+vjoy_d_custom[1][1], - 64*vjoy_d_custom[1][2],64*vjoy_d_custom[1][2], key_CONT_X}, - new float[] { 448+64*vjoy_d_custom[1][2]+vjoy_d_custom[1][0], 288+0*vjoy_d_custom[1][2]+vjoy_d_custom[1][1], - 64*vjoy_d_custom[1][2],64*vjoy_d_custom[1][2], key_CONT_Y}, - new float[] { 448+128*vjoy_d_custom[1][2]+vjoy_d_custom[1][0], 288+64*vjoy_d_custom[1][2]+vjoy_d_custom[1][1], - 64*vjoy_d_custom[1][2],64*vjoy_d_custom[1][2], key_CONT_B}, - new float[] { 448+64*vjoy_d_custom[1][2]+vjoy_d_custom[1][0], 288+128*vjoy_d_custom[1][2]+vjoy_d_custom[1][1], - 64*vjoy_d_custom[1][2],64*vjoy_d_custom[1][2], key_CONT_A}, - - // START - new float[] { 320-32+vjoy_d_custom[2][0], 288+128+vjoy_d_custom[2][1], - 64*vjoy_d_custom[2][2],64*vjoy_d_custom[2][2], key_CONT_START}, - - // LT, RT - new float[] { 440+vjoy_d_custom[3][0], 200+vjoy_d_custom[3][1], - 90*vjoy_d_custom[3][2],64*vjoy_d_custom[3][2], -1}, - new float[] { 542+vjoy_d_custom[4][0], 200+vjoy_d_custom[4][1], - 90*vjoy_d_custom[4][2],64*vjoy_d_custom[4][2], -2}, - - // Analog ring and point - new float[] { 16+vjoy_d_custom[5][0], 24+32+vjoy_d_custom[5][1], - 128*vjoy_d_custom[5][2],128*vjoy_d_custom[5][2],-3}, - new float[] { 48+vjoy_d_custom[5][0], 24+64+vjoy_d_custom[5][1], - 64*vjoy_d_custom[5][2],64*vjoy_d_custom[5][2], -4}, - - // Fast-forward - new float[] { 320-32+vjoy_d_custom[6][0], 12+vjoy_d_custom[6][1], - 64*vjoy_d_custom[6][2],64*vjoy_d_custom[6][2], -5}, - - // DPad diagonals - new float[] { 20+0*vjoy_d_custom[0][2]+vjoy_d_custom[0][0], 288+0*vjoy_d_custom[0][2]+vjoy_d_custom[0][1], - 64*vjoy_d_custom[0][2],64*vjoy_d_custom[0][2], key_CONT_DPAD_LEFT|key_CONT_DPAD_UP}, - new float[] { 20+128*vjoy_d_custom[0][2]+vjoy_d_custom[0][0], 288+0*vjoy_d_custom[0][2]+vjoy_d_custom[0][1], - 64*vjoy_d_custom[0][2],64*vjoy_d_custom[0][2], key_CONT_DPAD_RIGHT|key_CONT_DPAD_UP}, - new float[] { 20+0*vjoy_d_custom[0][2]+vjoy_d_custom[0][0], 288+128*vjoy_d_custom[0][2]+vjoy_d_custom[0][1], - 64*vjoy_d_custom[0][2],64*vjoy_d_custom[0][2], key_CONT_DPAD_LEFT|key_CONT_DPAD_DOWN}, - new float[] { 20+128*vjoy_d_custom[0][2]+vjoy_d_custom[0][0], 288+128*vjoy_d_custom[0][2]+vjoy_d_custom[0][1], - 64*vjoy_d_custom[0][2],64*vjoy_d_custom[0][2], key_CONT_DPAD_RIGHT|key_CONT_DPAD_DOWN}, - }; - } - - public static void writeCustomVjoyValues(float[][] vjoy_d_custom, Context context) { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - - prefs.edit().putFloat("touch_x_shift_dpad", vjoy_d_custom[0][0]).apply(); - prefs.edit().putFloat("touch_y_shift_dpad", vjoy_d_custom[0][1]).apply(); - prefs.edit().putFloat("touch_scale_dpad", vjoy_d_custom[0][2]).apply(); - - prefs.edit().putFloat("touch_x_shift_buttons", vjoy_d_custom[1][0]).apply(); - prefs.edit().putFloat("touch_y_shift_buttons", vjoy_d_custom[1][1]).apply(); - prefs.edit().putFloat("touch_scale_buttons", vjoy_d_custom[1][2]).apply(); - - prefs.edit().putFloat("touch_x_shift_start", vjoy_d_custom[2][0]).apply(); - prefs.edit().putFloat("touch_y_shift_start", vjoy_d_custom[2][1]).apply(); - prefs.edit().putFloat("touch_scale_start", vjoy_d_custom[2][2]).apply(); - - prefs.edit().putFloat("touch_x_shift_left_trigger", vjoy_d_custom[3][0]).apply(); - prefs.edit().putFloat("touch_y_shift_left_trigger", vjoy_d_custom[3][1]).apply(); - prefs.edit().putFloat("touch_scale_left_trigger", vjoy_d_custom[3][2]).apply(); - - prefs.edit().putFloat("touch_x_shift_right_trigger", vjoy_d_custom[4][0]).apply(); - prefs.edit().putFloat("touch_y_shift_right_trigger", vjoy_d_custom[4][1]).apply(); - prefs.edit().putFloat("touch_scale_right_trigger", vjoy_d_custom[4][2]).apply(); - - prefs.edit().putFloat("touch_x_shift_analog", vjoy_d_custom[5][0]).apply(); - prefs.edit().putFloat("touch_y_shift_analog", vjoy_d_custom[5][1]).apply(); - prefs.edit().putFloat("touch_scale_analog", vjoy_d_custom[5][2]).apply(); - - prefs.edit().putFloat("touch_x_shift_fforward", vjoy_d_custom[6][0]).apply(); - prefs.edit().putFloat("touch_y_shift_fforward", vjoy_d_custom[6][1]).apply(); - prefs.edit().putFloat("touch_scale_fforward", vjoy_d_custom[6][2]).apply(); - } - - public static void resetCustomVjoyValues(Context context) { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - - prefs.edit().remove("touch_x_shift_dpad").apply(); - prefs.edit().remove("touch_y_shift_dpad").apply(); - prefs.edit().remove("touch_scale_dpad").apply(); - - prefs.edit().remove("touch_x_shift_buttons").apply(); - prefs.edit().remove("touch_y_shift_buttons").apply(); - prefs.edit().remove("touch_scale_buttons").apply(); - - prefs.edit().remove("touch_x_shift_start").apply(); - prefs.edit().remove("touch_y_shift_start").apply(); - prefs.edit().remove("touch_scale_start").apply(); - - prefs.edit().remove("touch_x_shift_left_trigger").apply(); - prefs.edit().remove("touch_y_shift_left_trigger").apply(); - prefs.edit().remove("touch_scale_left_trigger").apply(); - - prefs.edit().remove("touch_x_shift_right_trigger").apply(); - prefs.edit().remove("touch_y_shift_right_trigger").apply(); - prefs.edit().remove("touch_scale_right_trigger").apply(); - - prefs.edit().remove("touch_x_shift_analog").apply(); - prefs.edit().remove("touch_y_shift_analog").apply(); - prefs.edit().remove("touch_scale_analog").apply(); - - prefs.edit().remove("touch_x_shift_fforward").apply(); - prefs.edit().remove("touch_y_shift_fforward").apply(); - prefs.edit().remove("touch_scale_fforward").apply(); - } -} diff --git a/shell/android-studio/flycast/src/main/jni/src/Android.cpp b/shell/android-studio/flycast/src/main/jni/src/Android.cpp index 3fa0fabc87..50bbd45e36 100644 --- a/shell/android-studio/flycast/src/main/jni/src/Android.cpp +++ b/shell/android-studio/flycast/src/main/jni/src/Android.cpp @@ -1,12 +1,8 @@ #include "types.h" -#include "hw/maple/maple_cfg.h" -#include "hw/maple/maple_devs.h" -#include "hw/maple/maple_if.h" #include "hw/naomi/naomi_cart.h" #include "audio/audiostream.h" #include "imgread/common.h" #include "ui/gui.h" -#include "ui/vgamepad.h" #include "rend/osd.h" #include "cfg/cfg.h" #include "log/LogManager.h" @@ -39,24 +35,14 @@ namespace jni thread_local JVMAttacher jvm_attacher; } -#include "android_gamepad.h" -#include "android_keyboard.h" #include "http_client.h" -extern "C" JNIEXPORT jint JNICALL Java_com_flycast_emulator_emu_JNIdc_getVirtualGamepadVibration(JNIEnv *env, jobject obj) -{ - return (jint)config::VirtualGamepadVibration; -} - extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_emu_JNIdc_screenCharacteristics(JNIEnv *env, jobject obj, jfloat screenDpi, jfloat refreshRate) { settings.display.dpi = screenDpi; settings.display.refreshRate = refreshRate; } -std::shared_ptr mouse; -std::shared_ptr keyboard; - static bool game_started; //stuff for saving prefs @@ -65,12 +51,10 @@ jmethodID saveAndroidSettingsMid; static ANativeWindow *g_window = 0; // Activity -static jobject g_activity; -static jmethodID VJoyStartEditingMID; -static jmethodID VJoyStopEditingMID; -static jmethodID VJoyResetEditingMID; -static jmethodID VJoyEnableControlsMID; -static jmethodID showScreenKeyboardMid; +jobject g_activity; +extern jmethodID VJoyStartEditingMID; +extern jmethodID VJoyStopEditingMID; +extern jmethodID showScreenKeyboardMid; static jmethodID onGameStateChangeMid; static void emuEventCallback(Event event, void *) @@ -353,42 +337,6 @@ extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_emu_JNIdc_rendinitNa } } -extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_emu_JNIdc_vjoy(JNIEnv * env, jobject obj,int id,float x, float y, float w, float h) -{ - vgamepad::setPosition(static_cast(id), x, y, w, h); -} - -extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_emu_JNIdc_showVirtualGamepad(JNIEnv * env, jobject obj) -{ - vgamepad::show(); -} - -extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_emu_JNIdc_hideVirtualGamepad(JNIEnv * env, jobject obj) -{ - vgamepad::hide(); -} - -extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_emu_JNIdc_getControllers(JNIEnv *env, jobject obj, jintArray controllers, jobjectArray peripherals) -{ - // might be called before JNIdc.initEnvironment() - if (g_jvm == NULL) - env->GetJavaVM(&g_jvm); - - jni::IntArray jcontrollers(controllers, false); - std::vector devs; - for (u32 i = 0; i < config::MapleMainDevices.size(); i++) - devs.push_back((MapleDeviceType)config::MapleMainDevices[i]); - jcontrollers.setData(devs.data()); - - jni::ObjectArray jperipherals(peripherals, false); - int obj_len = jperipherals.size(); - for (int i = 0; i < obj_len; ++i) - { - std::vector devs { (MapleDeviceType)config::MapleExpansionDevices[i][0], (MapleDeviceType)config::MapleExpansionDevices[i][1] }; - jperipherals[i].setData(devs.data()); - } -} - extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_emu_JNIdc_guiOpenSettings(JNIEnv *env, jobject obj) { gui_open_settings(); @@ -495,92 +443,6 @@ void SaveAndroidSettings() jni::env()->CallVoidMethod(g_emulator, saveAndroidSettingsMid, (jstring)homeDirectory); } -extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_init(JNIEnv *env, jobject obj) -{ - input_device_manager = env->NewGlobalRef(obj); - input_device_manager_rumble = env->GetMethodID(env->GetObjectClass(obj), "rumble", "(IFFI)Z"); - // FIXME Don't connect it by default or any screen touch will register as button A press - mouse = std::make_shared(-1); - GamepadDevice::Register(mouse); - keyboard = std::make_shared(); - GamepadDevice::Register(keyboard); - gui_setOnScreenKeyboardCallback([](bool show) { - if (g_activity != nullptr) - jni::env()->CallVoidMethod(g_activity, showScreenKeyboardMid, show); - }); -} - -extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_joystickAdded(JNIEnv *env, jobject obj, jint id, jstring name, - jint maple_port, jstring junique_id, jintArray fullAxes, jintArray halfAxes, jboolean hasRumble) -{ - std::string joyname = jni::String(name, false); - std::string unique_id = jni::String(junique_id, false); - std::vector full = jni::IntArray(fullAxes, false); - std::vector half = jni::IntArray(halfAxes, false); - - std::shared_ptr gamepad = std::make_shared(maple_port, id, joyname.c_str(), unique_id.c_str(), full, half); - AndroidGamepadDevice::AddAndroidGamepad(gamepad); - gamepad->setRumbleEnabled(hasRumble); -} -extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_joystickRemoved(JNIEnv *env, jobject obj, jint id) -{ - std::shared_ptr device = AndroidGamepadDevice::GetAndroidGamepad(id); - if (device != NULL) - AndroidGamepadDevice::RemoveAndroidGamepad(device); -} - -extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_virtualGamepadEvent(JNIEnv *env, jobject obj, jint kcode, jint joyx, jint joyy, jint lt, jint rt, jboolean fastForward) -{ - std::shared_ptr device = AndroidGamepadDevice::GetAndroidGamepad(AndroidGamepadDevice::VIRTUAL_GAMEPAD_ID); - if (device != NULL) - device->virtual_gamepad_event(kcode, joyx, joyy, lt, rt, fastForward); -} - -extern "C" JNIEXPORT jboolean JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_joystickButtonEvent(JNIEnv *env, jobject obj, jint id, jint key, jboolean pressed) -{ - std::shared_ptr device = AndroidGamepadDevice::GetAndroidGamepad(id); - if (device != NULL) - return device->gamepad_btn_input(key, pressed); - else - return false; - -} - -extern "C" JNIEXPORT jboolean JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_keyboardEvent(JNIEnv *env, jobject obj, jint key, jboolean pressed) -{ - keyboard->input(key, pressed); - return true; -} - -extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_keyboardText(JNIEnv *env, jobject obj, jint c) -{ - gui_keyboard_input((u16)c); -} - -static std::map, jint> previous_axis_values; - -extern "C" JNIEXPORT jboolean JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_joystickAxisEvent(JNIEnv *env, jobject obj, jint id, jint key, jint value) -{ - std::shared_ptr device = AndroidGamepadDevice::GetAndroidGamepad(id); - if (device != nullptr) - return device->gamepad_axis_input(key, value); - else - return false; -} - -extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_mouseEvent(JNIEnv *env, jobject obj, jint xpos, jint ypos, jint buttons) -{ - mouse->setAbsPos(xpos, ypos, settings.display.width, settings.display.height); - mouse->setButton(Mouse::LEFT_BUTTON, (buttons & 1) != 0); - mouse->setButton(Mouse::RIGHT_BUTTON, (buttons & 2) != 0); - mouse->setButton(Mouse::MIDDLE_BUTTON, (buttons & 4) != 0); -} - -extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_mouseScrollEvent(JNIEnv *env, jobject obj, jint scrollValue) -{ - mouse->setWheel(scrollValue); -} - extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_BaseGLActivity_register(JNIEnv *env, jobject obj, jobject activity) { if (g_activity != nullptr) { @@ -592,40 +454,12 @@ extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_BaseGLActivity_regis g_activity = env->NewGlobalRef(activity); jclass actClass = env->GetObjectClass(activity); VJoyStartEditingMID = env->GetMethodID(actClass, "VJoyStartEditing", "()V"); - VJoyStopEditingMID = env->GetMethodID(actClass, "VJoyStopEditing", "(Z)V"); - VJoyResetEditingMID = env->GetMethodID(actClass, "VJoyResetEditing", "()V"); - VJoyEnableControlsMID = env->GetMethodID(actClass, "VJoyEnableControls", "([Z)V"); + VJoyStopEditingMID = env->GetMethodID(actClass, "VJoyStopEditing", "()V"); showScreenKeyboardMid = env->GetMethodID(actClass, "showScreenKeyboard", "(Z)V"); onGameStateChangeMid = env->GetMethodID(actClass, "onGameStateChange", "(Z)V"); } } -namespace vgamepad -{ - -void startEditing() { - enableAllControls(); - jni::env()->CallVoidMethod(g_activity, VJoyStartEditingMID); -} -void pauseEditing() { - stopEditing(false); -} -void resetEditing() { - jni::env()->CallVoidMethod(g_activity, VJoyResetEditingMID); -} -void stopEditing(bool canceled) { - jni::env()->CallVoidMethod(g_activity, VJoyStopEditingMID, canceled); -} - -void setEnabledControls(bool enabled[_Count]) -{ - jni::BooleanArray jb{_Count}; - jb.setData(enabled, 0, _Count); - jni::env()->CallVoidMethod(g_activity, VJoyEnableControlsMID, (jbooleanArray)jb); -} - -} - void enableNetworkBroadcast(bool enable) { JNIEnv *env = jni::env(); diff --git a/shell/android-studio/flycast/src/main/jni/src/android_gamepad.h b/shell/android-studio/flycast/src/main/jni/src/android_gamepad.h index 2208b741c1..79d1cf9850 100644 --- a/shell/android-studio/flycast/src/main/jni/src/android_gamepad.h +++ b/shell/android-studio/flycast/src/main/jni/src/android_gamepad.h @@ -20,6 +20,7 @@ #include "input/gamepad_device.h" #include "input/mouse.h" +#include "input/virtual_gamepad.h" #include "jni_util.h" #include @@ -97,26 +98,18 @@ class AndroidGamepadDevice : public GamepadDevice public: AndroidGamepadDevice(int maple_port, int id, const char *name, const char *unique_id, const std::vector& fullAxes, const std::vector& halfAxes) - : GamepadDevice(maple_port, "Android", id != VIRTUAL_GAMEPAD_ID), android_id(id), + : GamepadDevice(maple_port, "Android"), android_id(id), fullAxes(fullAxes), halfAxes(halfAxes) { _name = name; _unique_id = unique_id; INFO_LOG(INPUT, "Android: Opened joystick %d on port %d: '%s' descriptor '%s'", id, maple_port, _name.c_str(), _unique_id.c_str()); - if (id == VIRTUAL_GAMEPAD_ID) - { - input_mapper = std::make_shared(); - // hasAnalogStick = true; // TODO has an analog stick but input mapping isn't persisted - } - else - { - loadMapping(); - save_mapping(); - hasAnalogStick = !fullAxes.empty(); - } + + loadMapping(); + save_mapping(); + hasAnalogStick = !fullAxes.empty(); } - ~AndroidGamepadDevice() override - { + ~AndroidGamepadDevice() override { INFO_LOG(INPUT, "Android: Joystick '%s' on port %d disconnected", _name.c_str(), maple_port()); } @@ -247,66 +240,6 @@ class AndroidGamepadDevice : public GamepadDevice GamepadDevice::Unregister(gamepad); }; - void virtual_gamepad_event(int kcode, int joyx, int joyy, int lt, int rt, bool fastForward) - { - // No virtual gamepad when the GUI is open: touch events only - if (gui_is_open() && gui_state != GuiState::VJoyEdit) - { - kcode = 0xffffffff; - joyx = joyy = rt = lt = 0; - } - if (settings.platform.isArcade()) - { - if (rt > 0) - { - if ((kcode & DC_BTN_A) == 0) - // RT + A -> D (coin) - kcode &= ~DC_BTN_D; - if ((kcode & DC_BTN_B) == 0) - // RT + B -> Service - kcode &= ~DC_DPAD2_UP; - if ((kcode & DC_BTN_X) == 0) - // RT + X -> Test - kcode &= ~DC_DPAD2_DOWN; - } - // arcade mapping: X -> btn2, Y -> btn3 - if ((kcode & DC_BTN_X) == 0) - { - kcode &= ~DC_BTN_C; - kcode |= DC_BTN_X; - } - if ((kcode & DC_BTN_Y) == 0) - { - kcode &= ~DC_BTN_X; - kcode |= DC_BTN_Y; - } - if (rt > 0) - // naomi btn4 - kcode &= ~DC_BTN_Y; - if (lt > 0) - // naomi btn5 - kcode &= ~DC_BTN_Z; - } - u32 changes = kcode ^ previous_kcode; - for (int i = 0; i < 32; i++) - if (changes & (1 << i)) - gamepad_btn_input(1 << i, (kcode & (1 << i)) == 0); - if (joyx >= 0) - gamepad_axis_input(DC_AXIS_RIGHT, joyx | (joyx << 8)); - else - gamepad_axis_input(DC_AXIS_LEFT, -joyx | (-joyx << 8)); - if (joyy >= 0) - gamepad_axis_input(DC_AXIS_DOWN, joyy | (joyy << 8)); - else - gamepad_axis_input(DC_AXIS_UP, -joyy | (-joyy << 8)); - gamepad_axis_input(DC_AXIS_LT, lt == 0 ? 0 : 0x7fff); - gamepad_axis_input(DC_AXIS_RT, rt == 0 ? 0 : 0x7fff); - previous_kcode = kcode; - if (fastForward != previousFastForward) - gamepad_btn_input(EMU_BTN_FFORWARD, fastForward); - previousFastForward = fastForward; - } - void rumble(float power, float inclination, u32 duration_ms) override { power *= rumblePower / 100.f; @@ -317,8 +250,6 @@ class AndroidGamepadDevice : public GamepadDevice this->rumbleEnabled = rumbleEnabled; } - bool is_virtual_gamepad() override { return android_id == VIRTUAL_GAMEPAD_ID; } - bool hasHalfAxis(int axis) const { return std::find(halfAxes.begin(), halfAxes.end(), axis) != halfAxes.end(); } bool hasFullAxis(int axis) const { return std::find(fullAxes.begin(), fullAxes.end(), axis) != fullAxes.end(); } @@ -336,13 +267,9 @@ class AndroidGamepadDevice : public GamepadDevice input_mapper = std::make_shared>(*this); } - static const int VIRTUAL_GAMEPAD_ID = 0x12345678; // must match the Java definition - private: int android_id; static std::map> android_gamepads; - u32 previous_kcode = 0xffffffff; - bool previousFastForward = false; std::vector fullAxes; std::vector halfAxes; }; @@ -481,3 +408,19 @@ class AndroidMouse : public SystemMouse } }; +class AndroidVirtualGamepad : public VirtualGamepad +{ +public: + AndroidVirtualGamepad(bool rumbleEnabled) : VirtualGamepad("Android") { + this->rumbleEnabled = rumbleEnabled; + } + + void rumble(float power, float inclination, u32 duration_ms) override + { + power *= rumblePower / 100.f; + jboolean has_vibrator = jni::env()->CallBooleanMethod(input_device_manager, input_device_manager_rumble, GAMEPAD_ID, power, inclination, duration_ms); + rumbleEnabled = has_vibrator; + } + + static constexpr int GAMEPAD_ID = 0x12345678; // must match the Java definition +}; diff --git a/shell/android-studio/flycast/src/main/jni/src/android_input.cpp b/shell/android-studio/flycast/src/main/jni/src/android_input.cpp new file mode 100644 index 0000000000..2fde7d1a73 --- /dev/null +++ b/shell/android-studio/flycast/src/main/jni/src/android_input.cpp @@ -0,0 +1,225 @@ +/* + Copyright 2024 flyinghead + + This file is part of Flycast. + + Flycast is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Flycast. If not, see . +*/ +#include "android_gamepad.h" +#include "android_keyboard.h" +#include "ui/vgamepad.h" +#include "cfg/option.h" +#include "hw/maple/maple_if.h" + +std::shared_ptr mouse; +std::shared_ptr keyboard; +std::shared_ptr virtualGamepad; + +extern jobject g_activity; +jmethodID VJoyStartEditingMID; +jmethodID VJoyStopEditingMID; +jmethodID VJoyEnableControlsMID; +jmethodID showScreenKeyboardMid; + +// +// VGamepad +// +extern "C" JNIEXPORT jint JNICALL Java_com_flycast_emulator_emu_VGamepad_getVibrationPower(JNIEnv *env, jobject obj) { + return (jint)config::VirtualGamepadVibration; +} + +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_emu_VGamepad_show(JNIEnv * env, jobject obj) { + vgamepad::show(); +} + +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_emu_VGamepad_hide(JNIEnv * env, jobject obj) { + vgamepad::hide(); +} + +extern "C" JNIEXPORT jint JNICALL Java_com_flycast_emulator_emu_VGamepad_hitTest(JNIEnv * env, jobject obj, + jfloat x, jfloat y) { + return vgamepad::hitTest(x, y); +} + +extern "C" JNIEXPORT jfloat JNICALL Java_com_flycast_emulator_emu_VGamepad_getControlWidth(JNIEnv * env, jobject obj, + jint controlId) { + return vgamepad::getControlWidth(static_cast(controlId)); +} + +extern "C" JNIEXPORT jint JNICALL Java_com_flycast_emulator_emu_VGamepad_layoutHitTest(JNIEnv * env, jobject obj, + jfloat x, jfloat y) { + return vgamepad::layoutHitTest(x, y); +} + +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_emu_VGamepad_scaleElement(JNIEnv * env, jobject obj, + jint elemId, jfloat scale) { + vgamepad::scaleElement(static_cast(elemId), scale); +} + +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_emu_VGamepad_translateElement(JNIEnv * env, jobject obj, + jint elemId, jfloat x, jfloat y) { + vgamepad::translateElement(static_cast(elemId), x, y); +} + +namespace vgamepad +{ + +void startEditing() +{ + // FIXME code dup with vgamepad.cpp + enableAllControls(); + show(); + jni::env()->CallVoidMethod(g_activity, VJoyStartEditingMID); +} +void pauseEditing() { + // needed? could be used by iOS to avoid relying on gui state + jni::env()->CallVoidMethod(g_activity, VJoyStopEditingMID); +} +void stopEditing(bool canceled) +{ + // FIXME code dup with vgamepad.cpp + jni::env()->CallVoidMethod(g_activity, VJoyStopEditingMID); + if (canceled) + loadLayout(); + else + saveLayout(); +} + +} + +// +// InputDeviceManager +// +extern "C" JNIEXPORT jboolean JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_isMicPluggedIn(JNIEnv *env, jobject obj) +{ + for (const auto& devices : config::MapleExpansionDevices) + if (static_cast(devices[0]) == MDT_Microphone + || static_cast(devices[1]) == MDT_Microphone) + return true; + + return false; +} + +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_init(JNIEnv *env, jobject obj) +{ + input_device_manager = env->NewGlobalRef(obj); + input_device_manager_rumble = env->GetMethodID(env->GetObjectClass(obj), "rumble", "(IFFI)Z"); + // FIXME Don't connect it by default or any screen touch will register as button A press + mouse = std::make_shared(-1); + GamepadDevice::Register(mouse); + keyboard = std::make_shared(); + GamepadDevice::Register(keyboard); + gui_setOnScreenKeyboardCallback([](bool show) { + if (g_activity != nullptr) + jni::env()->CallVoidMethod(g_activity, showScreenKeyboardMid, show); + }); +} + +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_joystickAdded(JNIEnv *env, jobject obj, + jint id, jstring name, jint maple_port, jstring junique_id, jintArray fullAxes, jintArray halfAxes, jboolean hasRumble) +{ + if (id == AndroidVirtualGamepad::GAMEPAD_ID) { + virtualGamepad = std::make_shared(hasRumble); + GamepadDevice::Register(virtualGamepad); + } + else + { + std::string joyname = jni::String(name, false); + std::string unique_id = jni::String(junique_id, false); + std::vector full = jni::IntArray(fullAxes, false); + std::vector half = jni::IntArray(halfAxes, false); + + std::shared_ptr gamepad = std::make_shared(maple_port, id, joyname.c_str(), unique_id.c_str(), full, half); + AndroidGamepadDevice::AddAndroidGamepad(gamepad); + gamepad->setRumbleEnabled(hasRumble); + } +} + +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_joystickRemoved(JNIEnv *env, jobject obj, + jint id) +{ + if (id == AndroidVirtualGamepad::GAMEPAD_ID) { + GamepadDevice::Unregister(virtualGamepad); + virtualGamepad.reset(); + } + else { + std::shared_ptr device = AndroidGamepadDevice::GetAndroidGamepad(id); + if (device) + AndroidGamepadDevice::RemoveAndroidGamepad(device); + } +} + +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_virtualReleaseAll(JNIEnv *env, jobject obj) { + if (virtualGamepad) + virtualGamepad->releaseAll(); +} + +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_virtualJoystick(JNIEnv *env, jobject obj, + jfloat x, jfloat y) { + if (virtualGamepad) + virtualGamepad->joystickInput(x, y); +} + +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_virtualButtonInput(JNIEnv *env, jobject obj, + jint controlId, jboolean pressed) { + if (virtualGamepad) + virtualGamepad->buttonInput(static_cast(controlId), pressed); +} + +extern "C" JNIEXPORT jboolean JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_joystickButtonEvent(JNIEnv *env, jobject obj, + jint id, jint key, jboolean pressed) +{ + std::shared_ptr device = AndroidGamepadDevice::GetAndroidGamepad(id); + if (device != NULL) + return device->gamepad_btn_input(key, pressed); + else + return false; +} + +extern "C" JNIEXPORT jboolean JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_keyboardEvent(JNIEnv *env, jobject obj, + jint key, jboolean pressed) { + keyboard->input(key, pressed); + return true; +} + +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_keyboardText(JNIEnv *env, jobject obj, + jint c) { + gui_keyboard_input((u16)c); +} + +static std::map, jint> previous_axis_values; + +extern "C" JNIEXPORT jboolean JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_joystickAxisEvent(JNIEnv *env, jobject obj, + jint id, jint key, jint value) +{ + std::shared_ptr device = AndroidGamepadDevice::GetAndroidGamepad(id); + if (device != nullptr) + return device->gamepad_axis_input(key, value); + else + return false; +} + +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_mouseEvent(JNIEnv *env, jobject obj, + jint xpos, jint ypos, jint buttons) +{ + mouse->setAbsPos(xpos, ypos, settings.display.width, settings.display.height); + mouse->setButton(Mouse::LEFT_BUTTON, (buttons & 1) != 0); + mouse->setButton(Mouse::RIGHT_BUTTON, (buttons & 2) != 0); + mouse->setButton(Mouse::MIDDLE_BUTTON, (buttons & 4) != 0); +} + +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_mouseScrollEvent(JNIEnv *env, jobject obj, + jint scrollValue) { + mouse->setWheel(scrollValue); +} diff --git a/shell/android-studio/flycast/src/main/jni/src/jni_util.h b/shell/android-studio/flycast/src/main/jni/src/jni_util.h index 2fc0b992a6..73e57034d7 100644 --- a/shell/android-studio/flycast/src/main/jni/src/jni_util.h +++ b/shell/android-studio/flycast/src/main/jni/src/jni_util.h @@ -107,7 +107,7 @@ class Object bool isNull() const { return object == nullptr; } operator jobject() const { return object; } - Class getClass() const; + inline Class getClass() const; template T globalRef() { diff --git a/shell/apple/emulator-ios/emulator/PadViewController.mm b/shell/apple/emulator-ios/emulator/PadViewController.mm index 19b678ee59..97dedb34fd 100644 --- a/shell/apple/emulator-ios/emulator/PadViewController.mm +++ b/shell/apple/emulator-ios/emulator/PadViewController.mm @@ -65,7 +65,7 @@ - (void)showController:(UIView *)parentView - (void)hideController { - [self resetTouch]; + [self resetAnalog]; [hideTimer invalidate]; [self.view removeFromSuperview]; } @@ -89,12 +89,10 @@ -(void)hideTimer { vgamepad::hide(); } -- (void)resetTouch +- (void)resetAnalog { joyTouch = nil; - virtualGamepad->gamepad_axis_input(DC_AXIS_LEFT, 0); - virtualGamepad->gamepad_axis_input(DC_AXIS_UP, 0); - vgamepad::setAnalogStick(0, 0); + virtualGamepad->joystickInput(0, 0); } static CGPoint translateCoords(const CGPoint& pos, const CGSize& size) @@ -114,20 +112,20 @@ - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; CGPoint point = [touch locationInView:self.view]; point = translateCoords(point, self.view.bounds.size); vgamepad::ControlId control = vgamepad::hitTest(point.x, point.y); - if (joyTouch == nil && control == vgamepad::AnalogArea) + if (joyTouch == nil && (control == vgamepad::AnalogArea || control == vgamepad::AnalogStick)) { - [self resetTouch]; + [self resetAnalog]; joyTouch = touch; joyBias = point; continue; } NSValue *key = [NSValue valueWithPointer:(const void *)touch]; if (control != vgamepad::None && control != vgamepad::AnalogArea - && touchToButton[key] == nil) + && control != vgamepad::AnalogStick && touchToButton[key] == nil) { touchToButton[key] = [NSNumber numberWithInt:control]; // button down - virtualGamepad->gamepad_btn_input(vgamepad::controlToDcKey(control), true); + virtualGamepad->buttonInput(control, true); } } [super touchesBegan:touches withEvent:event]; @@ -138,7 +136,7 @@ - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; for (UITouch *touch in touches) { if (touch == joyTouch) { - [self resetTouch]; + [self resetAnalog]; continue; } NSValue *key = [NSValue valueWithPointer:(const void *)touch]; @@ -146,7 +144,7 @@ - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; if (control != nil) { [touchToButton removeObjectForKey:key]; // button up - virtualGamepad->gamepad_btn_input(vgamepad::controlToDcKey((vgamepad::ControlId)control.intValue), false); + virtualGamepad->buttonInput(static_cast(control.intValue), false); } } [super touchesEnded:touches withEvent:event]; @@ -166,17 +164,7 @@ - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; double sz = vgamepad::getControlWidth(vgamepad::AnalogStick); point.x = std::max(std::min(1.0, point.x / sz), -1.0); point.y = std::max(std::min(1.0, point.y / sz), -1.0); - vgamepad::setAnalogStick(point.x, point.y); - point.x *= 32767.0; - point.y *= 32767.0; - if (point.x >= 0) - virtualGamepad->gamepad_axis_input(DC_AXIS_RIGHT, (int)std::round(point.x)); - else - virtualGamepad->gamepad_axis_input(DC_AXIS_LEFT, -(int)std::round(point.x)); - if (point.y >= 0) - virtualGamepad->gamepad_axis_input(DC_AXIS_DOWN, (int)std::round(point.y)); - else - virtualGamepad->gamepad_axis_input(DC_AXIS_UP, -(int)std::round(point.y)); + virtualGamepad->joystickInput(point.x, point.y); continue; } vgamepad::ControlId control = vgamepad::hitTest(point.x, point.y); @@ -186,10 +174,10 @@ - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; continue; if (prevControl != nil && prevControl.intValue != vgamepad::None && prevControl.intValue != vgamepad::AnalogArea) { // button up - virtualGamepad->gamepad_btn_input(vgamepad::controlToDcKey((vgamepad::ControlId)prevControl.intValue), false); + virtualGamepad->buttonInput(static_cast(prevControl.intValue), false); } // button down - virtualGamepad->gamepad_btn_input(vgamepad::controlToDcKey(control), true); + virtualGamepad->buttonInput(control, true); touchToButton[key] = [NSNumber numberWithInt:control]; } [super touchesMoved:touches withEvent:event]; @@ -199,7 +187,7 @@ - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event; { for (UITouch *touch in touches) { if (touch == joyTouch) { - [self resetTouch]; + [self resetAnalog]; continue; } NSValue *key = [NSValue valueWithPointer:(const void *)touch]; @@ -207,7 +195,7 @@ - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event; if (control != nil) { [touchToButton removeObjectForKey:key]; // button up - virtualGamepad->gamepad_btn_input(vgamepad::controlToDcKey((vgamepad::ControlId)control.intValue), false); + virtualGamepad->buttonInput(static_cast(control.intValue), false); } } [super touchesCancelled:touches withEvent:event]; diff --git a/shell/apple/emulator-ios/emulator/ios_gamepad.h b/shell/apple/emulator-ios/emulator/ios_gamepad.h index 214744c3ea..e3aa0683a7 100644 --- a/shell/apple/emulator-ios/emulator/ios_gamepad.h +++ b/shell/apple/emulator-ios/emulator/ios_gamepad.h @@ -23,6 +23,7 @@ #include #include "input/gamepad_device.h" #include "input/mouse.h" +#include "input/virtual_gamepad.h" #include "ui/gui.h" enum IOSButton { @@ -480,110 +481,30 @@ class IOSGamepad : public GamepadDevice static std::map> controllers; }; -class IOSVirtualGamepad : public GamepadDevice +class IOSVirtualGamepad : public VirtualGamepad { public: - IOSVirtualGamepad() : GamepadDevice(0, "iOS", false) { - _name = "Virtual Gamepad"; - _unique_id = "ios-virtual-gamepad"; - input_mapper = std::make_shared(); - //hasAnalogStick = true; // TODO has an analog stick but input mapping isn't persisted + IOSVirtualGamepad() : VirtualGamepad("iOS") { } - bool is_virtual_gamepad() override { return true; } - - std::shared_ptr getDefaultMapping() override { - return std::make_shared>(); - } - - bool gamepad_btn_input(u32 code, bool pressed) override + bool handleButtonInput(u32& state, u32 key, bool pressed) override { - if (pressed) - buttonState |= code; - else - buttonState &= ~code; - switch (code) + if (!pressed + || (key != DC_DPAD_UP && key != DC_DPAD_DOWN && key != DC_DPAD_LEFT && key != DC_DPAD_RIGHT)) + return false; + if (((state | key) & (DC_DPAD_UP | DC_DPAD_DOWN)) == (DC_DPAD_UP | DC_DPAD_DOWN) + || ((state | key) & (DC_DPAD_LEFT | DC_DPAD_RIGHT)) == (DC_DPAD_LEFT | DC_DPAD_RIGHT)) { - case DC_AXIS_LT: - gamepad_axis_input(DC_AXIS_LT, pressed ? 0x7fff : 0); - if (settings.platform.isArcade()) - GamepadDevice::gamepad_btn_input(DC_BTN_Z, pressed); // btn5 - return true; - case DC_AXIS_RT: - if (!pressed && maple_port() >= 0 && maple_port() <= 3) - kcode[maple_port()] |= DC_DPAD2_UP | DC_BTN_D | DC_DPAD2_DOWN; - gamepad_axis_input(DC_AXIS_RT, pressed ? 0x7fff : 0); - if (settings.platform.isArcade()) - GamepadDevice::gamepad_btn_input(DC_BTN_Y, pressed); // btn4 - return true; - default: - if ((buttonState & (DC_DPAD_UP | DC_DPAD_DOWN)) == (DC_DPAD_UP | DC_DPAD_DOWN) - || (buttonState & (DC_DPAD_LEFT | DC_DPAD_RIGHT)) == (DC_DPAD_LEFT | DC_DPAD_RIGHT)) - { - GamepadDevice::gamepad_btn_input(DC_DPAD_UP, false); - GamepadDevice::gamepad_btn_input(DC_DPAD_DOWN, false); - GamepadDevice::gamepad_btn_input(DC_DPAD_LEFT, false); - GamepadDevice::gamepad_btn_input(DC_DPAD_RIGHT, false); - buttonState = 0; - gui_open_settings(); - return true; - } - if (settings.platform.isArcade() && maple_port() >= 0 && maple_port() <= 3) - { - u32& keycode = kcode[maple_port()]; - if ((buttonState & DC_AXIS_RT) != 0) - { - switch (code) { - case DC_BTN_A: - // RT + A -> D (coin) - keycode = pressed ? keycode & ~DC_BTN_D : keycode | DC_BTN_D; - break; - case DC_BTN_B: - // RT + B -> Service - keycode = pressed ? keycode & ~DC_DPAD2_UP : keycode | DC_DPAD2_UP; - break; - case DC_BTN_X: - // RT + X -> Test - keycode = pressed ? keycode & ~DC_DPAD2_DOWN : keycode | DC_DPAD2_DOWN; - break; - default: - break; - } - } - // arcade mapping: X -> btn2, Y -> btn3 - if (code == DC_BTN_X) - code = DC_BTN_C; // btn2 - if (code == DC_BTN_Y) - code = DC_BTN_X; // btn3 - } - switch (code) - { - case DC_DPAD_UP | DC_DPAD_RIGHT: - GamepadDevice::gamepad_btn_input(DC_DPAD_UP, pressed); - code = DC_DPAD_RIGHT; - break; - case DC_DPAD_DOWN | DC_DPAD_RIGHT: - GamepadDevice::gamepad_btn_input(DC_DPAD_DOWN, pressed); - code = DC_DPAD_RIGHT; - break; - case DC_DPAD_DOWN | DC_DPAD_LEFT: - GamepadDevice::gamepad_btn_input(DC_DPAD_DOWN, pressed); - code = DC_DPAD_LEFT; - break; - case DC_DPAD_UP | DC_DPAD_LEFT: - GamepadDevice::gamepad_btn_input(DC_DPAD_UP, pressed); - code = DC_DPAD_LEFT; - break; - default: - break; - } - - return GamepadDevice::gamepad_btn_input(code, pressed); + gamepad_btn_input(DC_DPAD_UP, false); + gamepad_btn_input(DC_DPAD_DOWN, false); + gamepad_btn_input(DC_DPAD_LEFT, false); + gamepad_btn_input(DC_DPAD_RIGHT, false); + state = 0; + gui_open_settings(); + return true; } + return false; } - -private: - u32 buttonState = 0; }; class IOSTouchMouse : public SystemMouse