diff --git a/app/node/node.cpp b/app/node/node.cpp index 4380720b4..30ecc6059 100644 --- a/app/node/node.cpp +++ b/app/node/node.cpp @@ -83,13 +83,6 @@ void Node::InvalidateCache(const rational &start_range, const rational &end_rang { Q_UNUSED(from) - foreach (NodeParam* param, params_) { - if (param->type() == NodeParam::kOutput) { - NodeOutput* output = static_cast(param); - output->drop_cached_values_overlapping(TimeRange(start_range, end_range)); - } - } - SendInvalidateCache(start_range, end_range); } @@ -178,8 +171,10 @@ void Node::CopyInputs(Node *source, Node *destination, bool include_connections) const QList& dst_param = destination->params_; for (int i=0;itype() == NodeParam::kInput) { - NodeInput* src = static_cast(src_param.at(i)); + NodeParam* p = src_param.at(i); + + if (p->type() == NodeParam::kInput) { + NodeInput* src = static_cast(p); if (src->dependent()) { NodeInput* dst = static_cast(dst_param.at(i)); diff --git a/app/render/backend/audiorenderbackend.cpp b/app/render/backend/audiorenderbackend.cpp index e84f9a8e0..3c966bcfd 100644 --- a/app/render/backend/audiorenderbackend.cpp +++ b/app/render/backend/audiorenderbackend.cpp @@ -34,6 +34,9 @@ void AudioRenderBackend::InvalidateCache(const rational &start_range, const rati // Remove any overlaps so we don't render the same thing twice ValidateRanges(); + // Queue value update + QueueValueUpdate(TimeRange(start_range, end_range)); + // Start caching cycle if it hasn't started already CacheNext(); } diff --git a/app/render/backend/renderbackend.cpp b/app/render/backend/renderbackend.cpp index a6d2459bf..8d09676fe 100644 --- a/app/render/backend/renderbackend.cpp +++ b/app/render/backend/renderbackend.cpp @@ -10,6 +10,7 @@ RenderBackend::RenderBackend(QObject *parent) : started_(false), viewer_node_(nullptr), copied_viewer_node_(nullptr), + value_update_queued_(false), recompile_queued_(false) { } @@ -109,12 +110,11 @@ bool RenderBackend::Compile() } // Get dependencies of viewer node - QList nodes; - nodes.append(viewer_node_); - nodes.append(viewer_node_->GetDependencies()); + source_node_list_.append(viewer_node_); + source_node_list_.append(viewer_node_->GetDependencies()); // Copy all dependencies into graph - foreach (Node* n, nodes) { + foreach (Node* n, source_node_list_) { Node* copy = n->copy(); // Copy values (but not connections yet) @@ -127,7 +127,7 @@ bool RenderBackend::Compile() copied_viewer_node_ = static_cast(copied_graph_.nodes().first()); // Copy connections - Node::DuplicateConnectionsBetweenLists(nodes, copied_graph_.nodes()); + Node::DuplicateConnectionsBetweenLists(source_node_list_, copied_graph_.nodes()); compiled_ = CompileInternal(); @@ -147,8 +147,8 @@ void RenderBackend::Decompile() DecompileInternal(); copied_graph_.Clear(); - copied_viewer_node_ = nullptr; + source_node_list_.clear(); compiled_ = false; } @@ -203,6 +203,8 @@ void RenderBackend::CacheNext() return; } + UpdateNodeInputs(); + TimeRange cache_frame = cache_queue_.takeFirst(); caching_ = GenerateData(cache_frame); @@ -250,6 +252,33 @@ const QString &RenderBackend::cache_id() const return cache_id_; } +void RenderBackend::QueueValueUpdate(const TimeRange &range) +{ + value_update_queued_ = true; + value_update_range_ = range; +} + +void RenderBackend::UpdateNodeInputs() +{ + if (value_update_queued_) { + for (int i=0;iparameters()) { + if (p->type() == NodeParam::kOutput) { + static_cast(p)->drop_cached_values_overlapping(value_update_range_); + } + } + } + + value_update_queued_ = false; + } +} + const QVector &RenderBackend::threads() { return threads_; diff --git a/app/render/backend/renderbackend.h b/app/render/backend/renderbackend.h index 3417b1498..405ec3e9b 100644 --- a/app/render/backend/renderbackend.h +++ b/app/render/backend/renderbackend.h @@ -85,6 +85,10 @@ protected: const QString& cache_id() const; + void QueueValueUpdate(const TimeRange& range); + + void UpdateNodeInputs(); + QList cache_queue_; QVector processors_; @@ -125,8 +129,12 @@ private: qint64 cache_time_; QString cache_id_; + QList source_node_list_; NodeGraph copied_graph_; + bool value_update_queued_; + TimeRange value_update_range_; + bool recompile_queued_; private slots: diff --git a/app/render/backend/renderworker.cpp b/app/render/backend/renderworker.cpp index c24d86cfb..4c019a97a 100644 --- a/app/render/backend/renderworker.cpp +++ b/app/render/backend/renderworker.cpp @@ -40,24 +40,9 @@ void RenderWorker::Close() void RenderWorker::Render(NodeDependency path) { - NodeOutput* output = path.node(); - Node* node = output->parent(); - - QList all_nodes_in_graph = ListNodeAndAllDependencies(node); - - // Lock all Nodes to prevent UI changes during this render - foreach (Node* dep, all_nodes_in_graph) { - dep->LockUserInput(); - } - RenderInternal(path); emit CompletedCache(path); - - // Unlock all Nodes so changes can be made again - foreach (Node* dep, all_nodes_in_graph) { - dep->UnlockUserInput(); - } } DecoderCache *RenderWorker::decoder_cache() diff --git a/app/render/backend/videorenderbackend.cpp b/app/render/backend/videorenderbackend.cpp index 579a8d5c1..5e4bd15b2 100644 --- a/app/render/backend/videorenderbackend.cpp +++ b/app/render/backend/videorenderbackend.cpp @@ -46,10 +46,10 @@ void VideoRenderBackend::InvalidateCache(const rational &start_range, const rati rational start_range_adj = qMax(rational(0), start_range); rational end_range_adj = qMin(SequenceLength(), end_range); - qDebug() << "Cache invalidated between" + /*qDebug() << "Cache invalidated between" << start_range_adj.toDouble() << "and" - << end_range_adj.toDouble(); + << end_range_adj.toDouble();*/ // Snap start_range to timebase double start_range_dbl = start_range_adj.toDouble(); @@ -98,6 +98,9 @@ void VideoRenderBackend::InvalidateCache(const rational &start_range, const rati // Remove frames after this time code if it's changed frame_cache_.Truncate(SequenceLength()); + // Queue value update + QueueValueUpdate(TimeRange(start_range, end_range)); + CacheNext(); } diff --git a/app/widget/timelinewidget/undo/undo.cpp b/app/widget/timelinewidget/undo/undo.cpp index d39b97efc..bf49bd533 100644 --- a/app/widget/timelinewidget/undo/undo.cpp +++ b/app/widget/timelinewidget/undo/undo.cpp @@ -22,7 +22,6 @@ #include "node/graph.h" -#include Block* CreateSplitBlock(Block* block, rational point, QObject* parent = nullptr) { Block* copy = static_cast(block->copy());