mirror of
https://github.com/brunoherbelin/vimix.git
synced 2025-12-12 18:59:59 +01:00
First implementation of image processing shader de-activation for
sources.
This commit is contained in:
@@ -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,7 +271,15 @@ 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
|
||||
if (on)
|
||||
s.processingShader()->accept(*this);
|
||||
|
||||
// geometry direct control
|
||||
|
||||
@@ -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() ) {
|
||||
|
||||
@@ -25,6 +25,7 @@ public:
|
||||
protected:
|
||||
|
||||
void init() override;
|
||||
void replaceRenderingShader() override;
|
||||
|
||||
Surface *mediasurface_;
|
||||
std::string path_;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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_;
|
||||
};
|
||||
|
||||
39
Source.cpp
39
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()) {
|
||||
|
||||
18
Source.h
18
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_;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user