diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index af3b0bb5d..c770f5f21 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -56,6 +56,8 @@ add_library(core namco_guncon.h pad.cpp pad.h + playstation_mouse.cpp + playstation_mouse.h psf_loader.cpp psf_loader.h save_state_version.h diff --git a/src/core/controller.cpp b/src/core/controller.cpp index 1690a88f8..a64dc1343 100644 --- a/src/core/controller.cpp +++ b/src/core/controller.cpp @@ -1,8 +1,9 @@ #include "controller.h" #include "analog_controller.h" #include "common/state_wrapper.h" -#include "namco_guncon.h" #include "digital_controller.h" +#include "namco_guncon.h" +#include "playstation_mouse.h" Controller::Controller() = default; @@ -50,6 +51,9 @@ std::unique_ptr Controller::Create(System* system, ControllerType ty case ControllerType::NamcoGunCon: return NamcoGunCon::Create(system); + case ControllerType::PlayStationMouse: + return PlayStationMouse::Create(system); + case ControllerType::None: default: return {}; @@ -79,6 +83,9 @@ Controller::AxisList Controller::GetAxisNames(ControllerType type) case ControllerType::NamcoGunCon: return NamcoGunCon::StaticGetAxisNames(); + case ControllerType::PlayStationMouse: + return PlayStationMouse::StaticGetAxisNames(); + case ControllerType::None: default: return {}; @@ -98,6 +105,9 @@ Controller::ButtonList Controller::GetButtonNames(ControllerType type) case ControllerType::NamcoGunCon: return NamcoGunCon::StaticGetButtonNames(); + case ControllerType::PlayStationMouse: + return PlayStationMouse::StaticGetButtonNames(); + case ControllerType::None: default: return {}; @@ -117,6 +127,9 @@ u32 Controller::GetVibrationMotorCount(ControllerType type) case ControllerType::NamcoGunCon: return NamcoGunCon::StaticGetVibrationMotorCount(); + case ControllerType::PlayStationMouse: + return PlayStationMouse::StaticGetVibrationMotorCount(); + case ControllerType::None: default: return 0; @@ -136,6 +149,9 @@ std::optional Controller::GetAxisCodeByName(ControllerType type, std::strin case ControllerType::NamcoGunCon: return NamcoGunCon::StaticGetAxisCodeByName(axis_name); + case ControllerType::PlayStationMouse: + return PlayStationMouse::StaticGetAxisCodeByName(axis_name); + case ControllerType::None: default: return std::nullopt; @@ -155,6 +171,9 @@ std::optional Controller::GetButtonCodeByName(ControllerType type, std::str case ControllerType::NamcoGunCon: return NamcoGunCon::StaticGetButtonCodeByName(button_name); + case ControllerType::PlayStationMouse: + return PlayStationMouse::StaticGetButtonCodeByName(button_name); + case ControllerType::None: default: return std::nullopt; diff --git a/src/core/core.vcxproj b/src/core/core.vcxproj index 9aa2e829e..dc93562cd 100644 --- a/src/core/core.vcxproj +++ b/src/core/core.vcxproj @@ -78,6 +78,7 @@ + @@ -119,6 +120,7 @@ + diff --git a/src/core/core.vcxproj.filters b/src/core/core.vcxproj.filters index e15248cc7..deb976974 100644 --- a/src/core/core.vcxproj.filters +++ b/src/core/core.vcxproj.filters @@ -42,6 +42,7 @@ + @@ -85,6 +86,7 @@ + diff --git a/src/core/playstation_mouse.cpp b/src/core/playstation_mouse.cpp new file mode 100644 index 000000000..c14038d3a --- /dev/null +++ b/src/core/playstation_mouse.cpp @@ -0,0 +1,204 @@ +#include "playstation_mouse.h" +#include "common/assert.h" +#include "common/log.h" +#include "common/state_wrapper.h" +#include "gpu.h" +#include "host_display.h" +#include "host_interface.h" +#include "system.h" +#include +Log_SetChannel(PlayStationMouse); + +PlayStationMouse::PlayStationMouse(System* system) : m_system(system) +{ + m_last_host_position_y = system->GetHostInterface()->GetDisplay()->GetMousePositionX(); + m_last_host_position_y = system->GetHostInterface()->GetDisplay()->GetMousePositionY(); +} + +PlayStationMouse::~PlayStationMouse() = default; + +ControllerType PlayStationMouse::GetType() const +{ + return ControllerType::NamcoGunCon; +} + +std::optional PlayStationMouse::GetAxisCodeByName(std::string_view axis_name) const +{ + return StaticGetAxisCodeByName(axis_name); +} + +std::optional PlayStationMouse::GetButtonCodeByName(std::string_view button_name) const +{ + return StaticGetButtonCodeByName(button_name); +} + +void PlayStationMouse::Reset() +{ + m_transfer_state = TransferState::Idle; +} + +bool PlayStationMouse::DoState(StateWrapper& sw) +{ + if (!Controller::DoState(sw)) + return false; + + sw.Do(&m_button_state); + sw.Do(&m_delta_x); + sw.Do(&m_delta_y); + sw.Do(&m_transfer_state); + return true; +} + +void PlayStationMouse::SetAxisState(s32 axis_code, float value) {} + +void PlayStationMouse::SetButtonState(Button button, bool pressed) +{ + static constexpr std::array(Button::Count)> indices = {{11, 10}}; + if (pressed) + m_button_state &= ~(u16(1) << indices[static_cast(button)]); + else + m_button_state |= u16(1) << indices[static_cast(button)]; +} + +void PlayStationMouse::SetButtonState(s32 button_code, bool pressed) +{ + if (button_code < 0 || button_code >= static_cast(Button::Count)) + return; + + SetButtonState(static_cast