From 69b249e7e0b38c64ac97f9d5e43ab24786e0966b Mon Sep 17 00:00:00 2001 From: brunoherbelin Date: Wed, 10 Jun 2020 19:41:13 +0200 Subject: [PATCH] Fixed Session Render Source (self-referenced session, not global). --- Mixer.cpp | 2 +- SessionCreator.cpp | 2 +- SessionSource.cpp | 26 +++++++++++++++++--------- SessionSource.h | 3 ++- 4 files changed, 21 insertions(+), 12 deletions(-) diff --git a/Mixer.cpp b/Mixer.cpp index a23ed6b..d8183ce 100644 --- a/Mixer.cpp +++ b/Mixer.cpp @@ -256,7 +256,7 @@ Source * Mixer::createSourceFile(std::string path) Source * Mixer::createSourceRender() { // ready to create a source - RenderSource *s = new RenderSource; + RenderSource *s = new RenderSource(session_); // propose a new name based on session name renameSource(s, SystemToolkit::base_filename(session_->filename())); diff --git a/SessionCreator.cpp b/SessionCreator.cpp index bdb2899..622e516 100644 --- a/SessionCreator.cpp +++ b/SessionCreator.cpp @@ -81,7 +81,7 @@ void SessionCreator::loadSession(XMLElement *sessionNode) session_->addSource(new_session_source); } else if ( std::string(pType) == "RenderSource") { - RenderSource *new_render_source = new RenderSource(); + RenderSource *new_render_source = new RenderSource(session_); new_render_source->accept(*this); session_->addSource(new_render_source); } diff --git a/SessionSource.cpp b/SessionSource.cpp index de3e016..f73a566 100644 --- a/SessionSource.cpp +++ b/SessionSource.cpp @@ -95,12 +95,14 @@ bool SessionSource::failed() const uint SessionSource::texture() const { + if (session_ == nullptr) + return Resource::getTextureBlack(); return session_->frame()->texture(); } void SessionSource::init() { - if ( loadFinished_ && !loadFailed_ ) { + if ( loadFinished_ && !loadFailed_ && session_ != nullptr) { loadFinished_ = false; // set resolution @@ -156,7 +158,7 @@ void SessionSource::accept(Visitor& v) } -RenderSource::RenderSource() : Source() +RenderSource::RenderSource(Session *session) : Source(), session_(session) { // create surface: sessionsurface_ = new Surface(rendershader_); @@ -170,24 +172,30 @@ RenderSource::~RenderSource() bool RenderSource::failed() const { - return Mixer::manager().session() == nullptr; + return session_ == nullptr; } uint RenderSource::texture() const { - return Mixer::manager().session()->frame()->texture(); + if (session_ == nullptr) + return Resource::getTextureBlack(); + return session_->frame()->texture(); } void RenderSource::init() { - Session *session = Mixer::manager().session(); - if (session && session->frame()->texture() != Resource::getTextureBlack()) { + if (session_ == nullptr) + session_ = Mixer::manager().session(); + + if (session_ && session_->frame()->texture() != Resource::getTextureBlack()) { + + FrameBuffer *fb = session_->frame(); // get the texture index from framebuffer of view, apply it to the surface - sessionsurface_->setTextureIndex( session->frame()->texture() ); + sessionsurface_->setTextureIndex( fb->texture() ); // create Frame buffer matching size of output session - FrameBuffer *renderbuffer = new FrameBuffer( session->frame()->resolution()); + FrameBuffer *renderbuffer = new FrameBuffer( fb->resolution()); // set the renderbuffer of the source and attach rendering nodes attach(renderbuffer); @@ -199,7 +207,7 @@ void RenderSource::init() // done init initialized_ = true; - Log::Info("Source Render linked to session (%d x %d).", int(session->frame()->resolution().x), int(session->frame()->resolution().y) ); + Log::Info("Source Render linked to session (%d x %d).", int(fb->resolution().x), int(fb->resolution().y) ); } } diff --git a/SessionSource.h b/SessionSource.h index 4c902e6..e90d4fc 100644 --- a/SessionSource.h +++ b/SessionSource.h @@ -40,7 +40,7 @@ protected: class RenderSource : public Source { public: - RenderSource(); + RenderSource(Session *session); ~RenderSource(); // implementation of source API @@ -53,6 +53,7 @@ protected: void init() override; Surface *sessionsurface_; + Session *session_; };