keyframes: only update active frames even from curve and param editor
When adjusting a slider, keyframe time, or curve value, it is undesirable to re-cache the entire affected area while the user is still dragging UI objects. Since the video is unlikely to be playing, the priority must go to the currently active frame so the user gets visual feedback on the rendered image as soon as possible. This was implemented in some areas, but this commit should have that functionality in all areas.
This commit is contained in:
@@ -64,12 +64,15 @@ void ClipBlock::InvalidateCache(const rational &start_range, const rational &end
|
||||
rational start = MediaToSequenceTime(start_range);
|
||||
rational end = MediaToSequenceTime(end_range);
|
||||
|
||||
// Ensure range actually covers this clip's area
|
||||
if (!(end < in() || start > out())) {
|
||||
|
||||
// Limit cache invalidation to clip lengths
|
||||
start = qMax(start, in());
|
||||
end = qMin(end, out());
|
||||
|
||||
Node::InvalidateCache(start, end, from);
|
||||
|
||||
}
|
||||
} else {
|
||||
// Otherwise, pass signal along normally
|
||||
|
||||
+5
-1
@@ -151,6 +151,7 @@ void NodeInput::Load(QXmlStreamReader *reader, QHash<quintptr, NodeOutput*>& par
|
||||
NodeKeyframePtr key = NodeKeyframe::Create(key_time, key_value, key_type, track);
|
||||
key->set_bezier_control_in(key_in_handle);
|
||||
key->set_bezier_control_out(key_out_handle);
|
||||
key->set_parent(this);
|
||||
keyframe_tracks_[track].append(key);
|
||||
}
|
||||
}
|
||||
@@ -600,6 +601,7 @@ void NodeInput::remove_keyframe(NodeKeyframePtr key)
|
||||
disconnect(key.get(), &NodeKeyframe::BezierControlOutChanged, this, &NodeInput::KeyframeBezierOutChanged);
|
||||
|
||||
keyframe_tracks_[key->track()].removeOne(key);
|
||||
key->set_parent(nullptr);
|
||||
|
||||
emit KeyframeRemoved(key);
|
||||
emit_time_range(time_affected);
|
||||
@@ -618,7 +620,7 @@ void NodeInput::KeyframeTimeChanged()
|
||||
// This keyframe needs resorting, store it and remove it from the list
|
||||
NodeKeyframePtr key_shared_ptr = keyframe_tracks_.at(key->track()).at(keyframe_index);
|
||||
|
||||
keyframe_tracks_.removeAt(keyframe_index);
|
||||
keyframe_tracks_[key->track()].removeAt(keyframe_index);
|
||||
|
||||
// Automatically insertion sort
|
||||
insert_keyframe_internal(key_shared_ptr);
|
||||
@@ -698,6 +700,8 @@ void NodeInput::insert_keyframe_internal(NodeKeyframePtr key)
|
||||
{
|
||||
KeyframeTrack& key_track = keyframe_tracks_[key->track()];
|
||||
|
||||
key->set_parent(this);
|
||||
|
||||
for (int i=0;i<key_track.size();i++) {
|
||||
NodeKeyframePtr compare = key_track.at(i);
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
const NodeKeyframe::Type NodeKeyframe::kDefaultType = kLinear;
|
||||
|
||||
NodeKeyframe::NodeKeyframe(const rational &time, const QVariant &value, const NodeKeyframe::Type &type, const int &track) :
|
||||
parent_(nullptr),
|
||||
time_(time),
|
||||
value_(value),
|
||||
type_(type),
|
||||
@@ -131,3 +132,13 @@ NodeKeyframe::BezierType NodeKeyframe::get_opposing_bezier_type(NodeKeyframe::Be
|
||||
return kInHandle;
|
||||
}
|
||||
}
|
||||
|
||||
NodeInput *NodeKeyframe::parent() const
|
||||
{
|
||||
return parent_;
|
||||
}
|
||||
|
||||
void NodeKeyframe::set_parent(NodeInput *parent)
|
||||
{
|
||||
parent_ = parent;
|
||||
}
|
||||
|
||||
@@ -27,6 +27,8 @@
|
||||
|
||||
#include "common/rational.h"
|
||||
|
||||
class NodeInput;
|
||||
|
||||
class NodeKeyframe;
|
||||
using NodeKeyframePtr = std::shared_ptr<NodeKeyframe>;
|
||||
|
||||
@@ -114,6 +116,9 @@ public:
|
||||
*/
|
||||
static BezierType get_opposing_bezier_type(BezierType type);
|
||||
|
||||
NodeInput* parent() const;
|
||||
void set_parent(NodeInput* parent);
|
||||
|
||||
signals:
|
||||
/**
|
||||
* @brief Signal emitted when this keyframe's time is changed
|
||||
@@ -141,6 +146,8 @@ signals:
|
||||
void BezierControlOutChanged(const QPointF& d);
|
||||
|
||||
private:
|
||||
NodeInput* parent_;
|
||||
|
||||
rational time_;
|
||||
|
||||
QVariant value_;
|
||||
|
||||
Reference in New Issue
Block a user