fix input bug that doesn't deep copy keyframes correctly

This commit is contained in:
itsmattkc
2019-12-26 21:51:08 +11:00
parent 1a1a7f029a
commit 87eacb2869
+8 -150
View File
@@ -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<keyframes_.size()-1;i++) {
NodeKeyframe& before = keyframes_[i];
NodeKeyframe& after = keyframes_[i+1];
if (before.time() == time) {
// Found exact match, replace it
before.set_value(value);
// Values have changed since the last keyframe and the next one
signal_vc = true;
signal_vc_range = TimeRange(keyframes_.at(i-1).time(), keyframes_.at(i+1).time());
break;
} else if (before.time() < time && after.time() > 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<NodeKeyframe> keyframes)
{
keyframes_ = keyframes;
}
void NodeInput::insert_keyframe(const NodeKeyframe &key)
{
Q_ASSERT(is_keyframing());
for (int i=0;i<keyframes_.size();i++) {
const NodeKeyframe& compare = keyframes_.at(i);
// Try to order the keyframe by time
if (compare.time() == key.time()) {
emit KeyframeRemoved(compare);
keyframes_.replace(i, key);
emit KeyframeAdded(key);
return;
} else if (compare.time() > 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;i<keyframes_.size();i++) {
if (keyframes_.at(i).time() == time) {
emit KeyframeRemoved(keyframes_.at(i));
keyframes_.removeAt(i);
break;
}
}
}*/
bool NodeInput::is_keyframing() const
{
return keyframing_;
@@ -493,7 +347,11 @@ void NodeInput::CopyValues(NodeInput *source, NodeInput *dest, bool include_conn
Q_ASSERT(source->id() == dest->id());
// Copy values
dest->keyframes_ = source->keyframes_;
dest->keyframes_.clear();
foreach (NodeKeyframePtr key, source->keyframes_) {
NodeKeyframePtr copy = std::make_shared<NodeKeyframe>(key->time(), key->value(), key->type());
dest->keyframes_.append(copy);
}
// Copy keyframing state
dest->set_is_keyframing(source->is_keyframing());