diff --git a/app/panel/multicam/multicampanel.cpp b/app/panel/multicam/multicampanel.cpp index 97245437a..322b51458 100644 --- a/app/panel/multicam/multicampanel.cpp +++ b/app/panel/multicam/multicampanel.cpp @@ -2,16 +2,13 @@ namespace olive { -#define super PanelWidget +#define super ViewerPanelBase -MulticamPanel::MulticamPanel(ViewerPanelBase *sibling, QWidget *parent) : +MulticamPanel::MulticamPanel(QWidget *parent) : super(QStringLiteral("MultiCamPanel"), parent) { widget_ = new MulticamWidget(); - SetWidgetWithPadding(widget_); - - connect(sibling, &ViewerPanelBase::ColorManagerChanged, widget_, &MulticamWidget::ConnectColorManager); - widget_->ConnectCacher(static_cast(sibling->GetTimeBasedWidget())->GetCacher()); + SetViewerWidget(widget_); Retranslate(); } diff --git a/app/panel/multicam/multicampanel.h b/app/panel/multicam/multicampanel.h index 61a8efed7..1523d5ddc 100644 --- a/app/panel/multicam/multicampanel.h +++ b/app/panel/multicam/multicampanel.h @@ -3,26 +3,14 @@ #include "panel/viewer/viewerbase.h" #include "widget/multicam/multicamwidget.h" -#include "widget/panel/panel.h" namespace olive { -class MulticamPanel : public PanelWidget +class MulticamPanel : public ViewerPanelBase { Q_OBJECT public: - MulticamPanel(ViewerPanelBase *sibling, QWidget* parent = nullptr); - - void SetNode(MultiCamNode *n) - { - widget_->SetNode(n); - } - -public slots: - void SetTime(const rational &t) - { - widget_->SetTime(t); - } + MulticamPanel(QWidget* parent = nullptr); protected: virtual void Retranslate() override; diff --git a/app/widget/multicam/multicamwidget.cpp b/app/widget/multicam/multicamwidget.cpp index 6fb7fc19b..8c2af4dd0 100644 --- a/app/widget/multicam/multicamwidget.cpp +++ b/app/widget/multicam/multicamwidget.cpp @@ -2,103 +2,12 @@ namespace olive { -#define super ManagedDisplayWidget +#define super ViewerWidget MulticamWidget::MulticamWidget(QWidget *parent) : - super{parent}, - node_(nullptr), - cacher_(nullptr), - tex_(nullptr) + super{parent} { } -void MulticamWidget::SetNode(MultiCamNode *n) -{ - if (node_ == n) { - return; - } - - if (node_) { - // Disconnect - } - - node_ = n; - - if (node_) { - // Connect - } - - SetTime(time_); -} - -void MulticamWidget::SetTime(const rational &r) -{ - time_ = r; - - if (node_) { - if (cacher_) { - int sources = node_->InputArraySize(node_->kSourcesInput); - watchers_.resize(sources); - textures_.resize(sources); - - watchers_.fill(nullptr); - textures_.fill(nullptr); - - for (int i=0; iGetConnectedOutput(node_->kSourcesInput, 0)) { - auto w = new RenderTicketWatcher(this); - connect(w, &RenderTicketWatcher::Finished, this, &MulticamWidget::RenderedFrame); - w->SetTicket(cacher_->GetSingleFrame(n, time_, false)); - watchers_[i] = w; - } - } - } - } -} - -void MulticamWidget::OnInit() -{ - super::OnInit(); - - pipeline_ = renderer()->CreateNativeShader(ShaderCode(FileFunctions::ReadFileAsString(QStringLiteral(":/shaders/multicam.frag")))); -} - -void MulticamWidget::OnPaint() -{ - // Clear display surface - renderer()->ClearDestination(); - - if (tex_) { - ColorTransformJob job; - job.SetColorProcessor(color_service()); - job.SetInputTexture(tex_); - job.SetInputAlphaAssociation(kAlphaNone); - renderer()->BlitColorManaged(job, GetViewportParams()); - } -} - -void MulticamWidget::OnDestroy() -{ - pipeline_.clear(); - tex_ = nullptr; - - super::OnDestroy(); -} - -void MulticamWidget::RenderedFrame() -{ - auto watcher = static_cast(sender()); - if (watcher->HasResult()) { - int index = watchers_.indexOf(watcher); - - if (index != -1) { - if ((textures_[index] = watcher->Get().value())) { - update(); - } - } - } - delete watcher; -} - } diff --git a/app/widget/multicam/multicamwidget.h b/app/widget/multicam/multicamwidget.h index aa5bf05f0..19cb08510 100644 --- a/app/widget/multicam/multicamwidget.h +++ b/app/widget/multicam/multicamwidget.h @@ -3,54 +3,18 @@ #include "node/input/multicam/multicamnode.h" #include "render/previewautocacher.h" -#include "widget/manageddisplay/manageddisplay.h" +#include "widget/viewer/viewer.h" namespace olive { -class MulticamWidget : public ManagedDisplayWidget +class MulticamWidget : public ViewerWidget { Q_OBJECT public: explicit MulticamWidget(QWidget *parent = nullptr); - MANAGEDDISPLAYWIDGET_DEFAULT_DESTRUCTOR(MulticamWidget) - - void SetNode(MultiCamNode *n); - - void ConnectCacher(PreviewAutoCacher *c) - { - cacher_ = c; - } - -public slots: - void SetTime(const rational &r); - -protected slots: - virtual void OnInit() override; - - virtual void OnPaint() override; - - virtual void OnDestroy() override; - -signals: - - private: - MultiCamNode *node_; - - QVariant pipeline_; - - PreviewAutoCacher *cacher_; - - rational time_; - - TexturePtr tex_; - - QVector watchers_; - QVector textures_; - -private slots: - void RenderedFrame(); + //MultiCamNode *node_; }; diff --git a/app/window/mainwindow/mainwindow.cpp b/app/window/mainwindow/mainwindow.cpp index 9a336951e..c8595a64a 100644 --- a/app/window/mainwindow/mainwindow.cpp +++ b/app/window/mainwindow/mainwindow.cpp @@ -87,7 +87,7 @@ MainWindow::MainWindow(QWidget *parent) : param_panel_ = new ParamPanel(this); curve_panel_ = new CurvePanel(this); sequence_viewer_panel_ = new SequenceViewerPanel(this); - multicam_panel_ = new MulticamPanel(sequence_viewer_panel_, this); + multicam_panel_ = new MulticamPanel(this); pixel_sampler_panel_ = new PixelSamplerPanel(this); AppendProjectPanel(); tool_panel_ = new ToolPanel(this); @@ -106,6 +106,9 @@ MainWindow::MainWindow(QWidget *parent) : connect(param_panel_, &ParamPanel::SelectedNodesChanged, node_panel_, &NodePanel::Select); // Connect time signals together + connect(multicam_panel_, &SequenceViewerPanel::TimeChanged, param_panel_, &ParamPanel::SetTime); + connect(multicam_panel_, &SequenceViewerPanel::TimeChanged, curve_panel_, &NodeTablePanel::SetTime); + connect(multicam_panel_, &SequenceViewerPanel::TimeChanged, sequence_viewer_panel_, &SequenceViewerPanel::SetTime); connect(sequence_viewer_panel_, &SequenceViewerPanel::TimeChanged, param_panel_, &ParamPanel::SetTime); connect(sequence_viewer_panel_, &SequenceViewerPanel::TimeChanged, curve_panel_, &NodeTablePanel::SetTime); connect(sequence_viewer_panel_, &SequenceViewerPanel::TimeChanged, multicam_panel_, &MulticamPanel::SetTime); @@ -120,6 +123,7 @@ MainWindow::MainWindow(QWidget *parent) : sequence_viewer_panel_->ConnectTimeBasedPanel(param_panel_); sequence_viewer_panel_->ConnectTimeBasedPanel(curve_panel_); + sequence_viewer_panel_->ConnectTimeBasedPanel(multicam_panel_); scope_panel_->SetViewerPanel(sequence_viewer_panel_); @@ -494,18 +498,24 @@ void MainWindow::TimelinePanelSelectionChanged(const QVector &blocks) if (PanelManager::instance()->CurrentlyFocused(false) == panel) { UpdateNodePanelContextFromTimelinePanel(panel); - bool found = false; + MultiCamNode *multicam = nullptr; + for (Block *b : blocks) { if (ClipBlock *c = dynamic_cast(b)) { - if (MultiCamNode *m = dynamic_cast(c->GetConnectedOutput(c->kBufferIn))) { - multicam_panel_->SetNode(m); - found = true; + if ((multicam = dynamic_cast(c->GetConnectedOutput(c->kBufferIn)))) { break; } } } - if (!found) { - multicam_panel_->SetNode(nullptr); + + if (multicam) { + qDebug() << "Found multicam node!"; + //multicam_panel_->SetNode(multicam); + multicam_panel_->ConnectViewerNode(panel->GetConnectedViewer()); + } else { + qDebug() << "Found NO multicam node"; + multicam_panel_->ConnectViewerNode(nullptr); + //multicam_panel_->SetNode(nullptr); } } } @@ -624,6 +634,7 @@ TimelinePanel* MainWindow::AppendTimelinePanel() connect(panel, &TimelinePanel::RevealViewerInFootageViewer, this, &MainWindow::RevealViewerInFootageViewer); connect(param_panel_, &ParamPanel::TimeChanged, panel, &TimelinePanel::SetTime); connect(curve_panel_, &ParamPanel::TimeChanged, panel, &TimelinePanel::SetTime); + connect(multicam_panel_, &SequenceViewerPanel::TimeChanged, panel, &TimelinePanel::SetTime); connect(sequence_viewer_panel_, &SequenceViewerPanel::TimeChanged, panel, &TimelinePanel::SetTime); sequence_viewer_panel_->ConnectTimeBasedPanel(panel);