From 1cca9de7c5023da8d518f4c07011c6df07f434e3 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 27 Apr 2020 04:34:36 +1000 Subject: [PATCH] gizmos: implemented pathway for node to draw on the viewer --- app/node/generator/matrix/matrix.cpp | 11 +++++++++++ app/node/generator/matrix/matrix.h | 3 +++ app/node/node.cpp | 9 +++++++++ app/node/node.h | 5 +++++ app/panel/param/param.cpp | 1 + app/panel/param/param.h | 2 ++ app/panel/viewer/viewerbase.cpp | 5 +++++ app/panel/viewer/viewerbase.h | 3 +++ app/widget/nodeparamview/nodeparamview.cpp | 11 +++++++++-- app/widget/nodeparamview/nodeparamview.h | 2 ++ app/widget/viewer/viewer.cpp | 5 +++++ app/widget/viewer/viewer.h | 2 ++ app/widget/viewer/viewerdisplay.cpp | 16 +++++++++++++++- app/widget/viewer/viewerdisplay.h | 5 +++++ app/window/mainwindow/mainwindow.cpp | 1 + 15 files changed, 78 insertions(+), 3 deletions(-) diff --git a/app/node/generator/matrix/matrix.cpp b/app/node/generator/matrix/matrix.cpp index c967869ed..ad41d9554 100644 --- a/app/node/generator/matrix/matrix.cpp +++ b/app/node/generator/matrix/matrix.cpp @@ -110,6 +110,17 @@ NodeValueTable MatrixGenerator::Value(NodeValueDatabase &value) const return output; } +bool MatrixGenerator::HasGizmos() const +{ + return true; +} + +void MatrixGenerator::DrawGizmos(QPainter *p, const QRect& viewport) const +{ + p->setPen(Qt::white); + p->drawEllipse(viewport); +} + void MatrixGenerator::UniformScaleChanged() { scale_input_->set_property("disabley", uniform_scale_input_->get_standard_value().toBool()); diff --git a/app/node/generator/matrix/matrix.h b/app/node/generator/matrix/matrix.h index 53c5c5356..817fcb58e 100644 --- a/app/node/generator/matrix/matrix.h +++ b/app/node/generator/matrix/matrix.h @@ -42,6 +42,9 @@ public: virtual NodeValueTable Value(NodeValueDatabase& value) const override; + virtual bool HasGizmos() const override; + virtual void DrawGizmos(QPainter *p, const QRect &viewport) const override; + private: NodeInput* position_input_; diff --git a/app/node/node.cpp b/app/node/node.cpp index ffde76468..e8749398b 100644 --- a/app/node/node.cpp +++ b/app/node/node.cpp @@ -268,6 +268,15 @@ QList Node::GetOutputs() const return {output_}; } +bool Node::HasGizmos() const +{ + return false; +} + +void Node::DrawGizmos(QPainter *, const QRect &) const +{ +} + void Node::CopyInputs(Node *source, Node *destination, bool include_connections) { Q_ASSERT(source->id() == destination->id()); diff --git a/app/node/node.h b/app/node/node.h index 16b33c8c1..bfe36b26b 100644 --- a/app/node/node.h +++ b/app/node/node.h @@ -23,6 +23,7 @@ #include #include +#include #include #include @@ -352,6 +353,10 @@ public: QList GetOutputs() const; + virtual bool HasGizmos() const; + + virtual void DrawGizmos(QPainter* p, const QRect &viewport) const; + protected: void AddInput(NodeInput* input); diff --git a/app/panel/param/param.cpp b/app/panel/param/param.cpp index bdbb8e8e0..0112f80fb 100644 --- a/app/panel/param/param.cpp +++ b/app/panel/param/param.cpp @@ -33,6 +33,7 @@ ParamPanel::ParamPanel(QWidget* parent) : connect(view, &NodeParamView::RequestSelectNode, this, &ParamPanel::RequestSelectNode); connect(view, &NodeParamView::OpenedNode, this, &ParamPanel::OpeningNode); connect(view, &NodeParamView::ClosedNode, this, &ParamPanel::ClosingNode); + connect(view, &NodeParamView::FoundGizmos, this, &ParamPanel::FoundGizmos); SetTimeBasedWidget(view); Retranslate(); diff --git a/app/panel/param/param.h b/app/panel/param/param.h index 0ad5523c4..fcb485bb4 100644 --- a/app/panel/param/param.h +++ b/app/panel/param/param.h @@ -43,6 +43,8 @@ signals: void RequestSelectNode(const QList& target); + void FoundGizmos(Node* node); + protected: virtual void Retranslate() override; diff --git a/app/panel/viewer/viewerbase.cpp b/app/panel/viewer/viewerbase.cpp index a8d4d55b8..a1899e5f3 100644 --- a/app/panel/viewer/viewerbase.cpp +++ b/app/panel/viewer/viewerbase.cpp @@ -91,6 +91,11 @@ void ViewerPanelBase::SetFullScreen(QScreen *screen) static_cast(GetTimeBasedWidget())->SetFullScreen(screen); } +void ViewerPanelBase::SetGizmos(Node *node) +{ + static_cast(GetTimeBasedWidget())->SetGizmos(node); +} + void ViewerPanelBase::CreateScopePanel(ScopePanel::Type type) { ViewerWidget* vw = static_cast(GetTimeBasedWidget()); diff --git a/app/panel/viewer/viewerbase.h b/app/panel/viewer/viewerbase.h index 7d551141d..a74f13244 100644 --- a/app/panel/viewer/viewerbase.h +++ b/app/panel/viewer/viewerbase.h @@ -56,6 +56,9 @@ public: */ void SetFullScreen(QScreen* screen = nullptr); +public slots: + void SetGizmos(Node* node); + protected: void CreateScopePanel(ScopePanel::Type type); diff --git a/app/widget/nodeparamview/nodeparamview.cpp b/app/widget/nodeparamview/nodeparamview.cpp index b9d1e7366..648d8c308 100644 --- a/app/widget/nodeparamview/nodeparamview.cpp +++ b/app/widget/nodeparamview/nodeparamview.cpp @@ -127,7 +127,7 @@ void NodeParamView::SetNodes(QList nodes) // If we already have item widgets, delete them all now foreach (NodeParamViewItem* item, items_) { emit ClosedNode(item->GetNode()); - + emit FoundGizmos(nullptr); delete item; } items_.clear(); @@ -142,6 +142,8 @@ void NodeParamView::SetNodes(QList nodes) if (!nodes_.isEmpty()) { // For each node, create a widget + bool found_gizmos = false; + foreach (Node* node, nodes_) { NodeParamViewItem* item = new NodeParamViewItem(node); @@ -156,9 +158,14 @@ void NodeParamView::SetNodes(QList nodes) items_.append(item); - QTimer::singleShot(1, item, &NodeParamViewItem::SignalAllKeyframes); + QMetaObject::invokeMethod(item, "SignalAllKeyframes", Qt::QueuedConnection); emit OpenedNode(node); + + if (!found_gizmos && node->HasGizmos()) { + emit FoundGizmos(node); + found_gizmos = true; + } } ViewerOutput* viewer = nodes_.first()->FindOutputNode(); diff --git a/app/widget/nodeparamview/nodeparamview.h b/app/widget/nodeparamview/nodeparamview.h index 097fcd4ae..0a34a4bfc 100644 --- a/app/widget/nodeparamview/nodeparamview.h +++ b/app/widget/nodeparamview/nodeparamview.h @@ -51,6 +51,8 @@ signals: void ClosedNode(Node* n); + void FoundGizmos(Node* n); + protected: virtual void resizeEvent(QResizeEvent *event) override; diff --git a/app/widget/viewer/viewer.cpp b/app/widget/viewer/viewer.cpp index 4107ceab1..4fd344bb9 100644 --- a/app/widget/viewer/viewer.cpp +++ b/app/widget/viewer/viewer.cpp @@ -335,6 +335,11 @@ ColorManager *ViewerWidget::color_manager() const return main_gl_widget()->color_manager(); } +void ViewerWidget::SetGizmos(Node *node) +{ + main_gl_widget()->SetGizmos(node); +} + void ViewerWidget::UpdateTextureFromNode(const rational& time) { if (!GetConnectedNode() || time >= GetConnectedNode()->Length()) { diff --git a/app/widget/viewer/viewer.h b/app/widget/viewer/viewer.h index 8cf6bb24c..694e74100 100644 --- a/app/widget/viewer/viewer.h +++ b/app/widget/viewer/viewer.h @@ -87,6 +87,8 @@ public: ColorManager* color_manager() const; + void SetGizmos(Node* node); + public slots: void Play(bool in_to_out_only); diff --git a/app/widget/viewer/viewerdisplay.cpp b/app/widget/viewer/viewerdisplay.cpp index 640539a61..9d0531726 100644 --- a/app/widget/viewer/viewerdisplay.cpp +++ b/app/widget/viewer/viewerdisplay.cpp @@ -45,7 +45,8 @@ ViewerDisplayWidget::ViewerDisplayWidget(QWidget *parent) : managed_copy_pipeline_(nullptr), has_image_(false), signal_cursor_color_(false), - enable_display_referred_signal_(false) + enable_display_referred_signal_(false), + gizmos_(nullptr) { } @@ -177,6 +178,13 @@ void ViewerDisplayWidget::SetSafeMargins(const ViewerSafeMarginInfo &safe_margin update(); } +void ViewerDisplayWidget::SetGizmos(Node *node) +{ + gizmos_ = node; + + update(); +} + void ViewerDisplayWidget::mousePressEvent(QMouseEvent *event) { QOpenGLWidget::mousePressEvent(event); @@ -299,6 +307,12 @@ void ViewerDisplayWidget::paintGL() } } + // Draw gizmos if we have any + if (gizmos_) { + QPainter p(this); + gizmos_->DrawGizmos(&p, rect()); + } + // Draw action/title safe areas if (safe_margin_.is_enabled()) { QPainter p(this); diff --git a/app/widget/viewer/viewerdisplay.h b/app/widget/viewer/viewerdisplay.h index 6289433a4..f35338631 100644 --- a/app/widget/viewer/viewerdisplay.h +++ b/app/widget/viewer/viewerdisplay.h @@ -23,6 +23,7 @@ #include +#include "node/node.h" #include "render/backend/opengl/openglcolorprocessor.h" #include "render/backend/opengl/openglframebuffer.h" #include "render/backend/opengl/openglshader.h" @@ -76,6 +77,8 @@ public: const ViewerSafeMarginInfo& GetSafeMargin() const; void SetSafeMargins(const ViewerSafeMarginInfo& safe_margin); + void SetGizmos(Node* node); + public slots: /** * @brief Set the transformation matrix to draw with @@ -212,6 +215,8 @@ private: bool enable_display_referred_signal_; + Node* gizmos_; + private slots: /** * @brief Slot to connect just before the OpenGL context is destroyed to clean up resources diff --git a/app/window/mainwindow/mainwindow.cpp b/app/window/mainwindow/mainwindow.cpp index 4c192af99..e034af473 100644 --- a/app/window/mainwindow/mainwindow.cpp +++ b/app/window/mainwindow/mainwindow.cpp @@ -81,6 +81,7 @@ MainWindow::MainWindow(QWidget *parent) : connect(param_panel_, &ParamPanel::RequestSelectNode, node_panel_, &NodePanel::Select); connect(sequence_viewer_panel_, &SequenceViewerPanel::TimeChanged, param_panel_, &ParamPanel::SetTimestamp); connect(param_panel_, &ParamPanel::TimeChanged, sequence_viewer_panel_, &SequenceViewerPanel::SetTimestamp); + connect(param_panel_, &ParamPanel::FoundGizmos, sequence_viewer_panel_, &SequenceViewerPanel::SetGizmos); connect(PanelManager::instance(), &PanelManager::FocusedPanelChanged, this, &MainWindow::FocusedPanelChanged); sequence_viewer_panel_->ConnectTimeBasedPanel(param_panel_);