implemented core gizmo interaction functionality
This commit is contained in:
@@ -97,6 +97,7 @@ NodeValueTable MatrixGenerator::Value(NodeValueDatabase &value) const
|
||||
return output;
|
||||
}
|
||||
|
||||
/*
|
||||
bool MatrixGenerator::HasGizmos() const
|
||||
{
|
||||
return true;
|
||||
@@ -105,7 +106,6 @@ bool MatrixGenerator::HasGizmos() const
|
||||
void MatrixGenerator::DrawGizmos(NodeValueDatabase &db, QPainter *p, const QVector2D &scale) const
|
||||
{
|
||||
// FIXME: Implement this properly
|
||||
/*
|
||||
p->setPen(Qt::white);
|
||||
|
||||
// Fold values into a matrix
|
||||
@@ -116,8 +116,8 @@ void MatrixGenerator::DrawGizmos(NodeValueDatabase &db, QPainter *p, const QVect
|
||||
|
||||
// Draw ellipse
|
||||
p->drawEllipse(QRect(0, 0, 100, 100));
|
||||
*/
|
||||
}
|
||||
*/
|
||||
|
||||
QMatrix4x4 MatrixGenerator::GenerateMatrix(NodeValueDatabase &value) const
|
||||
{
|
||||
|
||||
@@ -43,8 +43,8 @@ public:
|
||||
|
||||
virtual NodeValueTable Value(NodeValueDatabase& value) const override;
|
||||
|
||||
virtual bool HasGizmos() const override;
|
||||
virtual void DrawGizmos(NodeValueDatabase& db, QPainter *p, const QVector2D &scale) const override;
|
||||
//virtual bool HasGizmos() const override;
|
||||
//virtual void DrawGizmos(NodeValueDatabase& db, QPainter *p, const QVector2D &scale) const override;
|
||||
|
||||
private:
|
||||
QMatrix4x4 GenerateMatrix(NodeValueDatabase& value) const;
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
|
||||
#include "polygon.h"
|
||||
|
||||
#include <QGuiApplication>
|
||||
#include <QVector2D>
|
||||
|
||||
OLIVE_NAMESPACE_ENTER
|
||||
@@ -99,30 +100,20 @@ bool PolygonGenerator::HasGizmos() const
|
||||
return true;
|
||||
}
|
||||
|
||||
void PolygonGenerator::DrawGizmos(NodeValueDatabase &db, QPainter *p, const QVector2D &scale) const
|
||||
void PolygonGenerator::DrawGizmos(const NodeValueDatabase &db, QPainter *p, const QVector2D &scale) const
|
||||
{
|
||||
if (!points_input_->GetSize()) {
|
||||
return;
|
||||
}
|
||||
|
||||
QVector<QPointF> points(points_input_->GetSize());
|
||||
|
||||
p->setPen(Qt::white);
|
||||
p->setBrush(Qt::white);
|
||||
|
||||
int rect_sz = p->fontMetrics().height() / 8;
|
||||
QVector<QPointF> points = GetGizmoCoordinates(db, scale);
|
||||
QVector<QRectF> rects = GetGizmoRects(points);
|
||||
|
||||
for (int i=0;i<points_input_->GetSize();i++) {
|
||||
QVector2D v = db[points_input_->At(i)].Take(NodeParam::kVec2).value<QVector2D>();
|
||||
|
||||
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);
|
||||
foreach (const QRectF& r, rects) {
|
||||
p->drawRect(r);
|
||||
}
|
||||
|
||||
points.append(points.first());
|
||||
@@ -130,4 +121,62 @@ void PolygonGenerator::DrawGizmos(NodeValueDatabase &db, QPainter *p, const QVec
|
||||
p->drawPolyline(points.constData(), points.size());
|
||||
}
|
||||
|
||||
bool PolygonGenerator::GizmoPress(const NodeValueDatabase &db, const QPointF &p, const QVector2D &scale)
|
||||
{
|
||||
QVector<QPointF> points = GetGizmoCoordinates(db, scale);
|
||||
QVector<QRectF> rects = GetGizmoRects(points);
|
||||
|
||||
for (int i=0;i<rects.size();i++) {
|
||||
const QRectF& r = rects.at(i);
|
||||
|
||||
if (r.contains(p)) {
|
||||
gizmo_drag_ = points_input_->At(i);
|
||||
gizmo_drag_start_ = points.at(i);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void PolygonGenerator::GizmoMove(const QPointF &p, const QVector2D &scale)
|
||||
{
|
||||
QVector2D new_pos = QVector2D(p) / scale;
|
||||
|
||||
gizmo_drag_->set_standard_value(new_pos.x(), 0);
|
||||
gizmo_drag_->set_standard_value(new_pos.y(), 1);
|
||||
}
|
||||
|
||||
QVector<QPointF> PolygonGenerator::GetGizmoCoordinates(const NodeValueDatabase &db, const QVector2D& scale) const
|
||||
{
|
||||
QVector<QPointF> points(points_input_->GetSize());
|
||||
|
||||
for (int i=0;i<points_input_->GetSize();i++) {
|
||||
QVector2D v = db[points_input_->At(i)].Get(NodeParam::kVec2).value<QVector2D>();
|
||||
|
||||
v *= scale;
|
||||
|
||||
QPointF pt = v.toPointF();
|
||||
points[i] = pt;
|
||||
}
|
||||
|
||||
return points;
|
||||
}
|
||||
|
||||
QVector<QRectF> PolygonGenerator::GetGizmoRects(const QVector<QPointF> &points) const
|
||||
{
|
||||
QVector<QRectF> rects(points.size());
|
||||
|
||||
int rect_sz = QFontMetrics(qApp->font()).height() / 8;
|
||||
|
||||
for (int i=0;i<points.size();i++) {
|
||||
const QPointF& p = points.at(i);
|
||||
|
||||
rects[i] = QRectF(p - QPointF(rect_sz, rect_sz),
|
||||
p + QPointF(rect_sz, rect_sz));
|
||||
}
|
||||
|
||||
return rects;
|
||||
}
|
||||
|
||||
OLIVE_NAMESPACE_EXIT
|
||||
|
||||
@@ -43,19 +43,24 @@ public:
|
||||
virtual QString ShaderFragmentCode(const NodeValueDatabase&) const override;
|
||||
|
||||
virtual bool HasGizmos() const override;
|
||||
virtual void DrawGizmos(NodeValueDatabase& db, QPainter *p, const QVector2D &scale) const override;
|
||||
virtual void DrawGizmos(const NodeValueDatabase& db, QPainter *p, const QVector2D &scale) const override;
|
||||
|
||||
/*
|
||||
virtual bool GizmoPress(const QPointF &p) override;
|
||||
virtual void GizmoMove(const QPointF &p) override;
|
||||
virtual void GizmoRelease(const QPointF &p) override;
|
||||
*/
|
||||
virtual bool GizmoPress(const NodeValueDatabase& db, const QPointF &p, const QVector2D &scale) override;
|
||||
virtual void GizmoMove(const QPointF &p, const QVector2D &scale) override;
|
||||
//virtual void GizmoRelease(const QPointF &p) override;
|
||||
|
||||
private:
|
||||
QVector<QPointF> GetGizmoCoordinates(const NodeValueDatabase &db, const QVector2D &scale) const;
|
||||
|
||||
QVector<QRectF> GetGizmoRects(const QVector<QPointF>& points) const;
|
||||
|
||||
NodeInputArray* points_input_;
|
||||
|
||||
NodeInput* color_input_;
|
||||
|
||||
NodeInput* gizmo_drag_;
|
||||
QPointF gizmo_drag_start_;
|
||||
|
||||
};
|
||||
|
||||
OLIVE_NAMESPACE_EXIT
|
||||
|
||||
+3
-3
@@ -287,16 +287,16 @@ bool Node::HasGizmos() const
|
||||
return false;
|
||||
}
|
||||
|
||||
void Node::DrawGizmos(NodeValueDatabase &, QPainter *, const QVector2D &) const
|
||||
void Node::DrawGizmos(const NodeValueDatabase &, QPainter *, const QVector2D &) const
|
||||
{
|
||||
}
|
||||
|
||||
bool Node::GizmoPress(const QPointF &)
|
||||
bool Node::GizmoPress(const NodeValueDatabase &, const QPointF &, const QVector2D &)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
void Node::GizmoMove(const QPointF &)
|
||||
void Node::GizmoMove(const QPointF &, const QVector2D &)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
+3
-3
@@ -383,10 +383,10 @@ public:
|
||||
|
||||
virtual bool HasGizmos() const;
|
||||
|
||||
virtual void DrawGizmos(NodeValueDatabase& db, QPainter* p, const QVector2D &scale) const;
|
||||
virtual void DrawGizmos(const NodeValueDatabase& db, QPainter* p, const QVector2D &scale) const;
|
||||
|
||||
virtual bool GizmoPress(const QPointF& p);
|
||||
virtual void GizmoMove(const QPointF& p);
|
||||
virtual bool GizmoPress(const NodeValueDatabase& db, const QPointF& p, const QVector2D &scale);
|
||||
virtual void GizmoMove(const QPointF& p, const QVector2D &scale);
|
||||
virtual void GizmoRelease(const QPointF& p);
|
||||
|
||||
const QString& GetLabel() const;
|
||||
|
||||
@@ -31,9 +31,12 @@ NodeParamViewArrayWidget::NodeParamViewArrayWidget(NodeInputArray* array, QWidge
|
||||
QHBoxLayout* layout = new QHBoxLayout(this);
|
||||
|
||||
count_lbl_ = new QLabel();
|
||||
layout->addWidget(count_lbl_, 1);
|
||||
layout->addWidget(count_lbl_);
|
||||
|
||||
layout->addStretch();
|
||||
|
||||
plus_btn_ = new QPushButton(tr("+"));
|
||||
plus_btn_->setFixedWidth(plus_btn_->sizeHint().height());
|
||||
layout->addWidget(plus_btn_);
|
||||
|
||||
connect(plus_btn_, &QPushButton::clicked, this, &NodeParamViewArrayWidget::AddElement);
|
||||
|
||||
@@ -192,7 +192,7 @@ void ViewerDisplayWidget::SetTime(const rational &time)
|
||||
void ViewerDisplayWidget::mousePressEvent(QMouseEvent *event)
|
||||
{
|
||||
if (gizmos_) {
|
||||
if (gizmos_->GizmoPress(GetTexturePosition(event->pos()))) {
|
||||
if (gizmos_->GizmoPress(gizmo_db_, event->pos(), QVector2D(GetTexturePosition(size())))) {
|
||||
gizmo_click_ = true;
|
||||
return;
|
||||
}
|
||||
@@ -206,7 +206,7 @@ void ViewerDisplayWidget::mousePressEvent(QMouseEvent *event)
|
||||
void ViewerDisplayWidget::mouseMoveEvent(QMouseEvent *event)
|
||||
{
|
||||
if (gizmo_click_) {
|
||||
gizmos_->GizmoMove(GetTexturePosition(event->pos()));
|
||||
gizmos_->GizmoMove(event->pos(), QVector2D(GetTexturePosition(size())));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -296,10 +296,10 @@ void ViewerDisplayWidget::paintGL()
|
||||
|
||||
rational node_time = GetAdjustedTime(GetTimeTarget(), gizmos_, time_, NodeParam::kInput);
|
||||
|
||||
NodeValueDatabase db = gt.GenerateDatabase(gizmos_, TimeRange(node_time, node_time));
|
||||
gizmo_db_ = gt.GenerateDatabase(gizmos_, TimeRange(node_time, node_time));
|
||||
|
||||
QPainter p(this);
|
||||
gizmos_->DrawGizmos(db, &p, QVector2D(GetTexturePosition(size())));
|
||||
gizmos_->DrawGizmos(gizmo_db_, &p, QVector2D(GetTexturePosition(size())));
|
||||
}
|
||||
|
||||
// Draw action/title safe areas
|
||||
|
||||
@@ -189,6 +189,8 @@ private:
|
||||
|
||||
Node* gizmos_;
|
||||
|
||||
NodeValueDatabase gizmo_db_;
|
||||
|
||||
VideoRenderingParams gizmo_params_;
|
||||
|
||||
bool gizmo_click_;
|
||||
|
||||
Reference in New Issue
Block a user