mirror of
https://github.com/brunoherbelin/vimix.git
synced 2025-12-05 15:30:00 +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
|
||||
shaders_.first = new ImageFilteringShader;
|
||||
@@ -381,6 +381,7 @@ void ImageFilter::draw (FrameBuffer *input)
|
||||
input_ = input;
|
||||
// create first-pass surface and shader, taking as texture the input framebuffer
|
||||
surfaces_.first->setTextureIndex( input_->texture() );
|
||||
shaders_.first->secondary_texture = input_->texture();
|
||||
// (re)create framebuffer for result of first-pass
|
||||
if (buffers_.first != nullptr)
|
||||
delete buffers_.first;
|
||||
@@ -390,6 +391,7 @@ void ImageFilter::draw (FrameBuffer *input)
|
||||
input_->blit( buffers_.first );
|
||||
// create second-pass surface and shader, taking as texture the first-pass framebuffer
|
||||
surfaces_.second->setTextureIndex( buffers_.first->texture() );
|
||||
shaders_.second->secondary_texture = input_->texture();
|
||||
// (re)create framebuffer for result of second-pass
|
||||
if (buffers_.second != nullptr)
|
||||
delete buffers_.second;
|
||||
@@ -401,16 +403,18 @@ void ImageFilter::draw (FrameBuffer *input)
|
||||
if ( enabled() || forced )
|
||||
{
|
||||
// FIRST PASS
|
||||
if (channel1_output_session)
|
||||
shaders_.first->secondary_texture = Mixer::manager().session()->frame()->texture();
|
||||
// render input surface into frame buffer
|
||||
shaders_.first->mask_texture = Mixer::manager().session()->frame()->texture();
|
||||
buffers_.first->begin();
|
||||
surfaces_.first->draw(glm::identity<glm::mat4>(), buffers_.first->projection());
|
||||
buffers_.first->end();
|
||||
|
||||
// SECOND PASS
|
||||
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
|
||||
shaders_.second->mask_texture = Mixer::manager().session()->frame()->texture();
|
||||
buffers_.second->begin();
|
||||
surfaces_.second->draw(glm::identity<glm::mat4>(), buffers_.second->projection());
|
||||
buffers_.second->end();
|
||||
@@ -525,6 +529,7 @@ std::vector< FilteringProgram > ResampleFilter::programs_ = {
|
||||
|
||||
ResampleFilter::ResampleFilter (): ImageFilter(), factor_(RESAMPLE_INVALID)
|
||||
{
|
||||
channel1_output_session = false;
|
||||
}
|
||||
|
||||
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
|
||||
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
|
||||
if (buffers_.first != nullptr)
|
||||
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)
|
||||
// create second-pass surface and shader, taking as texture the first-pass framebuffer
|
||||
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
|
||||
if (buffers_.second != nullptr)
|
||||
delete buffers_.second;
|
||||
@@ -662,6 +667,7 @@ std::vector< FilteringProgram > BlurFilter::programs_ = {
|
||||
BlurFilter::BlurFilter (): ImageFilter(), method_(BLUR_INVALID), mipmap_buffer_(nullptr)
|
||||
{
|
||||
mipmap_surface_ = new Surface;
|
||||
channel1_output_session = false;
|
||||
}
|
||||
|
||||
BlurFilter::~BlurFilter ()
|
||||
@@ -733,7 +739,7 @@ void BlurFilter::draw (FrameBuffer *input)
|
||||
|
||||
// create first-pass surface and shader, taking as texture the input framebuffer
|
||||
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
|
||||
if (buffers_.first != nullptr)
|
||||
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
|
||||
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
|
||||
if (buffers_.second != nullptr)
|
||||
delete buffers_.second;
|
||||
@@ -803,6 +809,7 @@ std::vector< FilteringProgram > SharpenFilter::programs_ = {
|
||||
|
||||
SharpenFilter::SharpenFilter (): ImageFilter(), method_(SHARPEN_INVALID)
|
||||
{
|
||||
channel1_output_session = false;
|
||||
}
|
||||
|
||||
void SharpenFilter::setMethod(int method)
|
||||
@@ -880,6 +887,7 @@ std::vector< FilteringProgram > SmoothFilter::programs_ = {
|
||||
|
||||
SmoothFilter::SmoothFilter (): ImageFilter(), method_(SMOOTH_INVALID)
|
||||
{
|
||||
channel1_output_session = false;
|
||||
}
|
||||
|
||||
void SmoothFilter::setMethod(int method)
|
||||
@@ -950,6 +958,7 @@ std::vector< FilteringProgram > EdgeFilter::programs_ = {
|
||||
|
||||
EdgeFilter::EdgeFilter (): ImageFilter(), method_(EDGE_INVALID)
|
||||
{
|
||||
channel1_output_session = false;
|
||||
}
|
||||
|
||||
void EdgeFilter::setMethod(int method)
|
||||
@@ -1020,6 +1029,7 @@ std::vector< FilteringProgram > AlphaFilter::programs_ = {
|
||||
|
||||
AlphaFilter::AlphaFilter (): ImageFilter(), operation_(ALPHA_INVALID)
|
||||
{
|
||||
channel1_output_session = false;
|
||||
}
|
||||
|
||||
void AlphaFilter::setOperation(int op)
|
||||
|
||||
@@ -139,6 +139,7 @@ protected:
|
||||
std::pair< FrameBuffer *, FrameBuffer * > buffers_;
|
||||
std::pair< ImageFilteringShader *, ImageFilteringShader *> shaders_;
|
||||
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_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
|
||||
program_ = &imageShadingProgram;
|
||||
@@ -60,21 +60,21 @@ void ImageShader::use()
|
||||
program_->setUniform("iNodes", iNodes);
|
||||
|
||||
// default mask
|
||||
if (mask_texture == 0)
|
||||
mask_texture = Resource::getTextureWhite();
|
||||
if (secondary_texture == 0)
|
||||
secondary_texture = Resource::getTextureWhite();
|
||||
|
||||
// setup mask texture
|
||||
glActiveTexture(GL_TEXTURE1);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, 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);
|
||||
}
|
||||
|
||||
void ImageShader::reset()
|
||||
{
|
||||
Shader::reset();
|
||||
mask_texture = 0;
|
||||
secondary_texture = 0;
|
||||
|
||||
// no stippling
|
||||
stipple = 0.f;
|
||||
@@ -84,7 +84,7 @@ void ImageShader::reset()
|
||||
|
||||
void ImageShader::copy(ImageShader const& S)
|
||||
{
|
||||
mask_texture = S.mask_texture;
|
||||
secondary_texture = S.secondary_texture;
|
||||
stipple = S.stipple;
|
||||
iNodes = S.iNodes;
|
||||
}
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
#ifndef IMAGESHADER_H
|
||||
#define IMAGESHADER_H
|
||||
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include "Shader.h"
|
||||
@@ -18,7 +16,7 @@ public:
|
||||
void accept(Visitor& v) override;
|
||||
void copy(ImageShader const& S);
|
||||
|
||||
uint mask_texture;
|
||||
uint secondary_texture;
|
||||
|
||||
// uniforms
|
||||
float stipple;
|
||||
|
||||
@@ -948,7 +948,7 @@ void Source::update(float dt)
|
||||
if (ref_source != nullptr) {
|
||||
if (ref_source->ready())
|
||||
// set mask texture to mask source
|
||||
blendingshader_->mask_texture = ref_source->frame()->texture();
|
||||
blendingshader_->secondary_texture = ref_source->frame()->texture();
|
||||
else
|
||||
// retry for when source will be ready
|
||||
need_update_ |= SourceUpdate_Mask;
|
||||
@@ -964,7 +964,7 @@ void Source::update(float dt)
|
||||
masksurface_->draw(glm::identity<glm::mat4>(), maskbuffer_->projection());
|
||||
maskbuffer_->end();
|
||||
// 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();
|
||||
|
||||
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_->translation_ = shift_crop_;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user