From 67854a2c9778726e49dfc12541a45c3c6b4d2e92 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 6 May 2020 17:45:44 +1000 Subject: [PATCH] gizmos: use scale instead of matrix transform Improves appearance of gizmos lines and ensures other controls are drawn in UI dimensions rather than texture dimensions. --- app/node/generator/matrix/matrix.cpp | 2 +- app/node/generator/matrix/matrix.h | 2 +- app/node/generator/polygon/polygon.cpp | 29 +++++++++++++++++++------- app/node/generator/polygon/polygon.h | 4 ++-- app/node/node.cpp | 2 +- app/node/node.h | 2 +- app/node/param.cpp | 9 ++++---- app/widget/viewer/viewerdisplay.cpp | 7 +------ 8 files changed, 32 insertions(+), 25 deletions(-) diff --git a/app/node/generator/matrix/matrix.cpp b/app/node/generator/matrix/matrix.cpp index 046aca78d..c2fcd199f 100644 --- a/app/node/generator/matrix/matrix.cpp +++ b/app/node/generator/matrix/matrix.cpp @@ -102,7 +102,7 @@ bool MatrixGenerator::HasGizmos() const return true; } -void MatrixGenerator::DrawGizmos(NodeValueDatabase &db, QPainter *p) const +void MatrixGenerator::DrawGizmos(NodeValueDatabase &db, QPainter *p, const QVector2D &scale) const { p->setPen(Qt::white); diff --git a/app/node/generator/matrix/matrix.h b/app/node/generator/matrix/matrix.h index 25d4ef989..901c3dc29 100644 --- a/app/node/generator/matrix/matrix.h +++ b/app/node/generator/matrix/matrix.h @@ -44,7 +44,7 @@ public: virtual NodeValueTable Value(NodeValueDatabase& value) const override; virtual bool HasGizmos() const override; - virtual void DrawGizmos(NodeValueDatabase& db, QPainter *p) const override; + virtual void DrawGizmos(NodeValueDatabase& db, QPainter *p, const QVector2D &scale) const override; private: QMatrix4x4 GenerateMatrix(NodeValueDatabase& value) const; diff --git a/app/node/generator/polygon/polygon.cpp b/app/node/generator/polygon/polygon.cpp index 5b4718c9e..15ed05561 100644 --- a/app/node/generator/polygon/polygon.cpp +++ b/app/node/generator/polygon/polygon.cpp @@ -68,9 +68,9 @@ QString PolygonGenerator::id() const return QStringLiteral("org.olivevideoeditor.Olive.polygon"); } -QString PolygonGenerator::Category() const +QList PolygonGenerator::Category() const { - return tr("Generator"); + return {kCategoryGenerator}; } QString PolygonGenerator::Description() const @@ -99,22 +99,35 @@ bool PolygonGenerator::HasGizmos() const return true; } -void PolygonGenerator::DrawGizmos(NodeValueDatabase &db, QPainter *p) const +void PolygonGenerator::DrawGizmos(NodeValueDatabase &db, QPainter *p, const QVector2D &scale) const { + if (!points_input_->GetSize()) { + return; + } + QVector points(points_input_->GetSize()); p->setPen(Qt::white); p->setBrush(Qt::white); - for (int i=0;iGetSize();i++) { - points[i] = db[points_input_->At(i)].Take(NodeParam::kVec2).value().toPointF(); + int rect_sz = p->fontMetrics().height() / 8; - QRectF rect(points[i] - QPointF(10, 10), - points[i] + QPointF(10, 10)); + for (int i=0;iGetSize();i++) { + QVector2D v = db[points_input_->At(i)].Take(NodeParam::kVec2).value(); + + v *= scale; + + QPointF pt = v.toPointF(); + points[i] = pt; + + QRectF rect(pt - QPointF(rect_sz, rect_sz), + pt + QPointF(rect_sz, rect_sz)); p->drawRect(rect); } - p->drawPolyline(points.constData(), points_input_->GetSize()); + points.append(points.first()); + + p->drawPolyline(points.constData(), points.size()); } OLIVE_NAMESPACE_EXIT diff --git a/app/node/generator/polygon/polygon.h b/app/node/generator/polygon/polygon.h index 9c4e4d31b..53b0d96b5 100644 --- a/app/node/generator/polygon/polygon.h +++ b/app/node/generator/polygon/polygon.h @@ -34,7 +34,7 @@ public: virtual QString Name() const override; virtual QString id() const override; - virtual QString Category() const override; + virtual QList Category() const override; virtual QString Description() const override; virtual void Retranslate() override; @@ -43,7 +43,7 @@ public: virtual QString ShaderFragmentCode(const NodeValueDatabase&) const override; virtual bool HasGizmos() const override; - virtual void DrawGizmos(NodeValueDatabase& db, QPainter *p) const override; + virtual void DrawGizmos(NodeValueDatabase& db, QPainter *p, const QVector2D &scale) const override; /* virtual bool GizmoPress(const QPointF &p) override; diff --git a/app/node/node.cpp b/app/node/node.cpp index 54518e258..724b77fe2 100644 --- a/app/node/node.cpp +++ b/app/node/node.cpp @@ -287,7 +287,7 @@ bool Node::HasGizmos() const return false; } -void Node::DrawGizmos(NodeValueDatabase &, QPainter *) const +void Node::DrawGizmos(NodeValueDatabase &, QPainter *, const QVector2D &) const { } diff --git a/app/node/node.h b/app/node/node.h index 75632cf8e..acfe96d65 100644 --- a/app/node/node.h +++ b/app/node/node.h @@ -383,7 +383,7 @@ public: virtual bool HasGizmos() const; - virtual void DrawGizmos(NodeValueDatabase& db, QPainter* p) const; + virtual void DrawGizmos(NodeValueDatabase& db, QPainter* p, const QVector2D &scale) const; virtual bool GizmoPress(const QPointF& p); virtual void GizmoMove(const QPointF& p); diff --git a/app/node/param.cpp b/app/node/param.cpp index 2e401b34a..b8f25249c 100644 --- a/app/node/param.cpp +++ b/app/node/param.cpp @@ -71,14 +71,13 @@ Node *NodeParam::parentNode() const { QObject* p = parent(); - while (p != nullptr) { - // Determine if this object is a Node or not + while (p) { Node* cast_test = dynamic_cast(p); - if (cast_test != nullptr) { + if (cast_test) { return cast_test; + } else { + p = p->parent(); } - - p = p->parent(); } return nullptr; diff --git a/app/widget/viewer/viewerdisplay.cpp b/app/widget/viewer/viewerdisplay.cpp index ced00dd6b..22af4c754 100644 --- a/app/widget/viewer/viewerdisplay.cpp +++ b/app/widget/viewer/viewerdisplay.cpp @@ -299,12 +299,7 @@ void ViewerDisplayWidget::paintGL() NodeValueDatabase db = gt.GenerateDatabase(gizmos_, TimeRange(node_time, node_time)); QPainter p(this); - - // Scale so that gizmos can just draw on the buffer - QPointF tex_point = GetTexturePosition(size()); - p.scale(tex_point.x(), tex_point.y()); - - gizmos_->DrawGizmos(db, &p); + gizmos_->DrawGizmos(db, &p, QVector2D(GetTexturePosition(size()))); } // Draw action/title safe areas