mirror of
https://github.com/brunoherbelin/vimix.git
synced 2025-12-11 18:34:58 +01:00
BugFix ImageFilters Repair filters
Use of secondary texture in image shader (renamed from mask texture) in image filters for ichannel_1 as texture of display loopback only if not needed otherwise (e.g. input image needed in Sharpen filter).
This commit is contained in:
@@ -292,7 +292,7 @@ void ImageFilteringShader::copy(ImageFilteringShader const& S)
|
|||||||
/// ////
|
/// ////
|
||||||
////////////////////////////////////////
|
////////////////////////////////////////
|
||||||
|
|
||||||
ImageFilter::ImageFilter (): FrameBufferFilter(), buffers_({nullptr, nullptr})
|
ImageFilter::ImageFilter (): FrameBufferFilter(), buffers_({nullptr, nullptr}), channel1_output_session(true)
|
||||||
{
|
{
|
||||||
// surface and shader for first pass
|
// surface and shader for first pass
|
||||||
shaders_.first = new ImageFilteringShader;
|
shaders_.first = new ImageFilteringShader;
|
||||||
@@ -381,6 +381,7 @@ void ImageFilter::draw (FrameBuffer *input)
|
|||||||
input_ = input;
|
input_ = input;
|
||||||
// create first-pass surface and shader, taking as texture the input framebuffer
|
// create first-pass surface and shader, taking as texture the input framebuffer
|
||||||
surfaces_.first->setTextureIndex( input_->texture() );
|
surfaces_.first->setTextureIndex( input_->texture() );
|
||||||
|
shaders_.first->secondary_texture = input_->texture();
|
||||||
// (re)create framebuffer for result of first-pass
|
// (re)create framebuffer for result of first-pass
|
||||||
if (buffers_.first != nullptr)
|
if (buffers_.first != nullptr)
|
||||||
delete buffers_.first;
|
delete buffers_.first;
|
||||||
@@ -390,6 +391,7 @@ void ImageFilter::draw (FrameBuffer *input)
|
|||||||
input_->blit( buffers_.first );
|
input_->blit( buffers_.first );
|
||||||
// create second-pass surface and shader, taking as texture the first-pass framebuffer
|
// create second-pass surface and shader, taking as texture the first-pass framebuffer
|
||||||
surfaces_.second->setTextureIndex( buffers_.first->texture() );
|
surfaces_.second->setTextureIndex( buffers_.first->texture() );
|
||||||
|
shaders_.second->secondary_texture = input_->texture();
|
||||||
// (re)create framebuffer for result of second-pass
|
// (re)create framebuffer for result of second-pass
|
||||||
if (buffers_.second != nullptr)
|
if (buffers_.second != nullptr)
|
||||||
delete buffers_.second;
|
delete buffers_.second;
|
||||||
@@ -401,16 +403,18 @@ void ImageFilter::draw (FrameBuffer *input)
|
|||||||
if ( enabled() || forced )
|
if ( enabled() || forced )
|
||||||
{
|
{
|
||||||
// FIRST PASS
|
// FIRST PASS
|
||||||
|
if (channel1_output_session)
|
||||||
|
shaders_.first->secondary_texture = Mixer::manager().session()->frame()->texture();
|
||||||
// render input surface into frame buffer
|
// render input surface into frame buffer
|
||||||
shaders_.first->mask_texture = Mixer::manager().session()->frame()->texture();
|
|
||||||
buffers_.first->begin();
|
buffers_.first->begin();
|
||||||
surfaces_.first->draw(glm::identity<glm::mat4>(), buffers_.first->projection());
|
surfaces_.first->draw(glm::identity<glm::mat4>(), buffers_.first->projection());
|
||||||
buffers_.first->end();
|
buffers_.first->end();
|
||||||
|
|
||||||
// SECOND PASS
|
// SECOND PASS
|
||||||
if ( program_.isTwoPass() ) {
|
if ( program_.isTwoPass() ) {
|
||||||
|
if (channel1_output_session)
|
||||||
|
shaders_.second->secondary_texture = Mixer::manager().session()->frame()->texture();
|
||||||
// render filtered surface from first pass into frame buffer
|
// render filtered surface from first pass into frame buffer
|
||||||
shaders_.second->mask_texture = Mixer::manager().session()->frame()->texture();
|
|
||||||
buffers_.second->begin();
|
buffers_.second->begin();
|
||||||
surfaces_.second->draw(glm::identity<glm::mat4>(), buffers_.second->projection());
|
surfaces_.second->draw(glm::identity<glm::mat4>(), buffers_.second->projection());
|
||||||
buffers_.second->end();
|
buffers_.second->end();
|
||||||
@@ -525,6 +529,7 @@ std::vector< FilteringProgram > ResampleFilter::programs_ = {
|
|||||||
|
|
||||||
ResampleFilter::ResampleFilter (): ImageFilter(), factor_(RESAMPLE_INVALID)
|
ResampleFilter::ResampleFilter (): ImageFilter(), factor_(RESAMPLE_INVALID)
|
||||||
{
|
{
|
||||||
|
channel1_output_session = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResampleFilter::setFactor(int factor)
|
void ResampleFilter::setFactor(int factor)
|
||||||
@@ -579,7 +584,7 @@ void ResampleFilter::draw (FrameBuffer *input)
|
|||||||
|
|
||||||
// create first-pass surface and shader, taking as texture the input framebuffer
|
// create first-pass surface and shader, taking as texture the input framebuffer
|
||||||
surfaces_.first->setTextureIndex( input_->texture() );
|
surfaces_.first->setTextureIndex( input_->texture() );
|
||||||
shaders_.first->mask_texture = input_->texture();
|
shaders_.first->secondary_texture = input_->texture();
|
||||||
// (re)create framebuffer for result of first-pass
|
// (re)create framebuffer for result of first-pass
|
||||||
if (buffers_.first != nullptr)
|
if (buffers_.first != nullptr)
|
||||||
delete buffers_.first;
|
delete buffers_.first;
|
||||||
@@ -604,7 +609,7 @@ void ResampleFilter::draw (FrameBuffer *input)
|
|||||||
// SECOND PASS for QUARTER resolution (divide by 2 after first pass divide by 2)
|
// SECOND PASS for QUARTER resolution (divide by 2 after first pass divide by 2)
|
||||||
// create second-pass surface and shader, taking as texture the first-pass framebuffer
|
// create second-pass surface and shader, taking as texture the first-pass framebuffer
|
||||||
surfaces_.second->setTextureIndex( buffers_.first->texture() );
|
surfaces_.second->setTextureIndex( buffers_.first->texture() );
|
||||||
shaders_.second->mask_texture = input_->texture();
|
shaders_.second->secondary_texture = input_->texture();
|
||||||
// (re)create framebuffer for result of second-pass
|
// (re)create framebuffer for result of second-pass
|
||||||
if (buffers_.second != nullptr)
|
if (buffers_.second != nullptr)
|
||||||
delete buffers_.second;
|
delete buffers_.second;
|
||||||
@@ -662,6 +667,7 @@ std::vector< FilteringProgram > BlurFilter::programs_ = {
|
|||||||
BlurFilter::BlurFilter (): ImageFilter(), method_(BLUR_INVALID), mipmap_buffer_(nullptr)
|
BlurFilter::BlurFilter (): ImageFilter(), method_(BLUR_INVALID), mipmap_buffer_(nullptr)
|
||||||
{
|
{
|
||||||
mipmap_surface_ = new Surface;
|
mipmap_surface_ = new Surface;
|
||||||
|
channel1_output_session = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
BlurFilter::~BlurFilter ()
|
BlurFilter::~BlurFilter ()
|
||||||
@@ -733,7 +739,7 @@ void BlurFilter::draw (FrameBuffer *input)
|
|||||||
|
|
||||||
// create first-pass surface and shader, taking as texture the input framebuffer
|
// create first-pass surface and shader, taking as texture the input framebuffer
|
||||||
surfaces_.first->setTextureIndex( mipmap_buffer_->texture() );
|
surfaces_.first->setTextureIndex( mipmap_buffer_->texture() );
|
||||||
shaders_.first->mask_texture = input_->texture();
|
shaders_.first->secondary_texture = input_->texture();
|
||||||
// (re)create framebuffer for result of first-pass
|
// (re)create framebuffer for result of first-pass
|
||||||
if (buffers_.first != nullptr)
|
if (buffers_.first != nullptr)
|
||||||
delete buffers_.first;
|
delete buffers_.first;
|
||||||
@@ -743,7 +749,7 @@ void BlurFilter::draw (FrameBuffer *input)
|
|||||||
|
|
||||||
// create second-pass surface and shader, taking as texture the first-pass framebuffer
|
// create second-pass surface and shader, taking as texture the first-pass framebuffer
|
||||||
surfaces_.second->setTextureIndex( buffers_.first->texture() );
|
surfaces_.second->setTextureIndex( buffers_.first->texture() );
|
||||||
shaders_.second->mask_texture = input_->texture();
|
shaders_.second->secondary_texture = input_->texture();
|
||||||
// (re)create framebuffer for result of second-pass
|
// (re)create framebuffer for result of second-pass
|
||||||
if (buffers_.second != nullptr)
|
if (buffers_.second != nullptr)
|
||||||
delete buffers_.second;
|
delete buffers_.second;
|
||||||
@@ -803,6 +809,7 @@ std::vector< FilteringProgram > SharpenFilter::programs_ = {
|
|||||||
|
|
||||||
SharpenFilter::SharpenFilter (): ImageFilter(), method_(SHARPEN_INVALID)
|
SharpenFilter::SharpenFilter (): ImageFilter(), method_(SHARPEN_INVALID)
|
||||||
{
|
{
|
||||||
|
channel1_output_session = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SharpenFilter::setMethod(int method)
|
void SharpenFilter::setMethod(int method)
|
||||||
@@ -880,6 +887,7 @@ std::vector< FilteringProgram > SmoothFilter::programs_ = {
|
|||||||
|
|
||||||
SmoothFilter::SmoothFilter (): ImageFilter(), method_(SMOOTH_INVALID)
|
SmoothFilter::SmoothFilter (): ImageFilter(), method_(SMOOTH_INVALID)
|
||||||
{
|
{
|
||||||
|
channel1_output_session = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SmoothFilter::setMethod(int method)
|
void SmoothFilter::setMethod(int method)
|
||||||
@@ -950,6 +958,7 @@ std::vector< FilteringProgram > EdgeFilter::programs_ = {
|
|||||||
|
|
||||||
EdgeFilter::EdgeFilter (): ImageFilter(), method_(EDGE_INVALID)
|
EdgeFilter::EdgeFilter (): ImageFilter(), method_(EDGE_INVALID)
|
||||||
{
|
{
|
||||||
|
channel1_output_session = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void EdgeFilter::setMethod(int method)
|
void EdgeFilter::setMethod(int method)
|
||||||
@@ -1020,6 +1029,7 @@ std::vector< FilteringProgram > AlphaFilter::programs_ = {
|
|||||||
|
|
||||||
AlphaFilter::AlphaFilter (): ImageFilter(), operation_(ALPHA_INVALID)
|
AlphaFilter::AlphaFilter (): ImageFilter(), operation_(ALPHA_INVALID)
|
||||||
{
|
{
|
||||||
|
channel1_output_session = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AlphaFilter::setOperation(int op)
|
void AlphaFilter::setOperation(int op)
|
||||||
|
|||||||
@@ -139,6 +139,7 @@ protected:
|
|||||||
std::pair< FrameBuffer *, FrameBuffer * > buffers_;
|
std::pair< FrameBuffer *, FrameBuffer * > buffers_;
|
||||||
std::pair< ImageFilteringShader *, ImageFilteringShader *> shaders_;
|
std::pair< ImageFilteringShader *, ImageFilteringShader *> shaders_;
|
||||||
void updateParameters();
|
void updateParameters();
|
||||||
|
bool channel1_output_session;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ const char* MaskShader::mask_icons[4] = { ICON_FA_WINDOW_CLOSE, ICON_FA_EDIT, I
|
|||||||
const char* MaskShader::mask_names[4] = { "No mask", "Paint mask", "Shape mask", "Source mask" };
|
const char* MaskShader::mask_names[4] = { "No mask", "Paint mask", "Shape mask", "Source mask" };
|
||||||
const char* MaskShader::mask_shapes[5] = { "Ellipse", "Oblong", "Rectangle", "Horizontal", "Vertical" };
|
const char* MaskShader::mask_shapes[5] = { "Ellipse", "Oblong", "Rectangle", "Horizontal", "Vertical" };
|
||||||
|
|
||||||
ImageShader::ImageShader(): Shader(), mask_texture(0), stipple(0.f)
|
ImageShader::ImageShader(): Shader(), secondary_texture(0), stipple(0.f)
|
||||||
{
|
{
|
||||||
// static program shader
|
// static program shader
|
||||||
program_ = &imageShadingProgram;
|
program_ = &imageShadingProgram;
|
||||||
@@ -60,21 +60,21 @@ void ImageShader::use()
|
|||||||
program_->setUniform("iNodes", iNodes);
|
program_->setUniform("iNodes", iNodes);
|
||||||
|
|
||||||
// default mask
|
// default mask
|
||||||
if (mask_texture == 0)
|
if (secondary_texture == 0)
|
||||||
mask_texture = Resource::getTextureWhite();
|
secondary_texture = Resource::getTextureWhite();
|
||||||
|
|
||||||
// setup mask texture
|
// setup mask texture
|
||||||
glActiveTexture(GL_TEXTURE1);
|
glActiveTexture(GL_TEXTURE1);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
glBindTexture (GL_TEXTURE_2D, mask_texture);
|
glBindTexture (GL_TEXTURE_2D, secondary_texture);
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImageShader::reset()
|
void ImageShader::reset()
|
||||||
{
|
{
|
||||||
Shader::reset();
|
Shader::reset();
|
||||||
mask_texture = 0;
|
secondary_texture = 0;
|
||||||
|
|
||||||
// no stippling
|
// no stippling
|
||||||
stipple = 0.f;
|
stipple = 0.f;
|
||||||
@@ -84,7 +84,7 @@ void ImageShader::reset()
|
|||||||
|
|
||||||
void ImageShader::copy(ImageShader const& S)
|
void ImageShader::copy(ImageShader const& S)
|
||||||
{
|
{
|
||||||
mask_texture = S.mask_texture;
|
secondary_texture = S.secondary_texture;
|
||||||
stipple = S.stipple;
|
stipple = S.stipple;
|
||||||
iNodes = S.iNodes;
|
iNodes = S.iNodes;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
#ifndef IMAGESHADER_H
|
#ifndef IMAGESHADER_H
|
||||||
#define IMAGESHADER_H
|
#define IMAGESHADER_H
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <map>
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#include "Shader.h"
|
#include "Shader.h"
|
||||||
@@ -18,7 +16,7 @@ public:
|
|||||||
void accept(Visitor& v) override;
|
void accept(Visitor& v) override;
|
||||||
void copy(ImageShader const& S);
|
void copy(ImageShader const& S);
|
||||||
|
|
||||||
uint mask_texture;
|
uint secondary_texture;
|
||||||
|
|
||||||
// uniforms
|
// uniforms
|
||||||
float stipple;
|
float stipple;
|
||||||
|
|||||||
@@ -948,7 +948,7 @@ void Source::update(float dt)
|
|||||||
if (ref_source != nullptr) {
|
if (ref_source != nullptr) {
|
||||||
if (ref_source->ready())
|
if (ref_source->ready())
|
||||||
// set mask texture to mask source
|
// set mask texture to mask source
|
||||||
blendingshader_->mask_texture = ref_source->frame()->texture();
|
blendingshader_->secondary_texture = ref_source->frame()->texture();
|
||||||
else
|
else
|
||||||
// retry for when source will be ready
|
// retry for when source will be ready
|
||||||
need_update_ |= SourceUpdate_Mask;
|
need_update_ |= SourceUpdate_Mask;
|
||||||
@@ -964,7 +964,7 @@ void Source::update(float dt)
|
|||||||
masksurface_->draw(glm::identity<glm::mat4>(), maskbuffer_->projection());
|
masksurface_->draw(glm::identity<glm::mat4>(), maskbuffer_->projection());
|
||||||
maskbuffer_->end();
|
maskbuffer_->end();
|
||||||
// set mask texture to mask buffer
|
// set mask texture to mask buffer
|
||||||
blendingshader_->mask_texture = maskbuffer_->texture();
|
blendingshader_->secondary_texture = maskbuffer_->texture();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -535,7 +535,7 @@ bool TextureView::adjustBackground()
|
|||||||
shift_crop_.x *= edit_source_->frame()->aspectRatio();
|
shift_crop_.x *= edit_source_->frame()->aspectRatio();
|
||||||
|
|
||||||
preview_surface_->setTextureIndex(edit_source_->frame()->texture());
|
preview_surface_->setTextureIndex(edit_source_->frame()->texture());
|
||||||
preview_shader_->mask_texture = edit_source_->blendingShader()->mask_texture;
|
preview_shader_->secondary_texture = edit_source_->blendingShader()->secondary_texture;
|
||||||
preview_surface_->scale_ = scale_crop_;
|
preview_surface_->scale_ = scale_crop_;
|
||||||
preview_surface_->translation_ = shift_crop_;
|
preview_surface_->translation_ = shift_crop_;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user