fix input bug that doesn't deep copy keyframes correctly
This commit is contained in:
+8
-150
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user