diff --git a/src/backend/core/mmio/CMakeLists.txt b/src/backend/core/mmio/CMakeLists.txt index 1ad025da..6f9f3812 100644 --- a/src/backend/core/mmio/CMakeLists.txt +++ b/src/backend/core/mmio/CMakeLists.txt @@ -1,8 +1,11 @@ file(GLOB_RECURSE SOURCES *.cpp) file(GLOB_RECURSE HEADERS *.hpp) -find_package(gainput REQUIRED) +set(GAINPUT_SAMPLES OFF) +set(GAINPUT_TESTS OFF) +add_subdirectory(../../../../external/gainput gainput) add_library(mmio ${SOURCES} ${HEADERS} ../../../../external/cic_nus_6105/n64_cic_nus_6105.cpp) +target_include_directories(mmio PRIVATE ../../../../external/gainput/lib/include) target_link_libraries(mmio PRIVATE gainput) \ No newline at end of file diff --git a/src/backend/core/mmio/PIF.cpp b/src/backend/core/mmio/PIF.cpp index 4a39c48e..18f45d1f 100644 --- a/src/backend/core/mmio/PIF.cpp +++ b/src/backend/core/mmio/PIF.cpp @@ -27,6 +27,28 @@ void PIF::Reset() { } mempakOpen = false; + + inputManager.SetDisplaySize(640, 480); + keyboardId = inputManager.CreateDevice(); + + inputMap.MapBool(BtnZ, keyboardId, gainput::KeyZ); + inputMap.MapBool(BtnA, keyboardId, gainput::KeyX); + inputMap.MapBool(BtnB, keyboardId, gainput::KeyC); + inputMap.MapBool(BtnL, keyboardId, gainput::KeyA); + inputMap.MapBool(BtnR, keyboardId, gainput::KeyS); + inputMap.MapBool(BtnStart, keyboardId, gainput::KeyReturn); + inputMap.MapBool(BtnDUp, keyboardId, gainput::KeyI); + inputMap.MapBool(BtnDDown, keyboardId, gainput::KeyK); + inputMap.MapBool(BtnDLeft, keyboardId, gainput::KeyJ); + inputMap.MapBool(BtnDRight, keyboardId, gainput::KeyL); + inputMap.MapBool(BtnCUp, keyboardId, gainput::KeyKpUp); + inputMap.MapBool(BtnCDown, keyboardId, gainput::KeyKpDown); + inputMap.MapBool(BtnCLeft, keyboardId, gainput::KeyKpLeft); + inputMap.MapBool(BtnCRight, keyboardId, gainput::KeyKpRight); + inputMap.MapBool(AxisUp, keyboardId, gainput::KeyUp); + inputMap.MapBool(AxisDown, keyboardId, gainput::KeyDown); + inputMap.MapBool(AxisLeft, keyboardId, gainput::KeyLeft); + inputMap.MapBool(AxisRight, keyboardId, gainput::KeyRight); } void PIF::MaybeLoadMempak() { @@ -186,7 +208,6 @@ void PIF::ProcessCommands(Mem &mem) { channel++; break; case 1: - UpdateController(); if(!ReadButtons(res)) { cmd[1] |= 0x80; } @@ -335,7 +356,22 @@ void PIF::EepromWrite(const u8* cmd, u8* res, const Mem& mem) { } void PIF::UpdateController() { - //joybusDevices[channel].controller = value; + inputManager.Update(); + joybusDevices[channel].controller.a = inputMap.GetBool(BtnA); + joybusDevices[channel].controller.b = inputMap.GetBool(BtnB); + joybusDevices[channel].controller.z = inputMap.GetBool(BtnZ); + joybusDevices[channel].controller.l = inputMap.GetBool(BtnL); + joybusDevices[channel].controller.r = inputMap.GetBool(BtnR); + joybusDevices[channel].controller.dp_up = inputMap.GetBool(BtnDUp); + joybusDevices[channel].controller.dp_down = inputMap.GetBool(BtnDDown); + joybusDevices[channel].controller.dp_left = inputMap.GetBool(BtnDLeft); + joybusDevices[channel].controller.dp_right = inputMap.GetBool(BtnDRight); + joybusDevices[channel].controller.c_up = inputMap.GetBool(BtnCUp); + joybusDevices[channel].controller.c_down = inputMap.GetBool(BtnCDown); + joybusDevices[channel].controller.c_left = inputMap.GetBool(BtnCLeft); + joybusDevices[channel].controller.c_right = inputMap.GetBool(BtnCRight); + joybusDevices[channel].controller.joy_x = inputMap.GetBool(AxisLeft) ? -127 : inputMap.GetBool(AxisRight) ? 127 : 0; + joybusDevices[channel].controller.joy_y = inputMap.GetBool(AxisUp) ? -127 : inputMap.GetBool(AxisDown) ? 127 : 0; if (joybusDevices[channel].controller.joy_reset) { joybusDevices[channel].controller.start = false; diff --git a/src/backend/core/mmio/PIF.hpp b/src/backend/core/mmio/PIF.hpp index cb6754e7..79ba6e49 100644 --- a/src/backend/core/mmio/PIF.hpp +++ b/src/backend/core/mmio/PIF.hpp @@ -1,6 +1,6 @@ #pragma once #include -#include +#include #include #include #include @@ -104,6 +104,16 @@ enum CICType { CIC_NUS_6106_7106 }; +enum Button { + BtnA, BtnB, BtnZ, BtnL, BtnR, BtnStart, + BtnCUp, BtnCDown, BtnCLeft, BtnCRight, + BtnDUp, BtnDDown, BtnDLeft, BtnDRight, +}; + +enum Axis { + AxisLeft, AxisRight, AxisUp, AxisDown +}; + struct PIF { PIF() = default; ~PIF() = default; @@ -125,7 +135,9 @@ struct PIF { std::vector Serialize(); bool gamepadConnected = false, mempakOpen = false; - SDL_GameController* gamepad{}; + gainput::InputManager inputManager; + gainput::InputMap inputMap{ inputManager }; + gainput::DeviceId keyboardId, padId; JoybusDevice joybusDevices[6]{}; u8 bootrom[PIF_BOOTROM_SIZE]{}, ram[PIF_RAM_SIZE]{}; mio::mmap_sink mempak, eeprom; diff --git a/src/frontend/EmuThread.cpp b/src/frontend/EmuThread.cpp index cd95275b..bd2ddd67 100644 --- a/src/frontend/EmuThread.cpp +++ b/src/frontend/EmuThread.cpp @@ -10,6 +10,7 @@ EmuThread::EmuThread(std::unique_ptr&& instance, std::unique_ LoadParallelRDP(core.cpu->mem.GetRDRAM()); while (true) { if (!core.pause) { + core.cpu->mem.mmio.si.pif.UpdateController(); core.Run(0.5, 0.5); if(core.render) { UpdateScreenParallelRdp(core, core.cpu->mem.mmio.vi); diff --git a/src/frontend/KaizenQt.cpp b/src/frontend/KaizenQt.cpp index a243430a..ab24c7c3 100644 --- a/src/frontend/KaizenQt.cpp +++ b/src/frontend/KaizenQt.cpp @@ -13,8 +13,6 @@ KaizenQt::KaizenQt() noexcept : QWidget(nullptr) { std::move(mainWindow->view.vulkanWidget->windowInfo), mainWindow); - mainWindow->emuThread = emuThread; - ConnectMainWindowSignalsToSlots(); setAcceptDrops(true); diff --git a/src/frontend/MainWindow.hpp b/src/frontend/MainWindow.hpp index ef8c368f..0337f80c 100644 --- a/src/frontend/MainWindow.hpp +++ b/src/frontend/MainWindow.hpp @@ -12,7 +12,6 @@ public: MainWindowController() noexcept; Ui::MainWindow view; - EmuThread* emuThread = nullptr; private: void ConnectSignalsToSlots() noexcept;