From 0703a5851b3ff5c777e63ae5ea5c0b3a48187e88 Mon Sep 17 00:00:00 2001 From: BrimsonBhin <40442071+BrimsonBhin@users.noreply.github.com> Date: Thu, 23 Apr 2020 22:02:47 -0700 Subject: [PATCH 1/3] Gaussian Blur: Use straight multiply MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Results are identical (tested with Olive 0.1.x). Using a straight multiply is faster if the compiler doesn't optimize pow(). It's also safer because with pow(), [the result is undefined if x<0 or if x=0 and y≤0](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/pow.xhtml). --- app/shaders/blur.frag | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/shaders/blur.frag b/app/shaders/blur.frag index 1e520a996..65092c9cf 100644 --- a/app/shaders/blur.frag +++ b/app/shaders/blur.frag @@ -29,7 +29,7 @@ out vec4 fragColor; // Double gaussian formula, actually used in the code below // Should be faster than the single gaussian above since it doesn't need sqrt() float gaussian2(float x, float y, float sigma) { - return (1.0/(pow(sigma, 2.0)*2.0*M_PI))*exp(-0.5*((pow(x, 2.0) + pow(y, 2.0))/pow(sigma, 2.0))); + return (1.0/((sigma*sigma)*2.0*M_PI))*exp(-0.5*(((x*x) + (y*y))/(sigma*sigma))); } void main(void) { From 366945fd29e0b944f2ce62a95b712a08cf790bcf Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 29 Apr 2020 03:57:49 +1000 Subject: [PATCH 2/3] add rdynamic to the linux build options This appears to be necessary for debug symbols to show in the crash handler. --- app/CMakeLists.txt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 24f7d9116..0c9c4661f 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -107,6 +107,14 @@ else() ) endif() +if(UNIX AND NOT APPLE) + target_compile_options( + ${OLIVE_TARGET} + PRIVATE + -rdynamic + ) +endif() + # Set include directories target_include_directories( ${OLIVE_TARGET} From 8ab91a70ccd6a903977d27d4a31ec2ba2f7bf6fb Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 29 Apr 2020 04:56:58 +1000 Subject: [PATCH 3/3] nodeview: implemented moving with either the hand tool or middle mouse button Includes splitting off this functionality from TimelineViewBase so it can be re-used in any QGraphicsView. --- app/widget/nodeview/nodeview.cpp | 21 +++- app/widget/nodeview/nodeview.h | 5 +- app/widget/timelinewidget/view/CMakeLists.txt | 2 + .../timelinewidget/view/handmovableview.cpp | 118 ++++++++++++++++++ .../timelinewidget/view/handmovableview.h | 59 +++++++++ .../timelinewidget/view/timelineviewbase.cpp | 90 +------------ .../timelinewidget/view/timelineviewbase.h | 19 +-- 7 files changed, 202 insertions(+), 112 deletions(-) create mode 100644 app/widget/timelinewidget/view/handmovableview.cpp create mode 100644 app/widget/timelinewidget/view/handmovableview.h diff --git a/app/widget/nodeview/nodeview.cpp b/app/widget/nodeview/nodeview.cpp index 5483d50cf..fb301fd75 100644 --- a/app/widget/nodeview/nodeview.cpp +++ b/app/widget/nodeview/nodeview.cpp @@ -26,10 +26,12 @@ #include "nodeviewundo.h" #include "node/factory.h" +#define super HandMovableView + OLIVE_NAMESPACE_ENTER NodeView::NodeView(QWidget *parent) : - QGraphicsView(parent), + HandMovableView(parent), graph_(nullptr), attached_item_(nullptr), drop_edge_(nullptr) @@ -196,7 +198,7 @@ void NodeView::ItemsChanged() void NodeView::keyPressEvent(QKeyEvent *event) { - QGraphicsView::keyPressEvent(event); + super::keyPressEvent(event); if (event->key() == Qt::Key_Escape && attached_item_) { DetachItemFromCursor(); @@ -209,6 +211,8 @@ void NodeView::keyPressEvent(QKeyEvent *event) void NodeView::mousePressEvent(QMouseEvent *event) { + if (HandPress(event)) return; + if (attached_item_) { Node* dropping_node = attached_item_->GetNode(); @@ -233,12 +237,14 @@ void NodeView::mousePressEvent(QMouseEvent *event) drop_edge_ = nullptr; } - QGraphicsView::mousePressEvent(event); + super::mousePressEvent(event); } void NodeView::mouseMoveEvent(QMouseEvent *event) { - QGraphicsView::mouseMoveEvent(event); + if (HandMove(event)) return; + + super::mouseMoveEvent(event); if (attached_item_) { attached_item_->setPos(mapToScene(event->pos())); @@ -296,6 +302,13 @@ void NodeView::mouseMoveEvent(QMouseEvent *event) } } +void NodeView::mouseReleaseEvent(QMouseEvent *event) +{ + if (HandRelease(event)) return; + + super::mouseReleaseEvent(event); +} + void NodeView::wheelEvent(QWheelEvent *event) { if (event->modifiers() & Qt::ControlModifier) { diff --git a/app/widget/nodeview/nodeview.h b/app/widget/nodeview/nodeview.h index 05d72464e..c4f00a3e2 100644 --- a/app/widget/nodeview/nodeview.h +++ b/app/widget/nodeview/nodeview.h @@ -26,6 +26,7 @@ #include "node/graph.h" #include "nodeviewscene.h" +#include "widget/timelinewidget/view/handmovableview.h" #include "widget/nodecopypaste/nodecopypaste.h" OLIVE_NAMESPACE_ENTER @@ -36,7 +37,7 @@ OLIVE_NAMESPACE_ENTER * This widget takes a NodeGraph object and constructs a QGraphicsScene representing its data, viewing and allowing * the user to make modifications to it. */ -class NodeView : public QGraphicsView, public NodeCopyPasteWidget +class NodeView : public HandMovableView, public NodeCopyPasteWidget { Q_OBJECT public: @@ -73,8 +74,8 @@ protected: virtual void keyPressEvent(QKeyEvent *event) override; virtual void mousePressEvent(QMouseEvent *event) override; - virtual void mouseMoveEvent(QMouseEvent *event) override; + virtual void mouseReleaseEvent(QMouseEvent* event) override; virtual void wheelEvent(QWheelEvent* event) override; diff --git a/app/widget/timelinewidget/view/CMakeLists.txt b/app/widget/timelinewidget/view/CMakeLists.txt index 5bbce0175..c2da0eead 100644 --- a/app/widget/timelinewidget/view/CMakeLists.txt +++ b/app/widget/timelinewidget/view/CMakeLists.txt @@ -16,6 +16,8 @@ set(OLIVE_SOURCES ${OLIVE_SOURCES} + widget/timelinewidget/view/handmovableview.h + widget/timelinewidget/view/handmovableview.cpp widget/timelinewidget/view/timelineplayhead.h widget/timelinewidget/view/timelineplayhead.cpp widget/timelinewidget/view/timelineview.h diff --git a/app/widget/timelinewidget/view/handmovableview.cpp b/app/widget/timelinewidget/view/handmovableview.cpp new file mode 100644 index 000000000..f0995eb7b --- /dev/null +++ b/app/widget/timelinewidget/view/handmovableview.cpp @@ -0,0 +1,118 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#include "handmovableview.h" + +#include + +#include "core.h" + +OLIVE_NAMESPACE_ENTER + +HandMovableView::HandMovableView(QWidget* parent) : + QGraphicsView(parent), + dragging_hand_(false) +{ + connect(Core::instance(), &Core::ToolChanged, this, &HandMovableView::ApplicationToolChanged); +} + +void HandMovableView::ApplicationToolChanged(Tool::Item tool) +{ + if (tool == Tool::kHand) { + setDragMode(ScrollHandDrag); + } else { + setDragMode(default_drag_mode_); + } + + ToolChangedEvent(tool); +} + +bool HandMovableView::HandPress(QMouseEvent *event) +{ + if (event->button() == Qt::MiddleButton) { + pre_hand_drag_mode_ = dragMode(); + dragging_hand_ = true; + + setDragMode(ScrollHandDrag); + + // Transform mouse event to act like the left button is pressed + QMouseEvent transformed(event->type(), + event->localPos(), + Qt::LeftButton, + Qt::LeftButton, + event->modifiers()); + + QGraphicsView::mousePressEvent(&transformed); + + return true; + } + + return false; +} + +bool HandMovableView::HandMove(QMouseEvent *event) +{ + if (dragging_hand_) { + // Transform mouse event to act like the left button is pressed + QMouseEvent transformed(event->type(), + event->localPos(), + Qt::LeftButton, + Qt::LeftButton, + event->modifiers()); + + QGraphicsView::mouseMoveEvent(&transformed); + } + return dragging_hand_; +} + +bool HandMovableView::HandRelease(QMouseEvent *event) +{ + if (dragging_hand_) { + // Transform mouse event to act like the left button is pressed + QMouseEvent transformed(event->type(), + event->localPos(), + Qt::LeftButton, + Qt::LeftButton, + event->modifiers()); + + QGraphicsView::mouseReleaseEvent(&transformed); + + setDragMode(pre_hand_drag_mode_); + + dragging_hand_ = false; + + return true; + } + + return false; +} + +void HandMovableView::SetDefaultDragMode(QGraphicsView::DragMode mode) +{ + default_drag_mode_ = mode; + setDragMode(default_drag_mode_); +} + +const QGraphicsView::DragMode &HandMovableView::GetDefaultDragMode() const +{ + return default_drag_mode_; +} + +OLIVE_NAMESPACE_EXIT diff --git a/app/widget/timelinewidget/view/handmovableview.h b/app/widget/timelinewidget/view/handmovableview.h new file mode 100644 index 000000000..9224069c7 --- /dev/null +++ b/app/widget/timelinewidget/view/handmovableview.h @@ -0,0 +1,59 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#ifndef HANDMOVABLEVIEW_H +#define HANDMOVABLEVIEW_H + +#include + +#include "tool/tool.h" + +OLIVE_NAMESPACE_ENTER + +class HandMovableView : public QGraphicsView +{ + Q_OBJECT +public: + HandMovableView(QWidget* parent = nullptr); + +protected: + virtual void ToolChangedEvent(Tool::Item tool){Q_UNUSED(tool)} + + bool HandPress(QMouseEvent* event); + bool HandMove(QMouseEvent* event); + bool HandRelease(QMouseEvent* event); + + void SetDefaultDragMode(DragMode mode); + const DragMode& GetDefaultDragMode() const; + +private: + bool dragging_hand_; + DragMode pre_hand_drag_mode_; + + DragMode default_drag_mode_; + +private slots: + void ApplicationToolChanged(Tool::Item tool); + +}; + +OLIVE_NAMESPACE_EXIT + +#endif // HANDMOVABLEVIEW_H diff --git a/app/widget/timelinewidget/view/timelineviewbase.cpp b/app/widget/timelinewidget/view/timelineviewbase.cpp index 31f53b586..9970e7115 100644 --- a/app/widget/timelinewidget/view/timelineviewbase.cpp +++ b/app/widget/timelinewidget/view/timelineviewbase.cpp @@ -34,12 +34,11 @@ OLIVE_NAMESPACE_ENTER const double TimelineViewBase::kMaximumScale = 8192; TimelineViewBase::TimelineViewBase(QWidget *parent) : - QGraphicsView(parent), + HandMovableView(parent), playhead_(0), playhead_scene_left_(-1), playhead_scene_right_(-1), dragging_playhead_(false), - dragging_hand_(false), limit_y_axis_(false) { setScene(&scene_); @@ -50,7 +49,6 @@ TimelineViewBase::TimelineViewBase(QWidget *parent) : SetDefaultDragMode(NoDrag); connect(&scene_, SIGNAL(changed(const QList&)), this, SLOT(UpdateSceneRect())); - connect(Core::instance(), &Core::ToolChanged, this, &TimelineViewBase::ApplicationToolChanged); SetMaximumScale(kMaximumScale); } @@ -100,17 +98,6 @@ rational TimelineViewBase::GetPlayheadTime() const return Timecode::timestamp_to_time(playhead_, timebase()); } -void TimelineViewBase::SetDefaultDragMode(QGraphicsView::DragMode mode) -{ - default_drag_mode_ = mode; - setDragMode(default_drag_mode_); -} - -const QGraphicsView::DragMode &TimelineViewBase::GetDefaultDragMode() const -{ - return default_drag_mode_; -} - bool TimelineViewBase::PlayheadPress(QMouseEvent *event) { QPointF scene_pos = mapToScene(event->pos()); @@ -148,70 +135,6 @@ bool TimelineViewBase::PlayheadRelease(QMouseEvent*) return false; } -bool TimelineViewBase::HandPress(QMouseEvent *event) -{ - if (event->button() == Qt::MiddleButton) { - pre_hand_drag_mode_ = dragMode(); - dragging_hand_ = true; - - setDragMode(ScrollHandDrag); - - // Transform mouse event to act like the left button is pressed - QMouseEvent transformed(event->type(), - event->localPos(), - Qt::LeftButton, - Qt::LeftButton, - event->modifiers()); - - QGraphicsView::mousePressEvent(&transformed); - - return true; - } - - return false; -} - -bool TimelineViewBase::HandMove(QMouseEvent *event) -{ - if (dragging_hand_) { - // Transform mouse event to act like the left button is pressed - QMouseEvent transformed(event->type(), - event->localPos(), - Qt::LeftButton, - Qt::LeftButton, - event->modifiers()); - - QGraphicsView::mouseMoveEvent(&transformed); - } - return dragging_hand_; -} - -bool TimelineViewBase::HandRelease(QMouseEvent *event) -{ - if (dragging_hand_) { - // Transform mouse event to act like the left button is pressed - QMouseEvent transformed(event->type(), - event->localPos(), - Qt::LeftButton, - Qt::LeftButton, - event->modifiers()); - - QGraphicsView::mouseReleaseEvent(&transformed); - - setDragMode(pre_hand_drag_mode_); - - dragging_hand_ = false; - - return true; - } - - return false; -} - -void TimelineViewBase::ToolChangedEvent(Tool::Item) -{ -} - qreal TimelineViewBase::GetPlayheadX() { return TimeToScene(Timecode::timestamp_to_time(playhead_, timebase())); @@ -305,15 +228,4 @@ void TimelineViewBase::SetLimitYAxis(bool) UpdateSceneRect(); } -void TimelineViewBase::ApplicationToolChanged(Tool::Item tool) -{ - if (tool == Tool::kHand) { - setDragMode(ScrollHandDrag); - } else { - setDragMode(default_drag_mode_); - } - - ToolChangedEvent(tool); -} - OLIVE_NAMESPACE_EXIT diff --git a/app/widget/timelinewidget/view/timelineviewbase.h b/app/widget/timelinewidget/view/timelineviewbase.h index c64718bb6..55eb9ff62 100644 --- a/app/widget/timelinewidget/view/timelineviewbase.h +++ b/app/widget/timelinewidget/view/timelineviewbase.h @@ -24,12 +24,13 @@ #include #include "core.h" +#include "handmovableview.h" #include "timelineplayhead.h" #include "widget/timelinewidget/timelinescaledobject.h" OLIVE_NAMESPACE_ENTER -class TimelineViewBase : public QGraphicsView, public TimelineScaledObject +class TimelineViewBase : public HandMovableView, public TimelineScaledObject { Q_OBJECT public: @@ -66,19 +67,10 @@ protected: rational GetPlayheadTime() const; - void SetDefaultDragMode(DragMode mode); - const DragMode& GetDefaultDragMode() const; - bool PlayheadPress(QMouseEvent* event); bool PlayheadMove(QMouseEvent* event); bool PlayheadRelease(QMouseEvent* event); - bool HandPress(QMouseEvent* event); - bool HandMove(QMouseEvent* event); - bool HandRelease(QMouseEvent* event); - - virtual void ToolChangedEvent(Tool::Item tool); - virtual void TimebaseChangedEvent(const rational &) override; private: @@ -93,15 +85,10 @@ private: bool dragging_playhead_; - bool dragging_hand_; - DragMode pre_hand_drag_mode_; - QGraphicsScene scene_; bool limit_y_axis_; - DragMode default_drag_mode_; - rational end_time_; private slots: @@ -118,8 +105,6 @@ private slots: */ void PageScrollToPlayhead(); - void ApplicationToolChanged(Tool::Item tool); - }; OLIVE_NAMESPACE_EXIT