From 8350ce300ff95fa9bc651e4eaf44ffacab294981 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 15 Jul 2021 20:59:37 -0700 Subject: [PATCH] cache: improved invalidation system --- app/core.cpp | 3 ++- app/core.h | 9 +++++++ app/render/previewautocacher.cpp | 25 ++++++++----------- app/render/previewautocacher.h | 12 --------- .../nodeparamviewwidgetbridge.cpp | 25 ++++++++----------- app/widget/slider/base/numericsliderbase.cpp | 12 ++++++++- app/widget/slider/base/numericsliderbase.h | 4 +++ 7 files changed, 46 insertions(+), 44 deletions(-) diff --git a/app/core.cpp b/app/core.cpp index 0938330af..a4075b0a0 100644 --- a/app/core.cpp +++ b/app/core.cpp @@ -82,7 +82,8 @@ Core::Core(const CoreParams& params) : tool_(Tool::kPointer), addable_object_(Tool::kAddableEmpty), snapping_(true), - core_params_(params) + core_params_(params), + effects_slider_is_being_dragged_(false) { // Store reference to this object, making the assumption that Core will only ever be made in // main(). This will obviously break if not. diff --git a/app/core.h b/app/core.h index 67fb6a95d..83658d163 100644 --- a/app/core.h +++ b/app/core.h @@ -304,6 +304,10 @@ public: void OpenNodeInViewer(ViewerOutput* viewer); + bool EffectsSliderIsBeingDragged() const {return effects_slider_is_being_dragged_;} + + void SetEffectsSliderIsBeingDragged(bool e) {effects_slider_is_being_dragged_ = e;} + static const uint kProjectVersion; public slots: @@ -571,6 +575,11 @@ private: */ QVector autorecovered_projects_; + /** + * @brief An effects slider somewhere is being dragged + */ + bool effects_slider_is_being_dragged_; + private slots: void SaveAutorecovery(); diff --git a/app/render/previewautocacher.cpp b/app/render/previewautocacher.cpp index ce2c4fe5d..5801bd532 100644 --- a/app/render/previewautocacher.cpp +++ b/app/render/previewautocacher.cpp @@ -4,6 +4,7 @@ #include #include "codec/conformmanager.h" +#include "core.h" #include "node/project/project.h" #include "render/rendermanager.h" #include "render/renderprocessor.h" @@ -14,12 +15,11 @@ PreviewAutoCacher::PreviewAutoCacher() : viewer_node_(nullptr), has_changed_(false), use_custom_range_(false), - single_frame_render_(nullptr), - ignore_next_mouse_button_(false) + single_frame_render_(nullptr) { paused_ = !Config::Current()[QStringLiteral("AutoCacheEnabled")].toBool(), - SetPlayhead(0); + SetPlayhead(0); delayed_requeue_timer_.setInterval(Config::Current()[QStringLiteral("AutoCacheDelay")].toInt()); delayed_requeue_timer_.setSingleShot(true); @@ -96,9 +96,7 @@ void PreviewAutoCacher::VideoInvalidated(const TimeRange &range) ClearVideoQueue(); // Hash these frames since that should be relatively quick. - if (ignore_next_mouse_button_ || !(qApp->mouseButtons() & Qt::LeftButton)) { - ignore_next_mouse_button_ = false; - + if (!Core::instance()->EffectsSliderIsBeingDragged()) { invalidated_video_.insert(range); video_job_tracker_.insert(range, graph_changed_time_); @@ -563,7 +561,7 @@ void PreviewAutoCacher::RequeueFrames() delayed_requeue_timer_.stop(); if (viewer_node_ - && viewer_node_->video_frame_cache()->HasInvalidatedRanges() + && viewer_node_->video_frame_cache()->HasInvalidatedRanges(viewer_node_->GetVideoLength()) && hash_tasks_.isEmpty() && has_changed_ && VideoParams::FormatIsFloat(viewer_node_->GetVideoParams().format()) @@ -577,7 +575,7 @@ void PreviewAutoCacher::RequeueFrames() using_range = cache_range_; } - TimeRangeList invalidated = viewer_node_->video_frame_cache()->GetInvalidatedRanges().Intersects(using_range); + TimeRangeList invalidated = viewer_node_->video_frame_cache()->GetInvalidatedRanges(using_range); queued_frame_iterator_ = TimeRangeListFrameIterator(invalidated, viewer_node_->video_frame_cache()->GetTimebase()); QueueNextFrameInRange(RenderManager::GetNumberOfIdealConcurrentJobs()); @@ -598,11 +596,6 @@ void PreviewAutoCacher::ConformFinished() } } -void PreviewAutoCacher::IgnoreNextMouseButton() -{ - ignore_next_mouse_button_ = true; -} - void PreviewAutoCacher::ForceCacheRange(const TimeRange &range) { has_changed_ = true; @@ -690,6 +683,8 @@ void PreviewAutoCacher::SetViewerNode(ViewerOutput *viewer_node) // Find copied viewer node copied_viewer_node_ = static_cast(copy_map_.value(viewer_node_)); + copied_viewer_node_->SetViewerVideoCacheEnabled(false); + copied_viewer_node_->SetViewerAudioCacheEnabled(false); copied_color_manager_ = static_cast(copy_map_.value(viewer_node_->project()->color_manager())); // Add all connections @@ -711,9 +706,9 @@ void PreviewAutoCacher::SetViewerNode(ViewerOutput *viewer_node) connect(graph, &NodeGraph::ValueChanged, this, &PreviewAutoCacher::ValueChanged); // Copy invalidated ranges - used to determine which frames need hashing - invalidated_video_ = viewer_node_->video_frame_cache()->GetInvalidatedRanges(); + invalidated_video_ = viewer_node_->video_frame_cache()->GetInvalidatedRanges(viewer_node_->GetVideoLength()); video_job_tracker_.insert(invalidated_video_, graph_changed_time_); - invalidated_audio_ = viewer_node_->audio_playback_cache()->GetInvalidatedRanges(); + invalidated_audio_ = viewer_node_->audio_playback_cache()->GetInvalidatedRanges(viewer_node_->GetAudioLength()); audio_job_tracker_.insert(invalidated_audio_, graph_changed_time_); connect(viewer_node_->video_frame_cache(), diff --git a/app/render/previewautocacher.h b/app/render/previewautocacher.h index 8f865920e..0036a9738 100644 --- a/app/render/previewautocacher.h +++ b/app/render/previewautocacher.h @@ -34,16 +34,6 @@ public: */ void SetViewerNode(ViewerOutput *viewer_node); - /** - * @brief If the mouse is held during the next cache invalidation, cache anyway - * - * By default, PreviewAutoCacher ignores invalidations that occur while the mouse is held down, - * assuming that if the mouse is held, the user is dragging something. If you know the mouse will - * be held during a certain action and want PreviewAutoCacher to cache anyway, call this before - * the cache invalidates. - */ - void IgnoreNextMouseButton(); - /** * @brief Returns whether the auto-cache is currently paused or not */ @@ -175,8 +165,6 @@ private: JobTime graph_changed_time_; JobTime last_update_time_; - bool ignore_next_mouse_button_; - QTimer delayed_requeue_timer_; TimeRangeList audio_needing_conform_; diff --git a/app/widget/nodeparamview/nodeparamviewwidgetbridge.cpp b/app/widget/nodeparamview/nodeparamviewwidgetbridge.cpp index 8dfe37d58..78d54cc26 100644 --- a/app/widget/nodeparamview/nodeparamviewwidgetbridge.cpp +++ b/app/widget/nodeparamview/nodeparamviewwidgetbridge.cpp @@ -62,6 +62,11 @@ void NodeParamViewWidgetBridge::SetTime(const rational &time) } } +int GetSliderCount(NodeValue::Type type) +{ + return NodeValue::get_number_of_keyframe_tracks(type); +} + void NodeParamViewWidgetBridge::CreateWidgets() { if (input_.IsArray() && input_.element() == -1) { @@ -73,7 +78,8 @@ void NodeParamViewWidgetBridge::CreateWidgets() } else { // We assume the first data type is the "primary" type - switch (input_.GetDataType()) { + NodeValue::Type t = input_.GetDataType(); + switch (t) { // None of these inputs have applicable UI widgets case NodeValue::kNone: case NodeValue::kTexture: @@ -89,29 +95,17 @@ void NodeParamViewWidgetBridge::CreateWidgets() CreateSliders(1); break; } - case NodeValue::kFloat: - { - CreateSliders(1); - break; - } case NodeValue::kRational: { CreateSliders(1); break; } + case NodeValue::kFloat: case NodeValue::kVec2: - { - CreateSliders(2); - break; - } case NodeValue::kVec3: - { - CreateSliders(3); - break; - } case NodeValue::kVec4: { - CreateSliders(4); + CreateSliders(GetSliderCount(t)); break; } case NodeValue::kCombo: @@ -410,6 +404,7 @@ void NodeParamViewWidgetBridge::CreateSliders(int count) T* fs = new T(); fs->SliderBase::SetDefaultValue(input_.GetSplitDefaultValueForTrack(i)); fs->SetLadderElementCount(2); + fs->SetIsEffectsSlider(true); widgets_.append(fs); connect(fs, &T::ValueChanged, this, &NodeParamViewWidgetBridge::WidgetCallback); } diff --git a/app/widget/slider/base/numericsliderbase.cpp b/app/widget/slider/base/numericsliderbase.cpp index 38648b685..851733673 100644 --- a/app/widget/slider/base/numericsliderbase.cpp +++ b/app/widget/slider/base/numericsliderbase.cpp @@ -22,6 +22,7 @@ #include "common/qtutils.h" #include "config/config.h" +#include "core.h" namespace olive { @@ -34,7 +35,8 @@ NumericSliderBase::NumericSliderBase(QWidget *parent) : has_max_(false), dragged_diff_(0), drag_multiplier_(1.0), - setting_drag_value_(false) + setting_drag_value_(false), + is_effects_slider_(false) { // Numeric sliders are draggable, so we have a cursor that indicates that setCursor(Qt::SizeHorCursor); @@ -60,6 +62,10 @@ void NumericSliderBase::LabelPressed() connect(drag_ladder_, &SliderLadder::DraggedByValue, this, &NumericSliderBase::LadderDragged); connect(drag_ladder_, &SliderLadder::Released, this, &NumericSliderBase::LadderReleased); + + if (is_effects_slider_) { + Core::instance()->SetEffectsSliderIsBeingDragged(true); + } } void NumericSliderBase::LadderDragged(int value, double multiplier) @@ -90,6 +96,10 @@ void NumericSliderBase::LadderDragged(int value, double multiplier) void NumericSliderBase::LadderReleased() { + if (is_effects_slider_) { + Core::instance()->SetEffectsSliderIsBeingDragged(false); + } + drag_ladder_->deleteLater(); drag_ladder_ = nullptr; dragged_diff_ = 0; diff --git a/app/widget/slider/base/numericsliderbase.h b/app/widget/slider/base/numericsliderbase.h index 0f9e3df5d..3a02f49cc 100644 --- a/app/widget/slider/base/numericsliderbase.h +++ b/app/widget/slider/base/numericsliderbase.h @@ -42,6 +42,8 @@ public: bool IsDragging() const; + void SetIsEffectsSlider(bool e) {is_effects_slider_ = e;} + protected: const QVariant& GetOffset() const { @@ -87,6 +89,8 @@ private: bool setting_drag_value_; + bool is_effects_slider_; + private slots: void LabelPressed();