implemented core gizmo interaction functionality

This commit is contained in:
itsmattkc
2020-05-07 04:45:27 +10:00
parent 2eb753e99d
commit d02e9090b9
9 changed files with 95 additions and 36 deletions
+2 -2
View File
@@ -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
{
+2 -2
View File
@@ -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;
+64 -15
View File
@@ -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
+11 -6
View File
@@ -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
View File
@@ -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
View File
@@ -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;