From beb356500148454eebe3bc92efbc1203b9be8c60 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 21 Dec 2024 12:51:27 +0100 Subject: [PATCH] ps move tracker: draw sphere size range into live image --- rpcs3/Input/ps_move_tracker.cpp | 40 +++++++++++++++++++++++++++++++++ rpcs3/Input/ps_move_tracker.h | 2 ++ 2 files changed, 42 insertions(+) diff --git a/rpcs3/Input/ps_move_tracker.cpp b/rpcs3/Input/ps_move_tracker.cpp index e4c944af60..b831e87967 100644 --- a/rpcs3/Input/ps_move_tracker.cpp +++ b/rpcs3/Input/ps_move_tracker.cpp @@ -313,6 +313,34 @@ static bool is_circular_contour(const std::vector& contour, f32& area return true; } +template +void ps_move_tracker::draw_sphere_size_range(f32 result_radius) +{ + if constexpr (!DiagnosticsEnabled) return; + if (!m_draw_overlays) return; + + // Map memory + cv::Mat rgba(cv::Size(m_width, m_height), CV_8UC4, m_image_rgba_contours.data(), 0); + + // Draw result, min and max radius + const f32 min_radius = m_min_radius * m_width; + const f32 max_radius = m_max_radius * m_width; + const f32 min_radius_clamped = std::max(0.0f, std::min(min_radius, max_radius)); + const cv::Point2f center = cv::Point2f(m_width - 1 - max_radius, max_radius); + if (result_radius > 0.0f) + { + cv::circle(rgba, center, static_cast(result_radius), cv::Scalar(255, 0, 0, 255), cv::FILLED); + } + if (min_radius_clamped > 0.0f && min_radius_clamped <= max_radius) + { + cv::circle(rgba, center, static_cast(min_radius_clamped), cv::Scalar(0, 0, 0, 255), cv::FILLED); + } + if (max_radius > min_radius_clamped) + { + cv::circle(rgba, center, static_cast(max_radius), cv::Scalar(0, 0, 0, 255), 1); + } +} + template void ps_move_tracker::process_contours(ps_move_info& info, u32 index) { @@ -384,6 +412,11 @@ void ps_move_tracker::process_contours(ps_move_info& info, u if (all_contours.empty()) { set_valid(info, index, false); + + if constexpr (DiagnosticsEnabled) + { + draw_sphere_size_range(0.0f); + } return; } @@ -431,6 +464,11 @@ void ps_move_tracker::process_contours(ps_move_info& info, u if (best_index == umax) { set_valid(info, index, false); + + if constexpr (DiagnosticsEnabled) + { + draw_sphere_size_range(0.0f); + } return; } @@ -472,6 +510,8 @@ void ps_move_tracker::process_contours(ps_move_info& info, u if (!m_draw_contours && !m_draw_overlays) [[likely]] return; + draw_sphere_size_range(info.radius); + // Map memory cv::Mat rgba(cv::Size(width, height), CV_8UC4, m_image_rgba_contours.data(), 0); diff --git a/rpcs3/Input/ps_move_tracker.h b/rpcs3/Input/ps_move_tracker.h index 42ebdd4fb2..5c9b9df9c7 100644 --- a/rpcs3/Input/ps_move_tracker.h +++ b/rpcs3/Input/ps_move_tracker.h @@ -73,6 +73,8 @@ private: void set_valid(ps_move_info& info, u32 index, bool valid); + void draw_sphere_size_range(f32 result_radius); + u32 m_width = 0; u32 m_height = 0; s32 m_format = 0;