From 87eacb2869115d19109b6fced9c7cfe1e134da3a Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 26 Dec 2019 21:51:08 +1100 Subject: [PATCH] fix input bug that doesn't deep copy keyframes correctly --- app/node/input.cpp | 158 +++------------------------------------------ 1 file changed, 8 insertions(+), 150 deletions(-) diff --git a/app/node/input.cpp b/app/node/input.cpp index 1160c71cc..034f409f2 100644 --- a/app/node/input.cpp +++ b/app/node/input.cpp @@ -181,6 +181,8 @@ NodeKeyframePtr NodeInput::get_closest_keyframe_to_time(const rational &time) co void NodeInput::insert_keyframe(NodeKeyframePtr key) { + Q_ASSERT(is_keyframable() || keyframes_.isEmpty()); + insert_keyframe_internal(key); connect(key.get(), &NodeKeyframe::TimeChanged, this, &NodeInput::KeyframeTimeChanged); @@ -191,7 +193,7 @@ void NodeInput::insert_keyframe(NodeKeyframePtr key) void NodeInput::remove_keyframe(NodeKeyframePtr key) { - Q_ASSERT(keyframes_.size() > 1); + Q_ASSERT(is_keyframable() && keyframes_.size() > 1); disconnect(key.get(), &NodeKeyframe::TimeChanged, this, &NodeInput::KeyframeTimeChanged); disconnect(key.get(), &NodeKeyframe::ValueChanged, this, &NodeInput::KeyframeValueChanged); @@ -274,154 +276,6 @@ bool NodeInput::has_keyframe_at_time(const rational &time) const return false; } -/*void NodeInput::set_default_value(const QVariant &value) -{ - if (parentNode() != nullptr) - parentNode()->LockUserInput(); - - set_is_keyframing(false); - keyframes_.clear(); - keyframes_.append(NodeKeyframe(0, value, NodeKeyframe::kLinear)); - - if (parentNode() != nullptr) - parentNode()->UnlockUserInput(); - - emit ValueChanged(RATIONAL_MIN, RATIONAL_MAX); - - // We set up these variables in advance (see end of function) - bool signal_vc = false; - TimeRange signal_vc_range; - - if (is_keyframing()) { - // Insert value into the keyframe list chronologically - - if (keyframes_.first().time() > time) { - - // Store this away for the ValueChanged signal we emit later - rational existing_first_key = keyframes_.first().time(); - - // Insert at the beginning - keyframes_.prepend(NodeKeyframe(time, value, keyframes_.first().type())); - - // Value has changed since the earliest point up until the ex-first keyframe (since the frames - // interpolating between the key we're adding and the key that existed are changing too) - signal_vc = true; - signal_vc_range = TimeRange(RATIONAL_MIN, existing_first_key); - - } else if (keyframes_.first().time() == time) { - - // Replace first value - keyframes_.first().set_value(value); - - // Value has changed since the earliest point up until the keyframe we just changed - signal_vc = true; - signal_vc_range = TimeRange(RATIONAL_MIN, time); - - } else if (keyframes_.last().time() < time) { - - // Store this away for the ValueChanged signal we emit later - rational existing_last_key = keyframes_.last().time(); - - // Append at the end - keyframes_.append(NodeKeyframe(time, value, keyframes_.last().type())); - - // Value has changed since the ex-last point up until the latest possible point (since the frames - // interpolating between the key we're adding and the key that existed are changing too) - signal_vc = true; - signal_vc_range = TimeRange(existing_last_key, RATIONAL_MAX); - - } else if (keyframes_.last().time() == time) { - - // Replace last value - keyframes_.last().set_value(value); - - // Value has changed from this point until the latest possible point - signal_vc = true; - signal_vc_range = TimeRange(time, RATIONAL_MAX); - - } else { - for (int i=0;i time) { - // Insert value in between these two keyframes - keyframes_.insert(i+1, NodeKeyframe(time, value, before.type())); - - // Values have changed since the last keyframe and the next one - signal_vc = true; - signal_vc_range = TimeRange(before.time(), after.time()); - break; - } - } - } - - } else { - keyframes_.first().set_value(value); - - // Values have changed for all times since the value is static - signal_vc = true; - signal_vc_range = TimeRange(RATIONAL_MIN, RATIONAL_MAX); - } - - if (parentNode() != nullptr) - parentNode()->UnlockUserInput(); - - // We make sure this signal is emitted AFTER we've unlocked the node in case this leads to a tangent where something - // tries to relock this node before it's unlocked here - if (signal_vc) - emit ValueChanged(signal_vc_range.in(), signal_vc_range.out()); - -}*/ - -/*void NodeInput::set_keyframe_data(const QList keyframes) -{ - keyframes_ = keyframes; -} - -void NodeInput::insert_keyframe(const NodeKeyframe &key) -{ - Q_ASSERT(is_keyframing()); - - for (int i=0;i key.time()) { - keyframes_.insert(i, key); - emit KeyframeAdded(key); - return; - } - } - - keyframes_.append(key); - emit KeyframeAdded(key); -} - -void NodeInput::remove_keyframe_at_time(const rational &time) -{ - for (int i=0;iid() == dest->id()); // Copy values - dest->keyframes_ = source->keyframes_; + dest->keyframes_.clear(); + foreach (NodeKeyframePtr key, source->keyframes_) { + NodeKeyframePtr copy = std::make_shared(key->time(), key->value(), key->type()); + dest->keyframes_.append(copy); + } // Copy keyframing state dest->set_is_keyframing(source->is_keyframing());