multicam: implemented queuing of future node selections during playback

This commit is contained in:
itsmattkc
2022-10-02 10:39:35 -07:00
parent 14bf515d3f
commit 14c7bd6dbc
8 changed files with 60 additions and 38 deletions
+24 -10
View File
@@ -56,15 +56,23 @@ MulticamWidget::MulticamWidget(QWidget *parent) :
}
}
void MulticamWidget::SetMulticamNode(MultiCamNode *n)
void MulticamWidget::SetMulticamNodeInternal(ViewerOutput *viewer, MultiCamNode *n, ClipBlock *clip)
{
ConnectViewerNode(viewer);
node_ = n;
display_->SetMulticamNode(n);
clip_ = clip;
}
void MulticamWidget::SetClip(ClipBlock *clip)
void MulticamWidget::SetMulticamNode(ViewerOutput *viewer, MultiCamNode *n, ClipBlock *clip, const rational &time)
{
clip_ = clip;
if (time == rational::NaN || time == GetTime()) {
SetMulticamNodeInternal(viewer, n, clip);
play_queue_.clear();
} else {
MulticamNodeQueue m = {time, viewer, n, clip};
play_queue_.push_back(m);
}
}
void MulticamWidget::ConnectNodeEvent(ViewerOutput *n)
@@ -83,6 +91,19 @@ void MulticamWidget::DisconnectNodeEvent(ViewerOutput *n)
disconnect(n, &ViewerOutput::PixelAspectChanged, sizer_, &ViewerSizer::SetPixelAspectRatio);
}
void MulticamWidget::TimeChangedEvent(const rational &t)
{
super::TimeChangedEvent(t);
if (!play_queue_.empty()) {
const MulticamNodeQueue &m = play_queue_.front();
if (m.time >= t) {
SetMulticamNodeInternal(m.viewer, m.node, m.clip);
play_queue_.pop_front();
}
}
}
void MulticamWidget::Switch(int source, bool split_clip)
{
if (!node_) {
@@ -112,13 +133,6 @@ void MulticamWidget::Switch(int source, bool split_clip)
command->add_child(new NodeParamSetStandardValueCommand(NodeKeyframeTrackReference(NodeInput(cam, cam->kCurrentInput)), source));
Core::instance()->undo_stack()->push(command);
if (cam != node_) {
SetMulticamNode(cam);
}
if (clip != clip_) {
SetClip(clip);
}
display_->update();
}
+14 -3
View File
@@ -35,15 +35,16 @@ public:
MulticamDisplay *GetDisplayWidget() const { return display_; }
void SetMulticamNode(MultiCamNode *n);
void SetClip(ClipBlock *clip);
void SetMulticamNode(ViewerOutput *viewer, MultiCamNode *n, ClipBlock *clip, const rational &time);
protected:
virtual void ConnectNodeEvent(ViewerOutput *n) override;
virtual void DisconnectNodeEvent(ViewerOutput *n) override;
virtual void TimeChangedEvent(const rational &t) override;
private:
void SetMulticamNodeInternal(ViewerOutput *viewer, MultiCamNode *n, ClipBlock *clip);
void Switch(int source, bool split_clip);
ViewerSizer *sizer_;
@@ -54,6 +55,16 @@ private:
ClipBlock *clip_;
struct MulticamNodeQueue
{
rational time;
ViewerOutput *viewer;
MultiCamNode *node;
ClipBlock *clip;
};
std::list<MulticamNodeQueue> play_queue_;
private slots:
void DisplayClicked(const QPoint &p);