diff --git a/app/common/xmlutils.cpp b/app/common/xmlutils.cpp index 88ad34474..b7cff1a3b 100644 --- a/app/common/xmlutils.cpp +++ b/app/common/xmlutils.cpp @@ -42,7 +42,7 @@ void XMLConnectNodes(const XMLNodeData &xml_node_data, MultiUndoCommand *command Node::ConnectEdge(out, con.input); /// Deprecated: backwards compatibility only - con.input.node()->SetValueHintForInput(con.input.input(), con.input.element(), {{}, -1, con.output_param}); + con.input.node()->SetValueHintForInput(con.input.input(), {{}, -1, con.output_param}, con.input.element()); } } } diff --git a/app/node/block/block.cpp b/app/node/block/block.cpp index 7ba49851f..3a818d456 100644 --- a/app/node/block/block.cpp +++ b/app/node/block/block.cpp @@ -109,7 +109,7 @@ bool Block::HashPassthrough(const QString &input, QCryptographicHash &hash, cons new_globals.set_time(t); Node *out = GetConnectedOutput(input); - out->Hash(GetValueHintForInput(input, -1), hash, new_globals, video_params); + Node::Hash(out, GetValueHintForInput(input), hash, new_globals, video_params); return true; } @@ -130,7 +130,7 @@ void Block::Retranslate() SetInputName(kEnabledInput, tr("Enabled")); } -void Block::Hash(const ValueHint &hint, QCryptographicHash &, const NodeGlobals &, const VideoParams &) const +void Block::Hash(QCryptographicHash &, const NodeGlobals &, const VideoParams &) const { // A block does nothing by default, so we hash nothing } diff --git a/app/node/block/block.h b/app/node/block/block.h index 4b3fb7f56..7f03ec805 100644 --- a/app/node/block/block.h +++ b/app/node/block/block.h @@ -115,8 +115,6 @@ public: index_ = i; } - virtual void Hash(const Node::ValueHint &hint, QCryptographicHash &hash, const NodeGlobals &globals, const VideoParams& video_params) const override; - virtual void InvalidateCache(const TimeRange& range, const QString& from, int element = -1, InvalidateCacheOptions options = InvalidateCacheOptions()) override; static const QString kLengthInput; @@ -134,6 +132,8 @@ signals: protected: virtual void InputValueChangedEvent(const QString& input, int element) override; + virtual void Hash(QCryptographicHash &hash, const NodeGlobals &globals, const VideoParams& video_params) const override; + bool HashPassthrough(const QString &input, QCryptographicHash &hash, const NodeGlobals &globals, const VideoParams& video_params) const; Block* previous_; diff --git a/app/node/block/clip/clip.cpp b/app/node/block/clip/clip.cpp index d7407a9e1..df5628ef6 100644 --- a/app/node/block/clip/clip.cpp +++ b/app/node/block/clip/clip.cpp @@ -51,7 +51,7 @@ ClipBlock::ClipBlock() : IgnoreHashingFrom(kReverseInput); PrependInput(kBufferIn, NodeValue::kNone, InputFlags(kInputFlagNotKeyframable)); - SetValueHintForInput(kBufferIn, -1, {NodeValue::kBuffer, -1, QString()}); + SetValueHintForInput(kBufferIn, {NodeValue::kBuffer, -1, QString()}); } Node *ClipBlock::copy() const @@ -264,7 +264,7 @@ void ClipBlock::Retranslate() SetInputName(kReverseInput, tr("Reverse")); } -void ClipBlock::Hash(const ValueHint &out, QCryptographicHash &hash, const NodeGlobals &globals, const VideoParams &video_params) const +void ClipBlock::Hash(QCryptographicHash &hash, const NodeGlobals &globals, const VideoParams &video_params) const { HashPassthrough(kBufferIn, hash, globals, video_params); } diff --git a/app/node/block/clip/clip.h b/app/node/block/clip/clip.h index 3e914734d..9ff1bc1ec 100644 --- a/app/node/block/clip/clip.h +++ b/app/node/block/clip/clip.h @@ -59,8 +59,6 @@ public: virtual void Retranslate() override; - virtual void Hash(const Node::ValueHint& output, QCryptographicHash &hash, const NodeGlobals &globals, const VideoParams& video_params) const override; - double speed() const { return GetStandardValue(kSpeedInput).toDouble(); @@ -111,6 +109,8 @@ protected: virtual void InputValueChangedEvent(const QString &input, int element) override; + virtual void Hash(QCryptographicHash &hash, const NodeGlobals &globals, const VideoParams& video_params) const override; + private: rational SequenceToMediaTime(const rational& sequence_time, bool ignore_reverse = false) const; diff --git a/app/node/block/transition/transition.cpp b/app/node/block/transition/transition.cpp index 251aa2416..601dcc387 100644 --- a/app/node/block/transition/transition.cpp +++ b/app/node/block/transition/transition.cpp @@ -137,7 +137,7 @@ double TransitionBlock::GetInProgress(const double &time) const return clamp((GetInternalTransitionTime(time) - out_offset().toDouble()) / in_offset().toDouble(), 0.0, 1.0); } -void TransitionBlock::Hash(const ValueHint &output, QCryptographicHash &hash, const NodeGlobals &globals, const VideoParams &video_params) const +void TransitionBlock::Hash(QCryptographicHash &hash, const NodeGlobals &globals, const VideoParams &video_params) const { if (HashPassthrough(kInBlockInput, hash, globals, video_params) || HashPassthrough(kOutBlockInput, hash, globals, video_params)) { diff --git a/app/node/block/transition/transition.h b/app/node/block/transition/transition.h index 0ff8ad922..93577fcbc 100644 --- a/app/node/block/transition/transition.h +++ b/app/node/block/transition/transition.h @@ -65,8 +65,6 @@ public: double GetOutProgress(const double &time) const; double GetInProgress(const double &time) const; - virtual void Hash(const ValueHint& output, QCryptographicHash& hash, const NodeGlobals &globals, const VideoParams& video_params) const override; - virtual void Value(const NodeValueRow& value, const NodeGlobals &globals, NodeValueTable *table) const override; virtual void InvalidateCache(const TimeRange& range, const QString& from, int element = -1, InvalidateCacheOptions options = InvalidateCacheOptions()) override; @@ -91,6 +89,8 @@ protected: virtual TimeRange OutputTimeAdjustment(const QString& input, int element, const TimeRange& input_time) const override; + virtual void Hash(QCryptographicHash& hash, const NodeGlobals &globals, const VideoParams& video_params) const override; + private: enum CurveType { kLinear, diff --git a/app/node/distort/transform/transformdistortnode.cpp b/app/node/distort/transform/transformdistortnode.cpp index 6791d9350..95a91ec2b 100644 --- a/app/node/distort/transform/transformdistortnode.cpp +++ b/app/node/distort/transform/transformdistortnode.cpp @@ -312,7 +312,7 @@ void TransformDistortNode::GizmoRelease() gizmo_drag_ = nullptr; } -void TransformDistortNode::Hash(const ValueHint &output, QCryptographicHash &hash, const NodeGlobals &globals, const VideoParams &video_params) const +void TransformDistortNode::Hash(QCryptographicHash &hash, const NodeGlobals &globals, const VideoParams &video_params) const { // If not connected to output, this will produce nothing Node *out = GetConnectedOutput(kTextureInput); @@ -338,7 +338,7 @@ void TransformDistortNode::Hash(const ValueHint &output, QCryptographicHash &has } } - out->Hash(GetValueHintForInput(kTextureInput, -1), hash, globals, video_params); + Node::Hash(out, GetValueHintForInput(kTextureInput), hash, globals, video_params); } QMatrix4x4 TransformDistortNode::AdjustMatrixByResolutions(const QMatrix4x4 &mat, const QVector2D &sequence_res, const QVector2D &texture_res, AutoScaleType autoscale_type) diff --git a/app/node/distort/transform/transformdistortnode.h b/app/node/distort/transform/transformdistortnode.h index e2f0c4a81..864cd008d 100644 --- a/app/node/distort/transform/transformdistortnode.h +++ b/app/node/distort/transform/transformdistortnode.h @@ -80,8 +80,6 @@ public: virtual void GizmoMove(const QPointF &p, const rational &time) override; virtual void GizmoRelease() override; - virtual void Hash(const ValueHint& output, QCryptographicHash& hash, const NodeGlobals &globals, const VideoParams& video_params) const override; - enum AutoScaleType { kAutoScaleNone, kAutoScaleFit, @@ -98,6 +96,9 @@ public: static const QString kAutoscaleInput; static const QString kInterpolationInput; +protected: + virtual void Hash(QCryptographicHash& hash, const NodeGlobals &globals, const VideoParams& video_params) const override; + private: static QPointF CreateScalePoint(double x, double y, const QPointF& half_res, const QMatrix4x4& mat); diff --git a/app/node/input/time/timeinput.cpp b/app/node/input/time/timeinput.cpp index 0d15f8ce3..b26f101d7 100644 --- a/app/node/input/time/timeinput.cpp +++ b/app/node/input/time/timeinput.cpp @@ -22,6 +22,8 @@ namespace olive { +#define super Node + TimeInput::TimeInput() { } @@ -60,9 +62,9 @@ void TimeInput::Value(const NodeValueRow &value, const NodeGlobals &globals, Nod QStringLiteral("time")); } -void TimeInput::Hash(const ValueHint &output, QCryptographicHash &hash, const NodeGlobals &globals, const VideoParams &video_params) const +void TimeInput::Hash(QCryptographicHash &hash, const NodeGlobals &globals, const VideoParams &video_params) const { - Node::Hash(output, hash, globals, video_params); + super::Hash(hash, globals, video_params); // Make sure time is hashed hash.addData(NodeValue::ValueToBytes(NodeValue::kFloat, globals.time().in().toDouble())); diff --git a/app/node/input/time/timeinput.h b/app/node/input/time/timeinput.h index f5ad3e37a..c5afc75f4 100644 --- a/app/node/input/time/timeinput.h +++ b/app/node/input/time/timeinput.h @@ -42,7 +42,8 @@ public: virtual void Value(const NodeValueRow& value, const NodeGlobals &globals, NodeValueTable *table) const override; - virtual void Hash(const ValueHint& output, QCryptographicHash& hash, const NodeGlobals &globals, const VideoParams& video_params) const override; +protected: + virtual void Hash(QCryptographicHash& hash, const NodeGlobals &globals, const VideoParams& video_params) const override; }; diff --git a/app/node/math/merge/merge.cpp b/app/node/math/merge/merge.cpp index b2732e88d..f5bd9ed0d 100644 --- a/app/node/math/merge/merge.cpp +++ b/app/node/math/merge/merge.cpp @@ -100,7 +100,7 @@ void MergeNode::Value(const NodeValueRow &value, const NodeGlobals &globals, Nod } } -void MergeNode::Hash(const ValueHint &output, QCryptographicHash &hash, const NodeGlobals &globals, const VideoParams &video_params) const +void MergeNode::Hash(QCryptographicHash &hash, const NodeGlobals &globals, const VideoParams &video_params) const { NodeTraverser traverser; traverser.SetCacheVideoParams(video_params); @@ -121,12 +121,12 @@ void MergeNode::Hash(const ValueHint &output, QCryptographicHash &hash, const No if (!passthrough_base) { Node *blend_output = GetConnectedOutput(kBlendIn); - blend_output->Hash(GetValueHintForInput(kBlendIn, -1), hash, globals, video_params); + Node::Hash(blend_output, GetValueHintForInput(kBlendIn), hash, globals, video_params); } if (!passthrough_blend) { Node *base_output = GetConnectedOutput(kBaseIn); - base_output->Hash(GetValueHintForInput(kBaseIn, -1), hash, globals, video_params); + Node::Hash(base_output, GetValueHintForInput(kBaseIn), hash, globals, video_params); } Q_ASSERT(!passthrough_base || !passthrough_blend); diff --git a/app/node/math/merge/merge.h b/app/node/math/merge/merge.h index dc127c33d..fff8bbd5a 100644 --- a/app/node/math/merge/merge.h +++ b/app/node/math/merge/merge.h @@ -48,7 +48,8 @@ public: static const QString kBaseIn; static const QString kBlendIn; - virtual void Hash(const ValueHint& output, QCryptographicHash &hash, const NodeGlobals &globals, const VideoParams& video_params) const override; +protected: + virtual void Hash(QCryptographicHash &hash, const NodeGlobals &globals, const VideoParams& video_params) const override; private: NodeInput* base_in_; diff --git a/app/node/node.cpp b/app/node/node.cpp index 98b326346..8a93bacef 100644 --- a/app/node/node.cpp +++ b/app/node/node.cpp @@ -1015,7 +1015,18 @@ int Node::InputArraySize(const QString &id) const } } -void Node::SetValueHintForInput(const QString &input, int element, const ValueHint &hint) +void Node::Hash(const Node *node, const ValueHint &hint, QCryptographicHash &hash, const NodeGlobals &globals, const VideoParams &video_params) +{ + if (!hint.type.isEmpty()) { + hash.addData(reinterpret_cast(hint.type.constData()), sizeof(NodeValue::Type) * hint.type.size()); + } + hash.addData(reinterpret_cast(&hint.index), sizeof(hint.index)); + hash.addData(hint.tag.toUtf8()); + + node->Hash(hash, globals, video_params); +} + +void Node::SetValueHintForInput(const QString &input, const ValueHint &hint, int element) { value_hints_.insert({input, element}, hint); @@ -1146,7 +1157,7 @@ void Node::CopyDependencyGraph(const QVector &src, const QVector command->add_child(new NodeSetValueHintCommand(copied_input, src_node->GetValueHintForInput(copied_input.input(), copied_input.element()))); } else { ConnectEdge(copied_output, copied_input); - copied_input.node()->SetValueHintForInput(copied_input.input(), copied_input.element(), src_node->GetValueHintForInput(copied_input.input(), copied_input.element())); + copied_input.node()->SetValueHintForInput(copied_input.input(), src_node->GetValueHintForInput(copied_input.input(), copied_input.element()), copied_input.element()); } } } @@ -1486,7 +1497,7 @@ QString Node::GetLabelOrName() const return GetLabel(); } -void Node::Hash(const ValueHint &output, QCryptographicHash &hash, const NodeGlobals &globals, const VideoParams &video_params) const +void Node::Hash(QCryptographicHash &hash, const NodeGlobals &globals, const VideoParams &video_params) const { // Add this Node's ID and output being used HashAddNodeSignature(hash); @@ -1576,7 +1587,7 @@ void Node::CopyValuesOfElement(const Node *src, Node *dst, const QString &input, } // Copy value hint - dst->SetValueHintForInput(input, dst_element, src->GetValueHintForInput(input, src_element)); + dst->SetValueHintForInput(input, src->GetValueHintForInput(input, src_element), dst_element); } bool Node::CanBeDeleted() const @@ -1635,7 +1646,7 @@ void Node::HashInputElement(QCryptographicHash &hash, const QString& input, int NodeGlobals new_globals = globals; new_globals.set_time(input_time); - output->Hash(GetValueHintForInput(input, element), hash, new_globals, video_params); + Node::Hash(output, GetValueHintForInput(input, element), hash, new_globals, video_params); } else { // Grab the value at this time QVariant value = GetValueAtTime(input, input_time.in(), element); diff --git a/app/node/node.h b/app/node/node.h index cbfe75f3b..7ab48e48f 100644 --- a/app/node/node.h +++ b/app/node/node.h @@ -473,12 +473,14 @@ public: void Save(QXmlStreamWriter *writer) const; }; - ValueHint GetValueHintForInput(const QString &input, int element) const + static void Hash(const Node *node, const ValueHint &hint, QCryptographicHash& hash, const NodeGlobals &globals, const VideoParams& video_params); + + ValueHint GetValueHintForInput(const QString &input, int element = -1) const { return value_hints_.value({input, element}); } - void SetValueHintForInput(const QString &input, int element, const ValueHint &hint); + void SetValueHintForInput(const QString &input, const ValueHint &hint, int element = -1); const NodeKeyframeTrack& GetTrackFromKeyframe(NodeKeyframe* key) const; @@ -731,8 +733,6 @@ public: QString GetLabelAndName() const; QString GetLabelOrName() const; - virtual void Hash(const ValueHint &output, QCryptographicHash& hash, const NodeGlobals &globals, const VideoParams& video_params) const; - void InvalidateAll(const QString& input, int element = -1); bool HasLinks() const @@ -852,6 +852,8 @@ protected: }; + virtual void Hash(QCryptographicHash& hash, const NodeGlobals &globals, const VideoParams& video_params) const; + void HashAddNodeSignature(QCryptographicHash &hash) const; void InsertInput(const QString& id, NodeValue::Type type, const QVariant& default_value, InputFlags flags, int index); diff --git a/app/node/output/track/track.cpp b/app/node/output/track/track.cpp index de2141cf3..10f640d3a 100644 --- a/app/node/output/track/track.cpp +++ b/app/node/output/track/track.cpp @@ -571,17 +571,15 @@ bool Track::IsLocked() const return locked_; } -void Track::Hash(const Node::ValueHint &output, QCryptographicHash &hash, const NodeGlobals &globals, const VideoParams &video_params) const +void Track::Hash(QCryptographicHash &hash, const NodeGlobals &globals, const VideoParams &video_params) const { - Q_UNUSED(output) - Block* b = BlockAtTime(globals.time().in()); // Defer to block at this time, don't add any of our own information to the hash if (b) { NodeGlobals new_globals = globals; new_globals.set_time(TransformRangeForBlock(b, globals.time())); - b->Hash(GetValueHintForInput(kBlockInput, GetArrayIndexFromBlock(b)), hash, new_globals, video_params); + Node::Hash(b, GetValueHintForInput(kBlockInput, GetArrayIndexFromBlock(b)), hash, new_globals, video_params); } } diff --git a/app/node/output/track/track.h b/app/node/output/track/track.h index e0a167aea..97bb1e7b6 100644 --- a/app/node/output/track/track.h +++ b/app/node/output/track/track.h @@ -359,7 +359,6 @@ public: bool IsLocked() const; - virtual void Hash(const Node::ValueHint& output, QCryptographicHash& hash, const NodeGlobals &globals, const VideoParams& video_params) const override; int GetArrayIndexFromBlock(Block* block) const; @@ -412,6 +411,8 @@ signals: void BlocksRefreshed(); protected: + virtual void Hash(QCryptographicHash& hash, const NodeGlobals &globals, const VideoParams& video_params) const override; + virtual bool LoadCustom(QXmlStreamReader* reader, XMLNodeData& xml_node_data, uint version, const QAtomicInt* cancelled) override; virtual void SaveCustom(QXmlStreamWriter* writer) const override; diff --git a/app/node/output/viewer/viewer.cpp b/app/node/output/viewer/viewer.cpp index 75f77d7de..3e5110a01 100644 --- a/app/node/output/viewer/viewer.cpp +++ b/app/node/output/viewer/viewer.cpp @@ -340,7 +340,7 @@ rational ViewerOutput::VerifyLengthInternal(Track::Type type) const switch (type) { case Track::kVideo: if (IsInputConnected(kTextureInput)) { - NodeValueTable t = traverser.GenerateTable(GetConnectedOutput(kTextureInput), GetValueHintForInput(kTextureInput, -1), TimeRange(0, 0)); + NodeValueTable t = traverser.GenerateTable(GetConnectedOutput(kTextureInput), GetValueHintForInput(kTextureInput), TimeRange(0, 0)); rational r = t.Get(NodeValue::kRational, QStringLiteral("length")).value(); if (!r.isNaN()) { return r; @@ -349,7 +349,7 @@ rational ViewerOutput::VerifyLengthInternal(Track::Type type) const break; case Track::kAudio: if (IsInputConnected(kSamplesInput)) { - NodeValueTable t = traverser.GenerateTable(GetConnectedOutput(kSamplesInput), GetValueHintForInput(kSamplesInput, -1), TimeRange(0, 0)); + NodeValueTable t = traverser.GenerateTable(GetConnectedOutput(kSamplesInput), GetValueHintForInput(kSamplesInput), TimeRange(0, 0)); rational r = t.Get(NodeValue::kRational, QStringLiteral("length")).value();; if (!r.isNaN()) { return r; diff --git a/app/node/project/footage/footage.cpp b/app/node/project/footage/footage.cpp index 8e4bd32b0..4ab67ebb8 100644 --- a/app/node/project/footage/footage.cpp +++ b/app/node/project/footage/footage.cpp @@ -335,9 +335,9 @@ QString Footage::DescribeAudioStream(const AudioParams ¶ms) QString::number(params.sample_rate())); } -void Footage::Hash(const Node::ValueHint& output, QCryptographicHash &hash, const NodeGlobals &globals, const VideoParams &video_params) const +void Footage::Hash(QCryptographicHash &hash, const NodeGlobals &globals, const VideoParams &video_params) const { - super::Hash(output, hash, globals, video_params); + super::Hash(hash, globals, video_params); // Footage last modified date hash.addData(QString::number(timestamp()).toUtf8()); diff --git a/app/node/project/footage/footage.h b/app/node/project/footage/footage.h index 4b3cba828..ea98bd974 100644 --- a/app/node/project/footage/footage.h +++ b/app/node/project/footage/footage.h @@ -179,8 +179,6 @@ public: static QString DescribeVideoStream(const VideoParams& params); static QString DescribeAudioStream(const AudioParams& params); - virtual void Hash(const ValueHint &output, QCryptographicHash &hash, const NodeGlobals &globals, const VideoParams& video_params) const override; - virtual void Value(const NodeValueRow& value, const NodeGlobals &globals, NodeValueTable *table) const override; static QString GetStreamTypeName(Track::Type type); @@ -212,6 +210,8 @@ protected: virtual rational VerifyLengthInternal(Track::Type type) const override; + virtual void Hash(QCryptographicHash &hash, const NodeGlobals &globals, const VideoParams& video_params) const override; + private: QString GetColorspaceToUse(const VideoParams& params) const; diff --git a/app/node/time/timeremap/timeremap.cpp b/app/node/time/timeremap/timeremap.cpp index e8310937c..945ac1939 100644 --- a/app/node/time/timeremap/timeremap.cpp +++ b/app/node/time/timeremap/timeremap.cpp @@ -93,16 +93,15 @@ void TimeRemapNode::Retranslate() SetInputName(kInputInput, QStringLiteral("Input")); } -void TimeRemapNode::Hash(const ValueHint &output, QCryptographicHash &hash, const NodeGlobals &globals, const VideoParams &video_params) const +void TimeRemapNode::Hash(QCryptographicHash &hash, const NodeGlobals &globals, const VideoParams &video_params) const { // Don't hash anything of our own, just pass-through to the connected node at the remapped tmie - Q_UNUSED(output) if (IsInputConnected(kInputInput)) { Node *out = GetConnectedOutput(kInputInput); NodeGlobals new_globals = globals; new_globals.set_time(TimeRange(GetRemappedTime(globals.time().in()), GetRemappedTime(globals.time().out()))); - out->Hash(GetValueHintForInput(kInputInput, -1), hash, new_globals, video_params); + Node::Hash(out, GetValueHintForInput(kInputInput), hash, new_globals, video_params); } } diff --git a/app/node/time/timeremap/timeremap.h b/app/node/time/timeremap/timeremap.h index 52250a140..0a2400458 100644 --- a/app/node/time/timeremap/timeremap.h +++ b/app/node/time/timeremap/timeremap.h @@ -45,11 +45,12 @@ public: virtual void Retranslate() override; - virtual void Hash(const ValueHint &output, QCryptographicHash &hash, const NodeGlobals &globals, const VideoParams& video_params) const override; - static const QString kTimeInput; static const QString kInputInput; +protected: + virtual void Hash(QCryptographicHash &hash, const NodeGlobals &globals, const VideoParams& video_params) const override; + private: rational GetRemappedTime(const rational& input) const; diff --git a/app/node/traverser.cpp b/app/node/traverser.cpp index 9619cfc55..1c61f1eec 100644 --- a/app/node/traverser.cpp +++ b/app/node/traverser.cpp @@ -163,7 +163,7 @@ NodeValueTable NodeTraverser::ProcessInput(const Node* node, const QString& inpu TimeRange adjusted_range = node->InputTimeAdjustment(input, -1, range); // Value will equal something from the connected node, follow it - return GenerateTable(node->GetConnectedOutput(input), node->GetValueHintForInput(input, -1), adjusted_range); + return GenerateTable(node->GetConnectedOutput(input), node->GetValueHintForInput(input), adjusted_range); } else { diff --git a/app/render/previewautocacher.cpp b/app/render/previewautocacher.cpp index 742158d5c..699d6aa25 100644 --- a/app/render/previewautocacher.cpp +++ b/app/render/previewautocacher.cpp @@ -69,7 +69,7 @@ QVector PreviewAutoCacher::GenerateHashes(ViewerOut const rational &time = times.at(i); // See if hash already exists in disk cache - QByteArray hash = RenderManager::Hash(viewer->GetConnectedTextureOutput(), viewer->GetValueHintForInput(ViewerOutput::kTextureInput, -1), viewer->GetVideoParams(), time); + QByteArray hash = RenderManager::Hash(viewer->GetConnectedTextureOutput(), viewer->GetValueHintForInput(ViewerOutput::kTextureInput), viewer->GetVideoParams(), time); // Check memory list since disk checking is slow bool hash_exists = existing_hashes.contains(hash); @@ -392,7 +392,7 @@ void PreviewAutoCacher::CopyValueHint(const NodeInput &input) { Node* our_input = copy_map_.value(input.node()); Node::ValueHint hint = input.node()->GetValueHintForInput(input.input(), input.element()); - our_input->SetValueHintForInput(input.input(), input.element(), hint); + our_input->SetValueHintForInput(input.input(), hint, input.element()); } void PreviewAutoCacher::InsertIntoCopyMap(Node *node, Node *copy) diff --git a/app/render/rendermanager.cpp b/app/render/rendermanager.cpp index 6d97debaf..47fc83d71 100644 --- a/app/render/rendermanager.cpp +++ b/app/render/rendermanager.cpp @@ -118,7 +118,7 @@ QByteArray RenderManager::Hash(const Node *n, const Node::ValueHint &output, con hasher.addData(reinterpret_cast(&interlacing), sizeof(interlacing)); if (n) { - n->Hash(output, hasher, NodeTraverser::GenerateGlobals(params, time), params); + Node::Hash(n, output, hasher, NodeTraverser::GenerateGlobals(params, time), params); } return hasher.result(); diff --git a/app/render/renderprocessor.cpp b/app/render/renderprocessor.cpp index 7389fb332..bcd202972 100644 --- a/app/render/renderprocessor.cpp +++ b/app/render/renderprocessor.cpp @@ -49,7 +49,7 @@ TexturePtr RenderProcessor::GenerateTexture(const rational &time, const rational NodeValueTable table; Node *texture_output = viewer->GetConnectedTextureOutput(); if (texture_output) { - table = GenerateTable(texture_output, viewer->GetValueHintForInput(ViewerOutput::kTextureInput, -1), TimeRange(time, time + frame_length)); + table = GenerateTable(texture_output, viewer->GetValueHintForInput(ViewerOutput::kTextureInput), TimeRange(time, time + frame_length)); } return table.Get(NodeValue::kTexture).value(); @@ -171,7 +171,7 @@ void RenderProcessor::Run() NodeValueTable table; Node *texture_output = viewer->GetConnectedSampleOutput(); if (texture_output) { - table = GenerateTable(texture_output, viewer->GetValueHintForInput(ViewerOutput::kSamplesInput, -1),time); + table = GenerateTable(texture_output, viewer->GetValueHintForInput(ViewerOutput::kSamplesInput),time); } QVariant sample_variant = table.Get(NodeValue::kSamples); diff --git a/app/task/precache/precachetask.cpp b/app/task/precache/precachetask.cpp index cb1a9b608..e7aa6a9f0 100644 --- a/app/task/precache/precachetask.cpp +++ b/app/task/precache/precachetask.cpp @@ -49,7 +49,7 @@ PreCacheTask::PreCacheTask(Footage *footage, int index, Sequence* sequence) Node::CopyInputs(footage, footage_, false); Node::ConnectEdge(footage_, NodeInput(viewer(), ViewerOutput::kTextureInput)); - viewer()->SetValueHintForInput(ViewerOutput::kTextureInput, -1, {{NodeValue::kTexture}, -1, Track::Reference(Track::kVideo, index).ToString()}); + viewer()->SetValueHintForInput(ViewerOutput::kTextureInput, {{NodeValue::kTexture}, -1, Track::Reference(Track::kVideo, index).ToString()}); SetTitle(tr("Pre-caching %1:%2").arg(footage_->filename(), QString::number(index))); } diff --git a/app/task/render/render.cpp b/app/task/render/render.cpp index 448ef9c12..487decba2 100644 --- a/app/task/render/render.cpp +++ b/app/task/render/render.cpp @@ -91,7 +91,7 @@ bool RenderTask::Render(ColorManager* manager, } times[i] = r; - hashes[i] = RenderManager::instance()->Hash(viewer()->GetConnectedTextureOutput(), viewer()->GetValueHintForInput(ViewerOutput::kTextureInput, -1), video_params_, r); + hashes[i] = RenderManager::instance()->Hash(viewer()->GetConnectedTextureOutput(), viewer()->GetValueHintForInput(ViewerOutput::kTextureInput), video_params_, r); } // Filter out duplicates diff --git a/app/widget/nodeparamview/nodeparamviewundo.cpp b/app/widget/nodeparamview/nodeparamviewundo.cpp index db04ecd8d..d93cb3549 100644 --- a/app/widget/nodeparamview/nodeparamviewundo.cpp +++ b/app/widget/nodeparamview/nodeparamviewundo.cpp @@ -204,12 +204,12 @@ void NodeParamArrayAppendCommand::undo() void NodeSetValueHintCommand::redo() { old_hint_ = input_.node()->GetValueHintForInput(input_.input(), input_.element()); - input_.node()->SetValueHintForInput(input_.input(), input_.element(), new_hint_); + input_.node()->SetValueHintForInput(input_.input(), new_hint_, input_.element()); } void NodeSetValueHintCommand::undo() { - input_.node()->SetValueHintForInput(input_.input(), input_.element(), old_hint_); + input_.node()->SetValueHintForInput(input_.input(), old_hint_, input_.element()); } } diff --git a/app/widget/nodevaluetree/nodevaluetree.cpp b/app/widget/nodevaluetree/nodevaluetree.cpp index f15e5cb92..28d938e22 100644 --- a/app/widget/nodevaluetree/nodevaluetree.cpp +++ b/app/widget/nodevaluetree/nodevaluetree.cpp @@ -76,7 +76,7 @@ void NodeValueTree::RadioButtonChecked(bool e) Node::ValueHint hint = btn->property("hint").value(); NodeInput input = btn->property("input").value(); - input.node()->SetValueHintForInput(input.input(), input.element(), hint); + input.node()->SetValueHintForInput(input.input(), hint, input.element()); } }