diff --git a/rpcs3/Emu/Io/PadHandler.h b/rpcs3/Emu/Io/PadHandler.h index 4db058e59..fc5b134de 100644 --- a/rpcs3/Emu/Io/PadHandler.h +++ b/rpcs3/Emu/Io/PadHandler.h @@ -17,6 +17,7 @@ extern "C" { #endif #include +#include #include #include #include @@ -292,16 +293,14 @@ public: virtual void get_motion_sensors(const std::string& pad_id, const motion_callback& callback, const motion_fail_callback& fail_callback, motion_preview_values preview_values, const std::array& sensors); virtual std::unordered_map get_motion_axis_list() const { return {}; } - static constexpr f32 PI = 3.14159265f; - static f32 degree_to_rad(f32 degree) { - return degree * PI / 180.0f; + return degree * std::numbers::pi_v / 180.0f; } static f32 rad_to_degree(f32 radians) { - return radians * 180.0f / PI; + return radians * 180.0f / std::numbers::pi_v; }; private: diff --git a/rpcs3/Emu/RSX/Overlays/overlay_controls.cpp b/rpcs3/Emu/RSX/Overlays/overlay_controls.cpp index 21cdd6993..ef997595b 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_controls.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_controls.cpp @@ -7,6 +7,8 @@ #include "Utilities/File.h" #include "Emu/Cell/timers.hpp" +#include + #ifndef _WIN32 #include #include @@ -350,9 +352,8 @@ namespace rsx { if (sinus_modifier >= 0) { - static constexpr f32 PI = 3.14159265f; const f32 pulse_sinus_x = static_cast(get_system_time() / 1000) * pulse_speed_modifier; - pulse_sinus_offset = fmod(pulse_sinus_x + sinus_modifier * PI, 2.0f * PI); + pulse_sinus_offset = fmod(pulse_sinus_x + sinus_modifier * std::numbers::pi_v, 2.0f * std::numbers::pi_v); } } diff --git a/rpcs3/Input/ps_move_calibration.cpp b/rpcs3/Input/ps_move_calibration.cpp index bac042de6..2c74f0815 100644 --- a/rpcs3/Input/ps_move_calibration.cpp +++ b/rpcs3/Input/ps_move_calibration.cpp @@ -1,6 +1,8 @@ #include "stdafx.h" #include "ps_move_calibration.h" +#include + LOG_CHANNEL(move_log, "Move"); // This is basically the same as in ps move api @@ -176,8 +178,7 @@ void psmove_calibration_get_usb_gyro_values(const reports::ps_move_calibration_b { const u8* data = calibration.data.data(); - constexpr f32 PI = 3.14159265f; - constexpr f32 rpm_to_rad_per_sec = (2.0f * PI) / 60.0f; + constexpr f32 rpm_to_rad_per_sec = (2.0f * std::numbers::pi_v) / 60.0f; switch (device.model) { diff --git a/rpcs3/rpcs3qt/ps_move_tracker_dialog.cpp b/rpcs3/rpcs3qt/ps_move_tracker_dialog.cpp index 218ccfc80..d2c81d2bc 100644 --- a/rpcs3/rpcs3qt/ps_move_tracker_dialog.cpp +++ b/rpcs3/rpcs3qt/ps_move_tracker_dialog.cpp @@ -14,6 +14,7 @@ #include #include #include +#include LOG_CHANNEL(ps_move); @@ -252,6 +253,8 @@ ps_move_tracker_dialog::ps_move_tracker_dialog(QWidget* parent) QMessageBox::warning(this, QObject::tr("Tracking not supported!"), QObject::tr("The PS Move tracking is not yet supported on this operating system.")); }); } + + ui->imageLabel->installEventFilter(this); } ps_move_tracker_dialog::~ps_move_tracker_dialog() @@ -273,6 +276,69 @@ ps_move_tracker_dialog::~ps_move_tracker_dialog() m_input_thread.reset(); } +bool ps_move_tracker_dialog::eventFilter(QObject* object, QEvent* event) +{ + if (event && object == ui->imageLabel && event->type() == QEvent::Type::MouseButtonRelease && m_view_mode == view_mode::contours) + { + const QMouseEvent* me = reinterpret_cast(event); + + if (me->button() == Qt::MouseButton::LeftButton) + { + ps_move.notice("Selecting color with mouse click."); + + f32 r = 0.0f; + f32 g = 0.0f; + f32 b = 0.0f; + u32 count = 0; + + { + std::lock_guard lock(m_image_mutex); + + const auto pos = me->localPos().toPoint(); + const QPixmap pixmap = ui->imageLabel->pixmap(); + + if (pixmap.rect().contains(pos)) + { + const QImage image = pixmap.toImage(); + constexpr int radius = 3; + + for (int y = pos.y() - radius; y <= pos.y() + radius; ++y) + { + for (int x = pos.x() - radius; x <= pos.x() + radius; ++x) + { + if (!image.rect().contains(x, y)) + continue; + + const QColor color = image.pixelColor(x, y); + + r += color.redF(); + g += color.greenF(); + b += color.blueF(); + count++; + } + } + } + } + + if (count > 0) + { + r /= count; + g /= count; + b /= count; + + ps_move.notice("Selected new color with mouse click (r=%f, b=%f, g=%f)", r, g, b); + + cfg_ps_move* config = ::at32(g_cfg_move.move, m_index); + const auto [hue, saturation, value] = ps_move_tracker::rgb_to_hsv(r, g, b); + config->hue.set(std::clamp(hue, config->hue.min, config->hue.max)); + update_hue(true); + } + } + } + + return QDialog::eventFilter(object, event); +} + void ps_move_tracker_dialog::update_color(bool update_sliders) { cfg_ps_move* config = ::at32(g_cfg_move.move, m_index); diff --git a/rpcs3/rpcs3qt/ps_move_tracker_dialog.h b/rpcs3/rpcs3qt/ps_move_tracker_dialog.h index fe3b043b2..d01d72981 100644 --- a/rpcs3/rpcs3qt/ps_move_tracker_dialog.h +++ b/rpcs3/rpcs3qt/ps_move_tracker_dialog.h @@ -26,6 +26,8 @@ public: virtual ~ps_move_tracker_dialog(); private: + bool eventFilter(QObject* object, QEvent* event) override; + void update_color(bool update_sliders = false); void update_hue(bool update_slider = false); void update_hue_threshold(bool update_slider = false);