-#include <GL/glew.h>
+#include <epoxy/gl.h>
+#include "effect_chain.h"
#include "slice_effect.h"
#include "effect_util.h"
#include "util.h"
namespace movit {
SliceEffect::SliceEffect()
+ : input_slice_size(1),
+ output_slice_size(1),
+ offset(0),
+ direction(VERTICAL)
{
register_int("input_slice_size", &input_slice_size);
register_int("output_slice_size", &output_slice_size);
+ register_int("offset", &offset);
register_int("direction", (int *)&direction);
+ register_uniform_float("output_coord_to_slice_num", &uniform_output_coord_to_slice_num);
+ register_uniform_float("slice_num_to_input_coord", &uniform_slice_num_to_input_coord);
+ register_uniform_float("slice_offset_to_input_coord", &uniform_slice_offset_to_input_coord);
+ register_uniform_float("normalized_offset", &uniform_offset);
}
string SliceEffect::output_fragment_shader()
get_output_size(&output_width, &output_height, &output_width, &output_height);
if (direction == HORIZONTAL) {
- set_uniform_float(glsl_program_num, prefix, "output_coord_to_slice_num", float(output_width) / float(output_slice_size));
- set_uniform_float(glsl_program_num, prefix, "slice_num_to_input_coord", float(input_slice_size) / float(input_width));
- set_uniform_float(glsl_program_num, prefix, "slice_offset_to_input_coord", float(output_slice_size) / float(input_width));
+ uniform_output_coord_to_slice_num = float(output_width) / float(output_slice_size);
+ uniform_slice_num_to_input_coord = float(input_slice_size) / float(input_width);
+ uniform_slice_offset_to_input_coord = float(output_slice_size) / float(input_width);
+ uniform_offset = float(offset) / float(input_width);
} else {
- set_uniform_float(glsl_program_num, prefix, "output_coord_to_slice_num", float(output_height) / float(output_slice_size));
- set_uniform_float(glsl_program_num, prefix, "slice_num_to_input_coord", float(input_slice_size) / float(input_height));
- set_uniform_float(glsl_program_num, prefix, "slice_offset_to_input_coord", float(output_slice_size) / float(input_height));
+ uniform_output_coord_to_slice_num = float(output_height) / float(output_slice_size);
+ uniform_slice_num_to_input_coord = float(input_slice_size) / float(input_height);
+ uniform_slice_offset_to_input_coord = float(output_slice_size) / float(input_height);
+ uniform_offset = float(offset) / float(input_height);
}
- // Normalized coordinates could potentially cause blurring of the
- // image; it's not critical, but we have set changes_output_size()
- // and needs_texture_bounce(), so simply turning off the interpolation
- // is allowed.
- assert(*sampler_num == 1);
- glActiveTexture(GL_TEXTURE0);
+ // Normalized coordinates could potentially cause blurring of the image.
+ // It isn't critical, but still good practice.
+ Node *self = chain->find_node_for_effect(this);
+ glActiveTexture(chain->get_input_sampler(self, 0));
check_error();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
check_error();