From fd0979887aab7138cbd08fbc5668c97356c361a9 Mon Sep 17 00:00:00 2001 From: brunoherbelin Date: Thu, 30 Jul 2020 02:03:01 +0200 Subject: [PATCH] First implementation of image processing shader de-activation for sources. --- ImGuiVisitor.cpp | 22 +++++++++++++++------- MediaSource.cpp | 7 ++++++- MediaSource.h | 1 + SessionSource.cpp | 14 ++++++++++++-- SessionSource.h | 2 ++ Source.cpp | 39 ++++++++++++++++++++++++++++++++++++--- Source.h | 18 ++++++++++++------ 7 files changed, 84 insertions(+), 19 deletions(-) diff --git a/ImGuiVisitor.cpp b/ImGuiVisitor.cpp index 6f8ff70..e04e05d 100644 --- a/ImGuiVisitor.cpp +++ b/ImGuiVisitor.cpp @@ -182,12 +182,12 @@ void ImGuiVisitor::visit(ImageProcessingShader &n) { ImGui::PushID(n.id()); - if (ImGuiToolkit::ButtonIcon(6, 2)) { - ImageProcessingShader defaultvalues; - n = defaultvalues; - } - ImGui::SameLine(0, 10); - ImGui::Text("Filters"); +// if (ImGuiToolkit::ButtonIcon(6, 2)) { +// ImageProcessingShader defaultvalues; +// n = defaultvalues; +// } +// ImGui::SameLine(0, 10); +// ImGui::Text("Filters"); if (ImGuiToolkit::ButtonIcon(6, 4)) n.gamma = glm::vec4(1.f, 1.f, 1.f, 1.f); ImGui::SameLine(0, 10); @@ -271,8 +271,16 @@ void ImGuiVisitor::visit (Source& s) ImVec2 imagesize ( preview_width, preview_width / s.frame()->aspectRatio()); ImGui::Image((void*)(uintptr_t) s.frame()->texture(), imagesize); + bool on = s.imageProcessingEnabled(); + if (ImGuiToolkit::ButtonIconToggle(11, 4, 10, 4, &on)) { + s.setImageProcessingEnabled(on); + } + ImGui::SameLine(0, 10); + ImGui::Text("Filters"); + // image processing pannel - s.processingShader()->accept(*this); + if (on) + s.processingShader()->accept(*this); // geometry direct control s.groupNode(View::GEOMETRY)->accept(*this); diff --git a/MediaSource.cpp b/MediaSource.cpp index ed5421f..8baeaeb 100644 --- a/MediaSource.cpp +++ b/MediaSource.cpp @@ -20,7 +20,7 @@ MediaSource::MediaSource() : Source(), path_("") // - textured with original texture from media player // - crop & repeat UV can be managed here // - additional custom shader can be associated - mediasurface_ = new Surface(rendershader_); + mediasurface_ = new Surface(renderingshader_); } @@ -60,6 +60,11 @@ uint MediaSource::texture() const return mediaplayer_->texture(); } +void MediaSource::replaceRenderingShader() +{ + mediasurface_->replaceShader(renderingshader_); +} + void MediaSource::init() { if ( mediaplayer_->isOpen() ) { diff --git a/MediaSource.h b/MediaSource.h index 0418a52..9663cb1 100644 --- a/MediaSource.h +++ b/MediaSource.h @@ -25,6 +25,7 @@ public: protected: void init() override; + void replaceRenderingShader() override; Surface *mediasurface_; std::string path_; diff --git a/SessionSource.cpp b/SessionSource.cpp index ce85757..358abff 100644 --- a/SessionSource.cpp +++ b/SessionSource.cpp @@ -79,7 +79,7 @@ SessionSource::SessionSource() : Source(), path_("") // - textured with original texture from session // - crop & repeat UV can be managed here // - additional custom shader can be associated - sessionsurface_ = new Surface(rendershader_); + sessionsurface_ = new Surface(processingshader_); } SessionSource::~SessionSource() @@ -130,6 +130,11 @@ uint SessionSource::texture() const return session_->frame()->texture(); } +void SessionSource::replaceRenderingShader() +{ + sessionsurface_->replaceShader(renderingshader_); +} + void SessionSource::init() { if (session_ == nullptr) @@ -247,7 +252,7 @@ void SessionSource::accept(Visitor& v) RenderSource::RenderSource(Session *session) : Source(), session_(session) { // create surface: - sessionsurface_ = new Surface(rendershader_); + sessionsurface_ = new Surface(processingshader_); } RenderSource::~RenderSource() @@ -269,6 +274,11 @@ uint RenderSource::texture() const return session_->frame()->texture(); } +void RenderSource::replaceRenderingShader() +{ + sessionsurface_->replaceShader(renderingshader_); +} + void RenderSource::init() { if (session_ == nullptr) diff --git a/SessionSource.h b/SessionSource.h index 3f99a01..6ecc51c 100644 --- a/SessionSource.h +++ b/SessionSource.h @@ -28,6 +28,7 @@ public: protected: void init() override; + void replaceRenderingShader() override; static void loadSession(const std::string& filename, SessionSource *source); Surface *sessionsurface_; @@ -55,6 +56,7 @@ public: protected: void init() override; + void replaceRenderingShader() override; Surface *sessionsurface_; Session *session_; }; diff --git a/Source.cpp b/Source.cpp index 2739653..558b3c5 100644 --- a/Source.cpp +++ b/Source.cpp @@ -121,13 +121,16 @@ Source::Source() : initialized_(false), active_(true), need_update_(true) // those will be associated to nodes later blendingshader_ = new ImageShader; -// rendershader_ = new ImageShader; - rendershader_ = new ImageProcessingShader; + processingshader_ = new ImageProcessingShader; + // default to image processing enabled + renderingshader_ = (Shader *) processingshader_; + renderbuffer_ = nullptr; rendersurface_ = nullptr; } + Source::~Source() { // delete objects @@ -193,6 +196,31 @@ void Source::setMode(Source::Mode m) mode_ = m; } + +void Source::setImageProcessingEnabled (bool on) +{ + if ( on == imageProcessingEnabled() ) + return; + + // set pointer + if (on) { + processingshader_ = new ImageProcessingShader; + renderingshader_ = (Shader *) processingshader_; + + } else { + processingshader_ = nullptr; + renderingshader_ = (Shader *) new ImageShader; + } + + // apply to nodes in subclasses + replaceRenderingShader(); +} + +bool Source::imageProcessingEnabled() +{ + return ( renderingshader_ == processingshader_ ); +} + void Source::attach(FrameBuffer *renderbuffer) { renderbuffer_ = renderbuffer; @@ -360,7 +388,7 @@ CloneSource *Source::clone() CloneSource::CloneSource(Source *origin) : Source(), origin_(origin) { // create surface: - clonesurface_ = new Surface(rendershader_); + clonesurface_ = new Surface(renderingshader_); } CloneSource::~CloneSource() @@ -378,6 +406,11 @@ CloneSource *CloneSource::clone() return nullptr; } +void CloneSource::replaceRenderingShader() +{ + clonesurface_->replaceShader(renderingshader_); +} + void CloneSource::init() { if (origin_ && origin_->ready()) { diff --git a/Source.h b/Source.h index 17e9723..418d29b 100644 --- a/Source.h +++ b/Source.h @@ -62,9 +62,13 @@ public: // tests if a given node is part of the source bool contains (Node *node) const; - // a Source has a shader to control image processing effects -// inline ImageShader *processingShader () const { return rendershader_; } - inline ImageProcessingShader *processingShader () const { return rendershader_; } + // a Source has a shader used to render in fbo + inline Shader *renderingShader() const { return renderingshader_; } + + // the rendering shader is either a simple or an image processing shader + inline ImageProcessingShader *processingShader () const { return processingshader_; } + void setImageProcessingEnabled (bool on); + bool imageProcessingEnabled(); // a Source has a shader to control mixing effects inline ImageShader *blendingShader () const { return blendingshader_; } @@ -137,9 +141,10 @@ protected: // It is associated to the rendershader for mixing effects FrameBufferSurface *rendersurface_; - // rendershader performs image processing -// ImageShader *rendershader_; - ImageProcessingShader *rendershader_; + // render and image processing shaders + virtual void replaceRenderingShader() = 0; + Shader *renderingshader_; + ImageProcessingShader *processingshader_; // blendingshader provides mixing controls ImageShader *blendingshader_; @@ -186,6 +191,7 @@ protected: CloneSource(Source *origin); void init() override; + void replaceRenderingShader() override; Surface *clonesurface_; Source *origin_; };