From 3cf4d58716e5a306bcc9e8175806e7caa2ebd65f Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 22 Nov 2020 21:25:10 +1100 Subject: [PATCH] viewer: rewrote pixel sampling coordinate system Fixes #1395 --- app/widget/manageddisplay/manageddisplay.cpp | 4 ++ app/widget/manageddisplay/manageddisplay.h | 12 ++++++ app/widget/viewer/viewerdisplay.cpp | 44 ++++++++++---------- app/widget/viewer/viewerdisplay.h | 3 ++ 4 files changed, 41 insertions(+), 22 deletions(-) diff --git a/app/widget/manageddisplay/manageddisplay.cpp b/app/widget/manageddisplay/manageddisplay.cpp index 0ffc6401b..bbea5112f 100644 --- a/app/widget/manageddisplay/manageddisplay.cpp +++ b/app/widget/manageddisplay/manageddisplay.cpp @@ -55,6 +55,10 @@ ManagedDisplayWidget::ManagedDisplayWidget(QWidget *parent) : &ManagedDisplayWidgetOpenGL::frameSwapped, this, &ManagedDisplayWidget::frameSwapped, Qt::DirectConnection); + connect(static_cast(inner_widget_), + &ManagedDisplayWidgetOpenGL::OnMouseMove, + this, &ManagedDisplayWidget::InnerWidgetMouseMove); + // Create OpenGL renderer attached_renderer_ = new OpenGLRenderer(this); } else { diff --git a/app/widget/manageddisplay/manageddisplay.h b/app/widget/manageddisplay/manageddisplay.h index 7cab3bd38..4b08dfead 100644 --- a/app/widget/manageddisplay/manageddisplay.h +++ b/app/widget/manageddisplay/manageddisplay.h @@ -21,6 +21,7 @@ #ifndef MANAGEDDISPLAYOBJECT_H #define MANAGEDDISPLAYOBJECT_H +#include #include #include @@ -46,6 +47,8 @@ signals: void OnDestroy(); + void OnMouseMove(QMouseEvent* e); + protected: virtual void initializeGL() override { @@ -60,6 +63,13 @@ protected: emit OnPaint(); } + virtual void mouseMoveEvent(QMouseEvent* e) override + { + emit OnMouseMove(e); + + QOpenGLWidget::mouseMoveEvent(e); + } + private slots: void DestroyListener() { @@ -144,6 +154,8 @@ signals: void frameSwapped(); + void InnerWidgetMouseMove(QMouseEvent* event); + protected: /** * @brief Provides access to the color processor (nullptr if none is set) diff --git a/app/widget/viewer/viewerdisplay.cpp b/app/widget/viewer/viewerdisplay.cpp index 59b8d0bf4..f2ca65a63 100644 --- a/app/widget/viewer/viewerdisplay.cpp +++ b/app/widget/viewer/viewerdisplay.cpp @@ -49,6 +49,8 @@ ViewerDisplayWidget::ViewerDisplayWidget(QWidget *parent) : { connect(Core::instance(), &Core::ToolChanged, this, &ViewerDisplayWidget::UpdateCursor); + connect(this, &ViewerDisplayWidget::InnerWidgetMouseMove, this, &ViewerDisplayWidget::EmitColorAtCursor); + // Initializes cursor based on tool UpdateCursor(); } @@ -84,7 +86,7 @@ void ViewerDisplayWidget::UpdateCursor() void ViewerDisplayWidget::SetSignalCursorColorEnabled(bool e) { signal_cursor_color_ = e; - setMouseTracking(e); + inner_widget()->setMouseTracking(e); } void ViewerDisplayWidget::SetImage(FramePtr in_buffer) @@ -211,27 +213,6 @@ void ViewerDisplayWidget::mousePressEvent(QMouseEvent *event) void ViewerDisplayWidget::mouseMoveEvent(QMouseEvent *event) { - // Do this no matter what, emits signal to any pixel samplers - if (signal_cursor_color_) { - Color reference, display; - - if (last_loaded_buffer_) { - QVector3D pixel_pos(static_cast(event->x()) / static_cast(width()) * 2.0f - 1.0f, - static_cast(event->y()) / static_cast(height()) * 2.0f - 1.0f, - 0); - - pixel_pos = GenerateWorldTransform().inverted() * pixel_pos; - - int frame_x = qRound((pixel_pos.x() + 1.0f) * 0.5f * last_loaded_buffer_->width()); - int frame_y = qRound((pixel_pos.y() + 1.0f) * 0.5f * last_loaded_buffer_->height()); - - reference = last_loaded_buffer_->get_pixel(frame_x, frame_y); - display = color_service()->ConvertColor(reference); - } - - emit CursorColor(reference, display); - } - // Handle hand dragging if (hand_dragging_) { @@ -444,4 +425,23 @@ QTransform ViewerDisplayWidget::GenerateGizmoTransform() return gizmo_transform; } +void ViewerDisplayWidget::EmitColorAtCursor(QMouseEvent *e) +{ + // Do this no matter what, emits signal to any pixel samplers + if (signal_cursor_color_) { + Color reference, display; + + if (last_loaded_buffer_) { + QPointF pixel_pos = GenerateGizmoTransform().inverted().map(e->pos()); + + pixel_pos /= last_loaded_buffer_->video_params().divider(); + + reference = last_loaded_buffer_->get_pixel(qRound(pixel_pos.x()), qRound(pixel_pos.y())); + display = color_service()->ConvertColor(reference); + } + + emit CursorColor(reference, display); + } +} + } diff --git a/app/widget/viewer/viewerdisplay.h b/app/widget/viewer/viewerdisplay.h index dfe9b2e69..11eb2ec28 100644 --- a/app/widget/viewer/viewerdisplay.h +++ b/app/widget/viewer/viewerdisplay.h @@ -246,6 +246,9 @@ private: bool deinterlace_; +private slots: + void EmitColorAtCursor(QMouseEvent* e); + }; }