implemented gizmo transforming through the node graph

This commit is contained in:
itsmattkc
2022-05-15 14:36:30 -07:00
parent a2ff3d607a
commit e9844ee135
15 changed files with 157 additions and 79 deletions
+38 -13
View File
@@ -45,7 +45,6 @@
#include "node/gizmo/point.h"
#include "node/gizmo/polygon.h"
#include "node/gizmo/screen.h"
#include "node/traverser.h"
#include "viewertexteditor.h"
#include "window/mainwindow/mainwindow.h"
@@ -221,7 +220,7 @@ QPointF ViewerDisplayWidget::TransformViewerSpaceToBufferSpace(const QPointF &po
* Inversion will only fail if the viewer has been scaled by 0 in any direction
* which I think should never happen.
*/
return pos * GenerateGizmoTransform().inverted();
return pos * GenerateDisplayTransform().inverted();
}
void ViewerDisplayWidget::ResetFPSTimer()
@@ -253,7 +252,8 @@ void ViewerDisplayWidget::mousePressEvent(QMouseEvent *event)
add_band_->show();
} else if (event->button() == Qt::LeftButton && gizmos_
&& (current_gizmo_ = TryGizmoPress(gizmo_db_, TransformViewerSpaceToBufferSpace(event->pos())))) {
&& (gizmo_last_draw_transform_inverted_ = gizmo_last_draw_transform_.inverted(),
current_gizmo_ = TryGizmoPress(gizmo_db_, event->pos() * gizmo_last_draw_transform_inverted_))) {
// Handle gizmo click
gizmo_start_drag_ = event->pos();
@@ -300,7 +300,7 @@ void ViewerDisplayWidget::mouseMoveEvent(QMouseEvent *event)
// Signal movement
if (DraggableGizmo *draggable = dynamic_cast<DraggableGizmo*>(current_gizmo_)) {
if (!gizmo_drag_started_) {
QPointF start = TransformViewerSpaceToBufferSpace(gizmo_start_drag_);
QPointF start = gizmo_start_drag_ * gizmo_last_draw_transform_inverted_;
rational gizmo_time = GetGizmoTime();
NodeTraverser t;
@@ -311,17 +311,17 @@ void ViewerDisplayWidget::mouseMoveEvent(QMouseEvent *event)
gizmo_drag_started_ = true;
}
QPointF v = TransformViewerSpaceToBufferSpace(event->pos());
QPointF v = event->pos() * gizmo_last_draw_transform_inverted_;
switch (draggable->GetDragValueBehavior()) {
case DraggableGizmo::kAbsolute:
// Above value is correct
break;
case DraggableGizmo::kDeltaFromPrevious:
v -= TransformViewerSpaceToBufferSpace(gizmo_last_drag_);
v -= gizmo_last_drag_ * gizmo_last_draw_transform_inverted_;
gizmo_last_drag_ = event->pos();
break;
case DraggableGizmo::kDeltaFromStart:
v -= TransformViewerSpaceToBufferSpace(gizmo_start_drag_);
v -= gizmo_start_drag_ * gizmo_last_draw_transform_inverted_;
break;
}
@@ -349,7 +349,7 @@ void ViewerDisplayWidget::mouseReleaseEvent(QMouseEvent *event)
const QRect &band_rect = add_band_->geometry();
if (band_rect.width() > 1 && band_rect.height() > 1) {
QRectF r = GenerateGizmoTransform().inverted().mapRect(add_band_->geometry());
QRectF r = GenerateDisplayTransform().inverted().mapRect(add_band_->geometry());
emit CreateAddableAt(r);
}
@@ -510,7 +510,8 @@ void ViewerDisplayWidget::OnPaint()
gizmo_db_ = gt.GenerateRow(gizmos_, range);
QPainter p(inner_widget());
p.setWorldTransform(GenerateGizmoTransform());
gizmo_last_draw_transform_ = GenerateGizmoTransform(gt, range);
p.setWorldTransform(gizmo_last_draw_transform_);
gizmos_->UpdateGizmoPositions(gizmo_db_, NodeTraverser::GenerateGlobals(gizmo_params_, range));
foreach (NodeGizmo *gizmo, gizmos_->GetGizmos()) {
@@ -722,7 +723,7 @@ QTransform ViewerDisplayWidget::GenerateWorldTransform()
return world;
}
QTransform ViewerDisplayWidget::GenerateGizmoTransform()
QTransform ViewerDisplayWidget::GenerateDisplayTransform()
{
QVector2D viewer_scale(GetTexturePosition(size()));
QTransform gizmo_transform = GenerateWorldTransform();
@@ -731,13 +732,37 @@ QTransform ViewerDisplayWidget::GenerateGizmoTransform()
return gizmo_transform;
}
QTransform ViewerDisplayWidget::GenerateGizmoTransform(NodeTraverser &gt, const TimeRange &range)
{
QTransform t = GenerateDisplayTransform();
if (GetTimeTarget()) {
t.translate(gizmo_params_.width()*0.5, gizmo_params_.height()*0.5);
Node *target = GetTimeTarget();
if (ViewerOutput *v = dynamic_cast<ViewerOutput *>(target)) {
if (Node *n = v->GetConnectedTextureOutput()) {
target = n;
}
}
QTransform nt;
gt.Transform(&nt, gizmos_, target, range);
t = nt * t;
t.translate(-gizmo_params_.width()*0.5, -gizmo_params_.height()*0.5);
}
return t;
}
NodeGizmo *ViewerDisplayWidget::TryGizmoPress(const NodeValueRow &row, const QPointF &p)
{
for (auto it=gizmos_->GetGizmos().crbegin(); it!=gizmos_->GetGizmos().crend(); it++) {
NodeGizmo *gizmo = *it;
if (gizmo->IsVisible()) {
if (PointGizmo *point = dynamic_cast<PointGizmo*>(gizmo)) {
if (point->GetClickingRect(GenerateGizmoTransform()).contains(p)) {
if (point->GetClickingRect(GenerateDisplayTransform()).contains(p)) {
return point;
}
} else if (PolygonGizmo *poly = dynamic_cast<PolygonGizmo*>(gizmo)) {
@@ -760,7 +785,7 @@ NodeGizmo *ViewerDisplayWidget::TryGizmoPress(const NodeValueRow &row, const QPo
void ViewerDisplayWidget::OpenTextGizmo(TextGizmo *text, QMouseEvent *event)
{
QTransform gizmo_transform = GenerateGizmoTransform();
QTransform gizmo_transform = GenerateDisplayTransform();
ViewerTextEditor *text_edit = new ViewerTextEditor(gizmo_transform.m11(), this);
Html::HtmlToDoc(text_edit->document(), text->GetHtml());
@@ -821,7 +846,7 @@ void ViewerDisplayWidget::EmitColorAtCursor(QMouseEvent *e)
Color reference, display;
if (texture_) {
QPointF pixel_pos = GenerateGizmoTransform().inverted().map(e->pos());
QPointF pixel_pos = GenerateDisplayTransform().inverted().map(e->pos());
pixel_pos /= texture_->params().divider();
reference = renderer()->GetPixelFromTexture(texture_.get(), pixel_pos);