X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=effect_chain.cpp;h=9ff5fd812beb934ba9467a805416e7851c379a11;hb=2ced784c6599cb0b21427481ee17f4c8f6afdada;hp=04b698f25bacecc29a03472910c6bfe5f22246d9;hpb=d4542f76df5d26843c68b1467e76722cffd801a1;p=movit diff --git a/effect_chain.cpp b/effect_chain.cpp index 04b698f..9ff5fd8 100644 --- a/effect_chain.cpp +++ b/effect_chain.cpp @@ -14,8 +14,8 @@ #include "lift_gamma_gain_effect.h" #include "colorspace_conversion_effect.h" #include "saturation_effect.h" +#include "mirror_effect.h" #include "vignette_effect.h" -#include "texture_enum.h" EffectChain::EffectChain(unsigned width, unsigned height) : width(width), height(height), use_srgb_texture_format(false), finalized(false) {} @@ -45,6 +45,8 @@ Effect *instantiate_effect(EffectId effect) return new LiftGammaGainEffect(); case EFFECT_SATURATION: return new SaturationEffect(); + case EFFECT_MIRROR: + return new MirrorEffect(); case EFFECT_VIGNETTE: return new VignetteEffect(); } @@ -156,24 +158,6 @@ void EffectChain::finalize() current_gamma_curve = output_format.gamma_curve; } - std::string vert_shader = read_file("header.vert"); - for (unsigned i = 0; i < effects.size(); ++i) { - char effect_id[256]; - sprintf(effect_id, "eff%d", i); - - vert_shader += "\n"; - vert_shader += std::string("#define FUNCNAME ") + effect_id + "\n"; - vert_shader += replace_prefix(effects[i]->output_convenience_uniforms(), effect_id); - vert_shader += replace_prefix(effects[i]->output_vertex_shader(), effect_id); - vert_shader += "#undef PREFIX\n"; - vert_shader += "#undef FUNCNAME\n"; - vert_shader += "#undef LAST_INPUT\n"; - vert_shader += std::string("#define LAST_INPUT ") + effect_id + "\n"; - vert_shader += "\n"; - } - vert_shader.append(read_file("footer.vert")); - printf("%s\n", vert_shader.c_str()); - std::string frag_shader = read_file("header.frag"); for (unsigned i = 0; i < effects.size(); ++i) { char effect_id[256]; @@ -193,7 +177,7 @@ void EffectChain::finalize() printf("%s\n", frag_shader.c_str()); glsl_program_num = glCreateProgram(); - GLuint vs_obj = compile_shader(vert_shader, GL_VERTEX_SHADER); + GLuint vs_obj = compile_shader(read_file("vs.vert"), GL_VERTEX_SHADER); GLuint fs_obj = compile_shader(frag_shader, GL_FRAGMENT_SHADER); glAttachShader(glsl_program_num, vs_obj); check_error(); @@ -235,7 +219,11 @@ void EffectChain::finalize() memset(mapped_pbo, 0, width * height * bytes_per_pixel); glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB); - glBindTexture(GL_TEXTURE_2D, SOURCE_IMAGE); + glGenTextures(1, &source_image_num); + check_error(); + glBindTexture(GL_TEXTURE_2D, source_image_num); + check_error(); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); check_error(); glTexImage2D(GL_TEXTURE_2D, 0, internal_format, width, height, 0, format, GL_UNSIGNED_BYTE, BUFFER_OFFSET(0)); check_error(); @@ -260,7 +248,7 @@ void EffectChain::render_to_screen(unsigned char *src) // Re-upload the texture from the PBO. glActiveTexture(GL_TEXTURE0); check_error(); - glBindTexture(GL_TEXTURE_2D, SOURCE_IMAGE); + glBindTexture(GL_TEXTURE_2D, source_image_num); check_error(); glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, format, GL_UNSIGNED_BYTE, BUFFER_OFFSET(0)); check_error(); @@ -273,10 +261,11 @@ void EffectChain::render_to_screen(unsigned char *src) check_error(); glUniform1i(glGetUniformLocation(glsl_program_num, "input_tex"), 0); + unsigned sampler_num = 1; for (unsigned i = 0; i < effects.size(); ++i) { char effect_id[256]; sprintf(effect_id, "eff%d", i); - effects[i]->set_uniforms(glsl_program_num, effect_id); + effects[i]->set_uniforms(glsl_program_num, effect_id, &sampler_num); } glDisable(GL_BLEND);