X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=effect.cpp;h=3446b42c05baab5553ae83f71c69d6ef8467774f;hp=7f8dda2de1d76a1a57ec54bf06b10191bec62805;hb=f99a1a6295d7809703f6b0dfb7ab4360916b002e;hpb=879854382e1f6db14812cd6bd5390ca01f4b1d5a diff --git a/effect.cpp b/effect.cpp index 7f8dda2..3446b42 100644 --- a/effect.cpp +++ b/effect.cpp @@ -1,88 +1,18 @@ -#define GL_GLEXT_PROTOTYPES 1 - +#include +#include #include #include -#include -#include "effect.h" -#include "effect_chain.h" -#include "util.h" - -#include -#include - -GLint get_uniform_location(GLuint glsl_program_num, const std::string &prefix, const std::string &key) -{ - std::string name = prefix + "_" + key; - return glGetUniformLocation(glsl_program_num, name.c_str()); -} - -void set_uniform_int(GLuint glsl_program_num, const std::string &prefix, const std::string &key, int value) -{ - GLint location = get_uniform_location(glsl_program_num, prefix, key); - if (location == -1) { - return; - } - check_error(); - glUniform1i(location, value); - check_error(); -} - -void set_uniform_float(GLuint glsl_program_num, const std::string &prefix, const std::string &key, float value) -{ - GLint location = get_uniform_location(glsl_program_num, prefix, key); - if (location == -1) { - return; - } - check_error(); - glUniform1f(location, value); - check_error(); -} - -void set_uniform_float_array(GLuint glsl_program_num, const std::string &prefix, const std::string &key, const float *values, size_t num_values) -{ - GLint location = get_uniform_location(glsl_program_num, prefix, key); - if (location == -1) { - return; - } - check_error(); - glUniform1fv(location, num_values, values); - check_error(); -} +#include -void set_uniform_vec2(GLuint glsl_program_num, const std::string &prefix, const std::string &key, const float *values) -{ - GLint location = get_uniform_location(glsl_program_num, prefix, key); - if (location == -1) { - return; - } - check_error(); - glUniform2fv(location, 1, values); - check_error(); -} +#include "effect.h" +#include "effect_util.h" -void set_uniform_vec3(GLuint glsl_program_num, const std::string &prefix, const std::string &key, const float *values) -{ - GLint location = get_uniform_location(glsl_program_num, prefix, key); - if (location == -1) { - return; - } - check_error(); - glUniform3fv(location, 1, values); - check_error(); -} +using namespace Eigen; +using namespace std; -void set_uniform_vec4_array(GLuint glsl_program_num, const std::string &prefix, const std::string &key, const float *values, size_t num_values) -{ - GLint location = get_uniform_location(glsl_program_num, prefix, key); - if (location == -1) { - return; - } - check_error(); - glUniform4fv(location, num_values, values); - check_error(); -} +namespace movit { -bool Effect::set_int(const std::string &key, int value) +bool Effect::set_int(const string &key, int value) { if (params_int.count(key) == 0) { return false; @@ -91,7 +21,7 @@ bool Effect::set_int(const std::string &key, int value) return true; } -bool Effect::set_float(const std::string &key, float value) +bool Effect::set_float(const string &key, float value) { if (params_float.count(key) == 0) { return false; @@ -100,7 +30,7 @@ bool Effect::set_float(const std::string &key, float value) return true; } -bool Effect::set_vec2(const std::string &key, const float *values) +bool Effect::set_vec2(const string &key, const float *values) { if (params_vec2.count(key) == 0) { return false; @@ -109,7 +39,7 @@ bool Effect::set_vec2(const std::string &key, const float *values) return true; } -bool Effect::set_vec3(const std::string &key, const float *values) +bool Effect::set_vec3(const string &key, const float *values) { if (params_vec3.count(key) == 0) { return false; @@ -118,131 +48,172 @@ bool Effect::set_vec3(const std::string &key, const float *values) return true; } -void Effect::register_int(const std::string &key, int *value) +bool Effect::set_vec4(const string &key, const float *values) +{ + if (params_vec4.count(key) == 0) { + return false; + } + memcpy(params_vec4[key], values, sizeof(float) * 4); + return true; +} + +void Effect::register_int(const string &key, int *value) { assert(params_int.count(key) == 0); params_int[key] = value; + register_uniform_int(key, value); } -void Effect::register_float(const std::string &key, float *value) +void Effect::register_float(const string &key, float *value) { assert(params_float.count(key) == 0); params_float[key] = value; + register_uniform_float(key, value); } -void Effect::register_vec2(const std::string &key, float *values) +void Effect::register_vec2(const string &key, float *values) { assert(params_vec2.count(key) == 0); params_vec2[key] = values; + register_uniform_vec2(key, values); } -void Effect::register_vec3(const std::string &key, float *values) +void Effect::register_vec3(const string &key, float *values) { assert(params_vec3.count(key) == 0); params_vec3[key] = values; + register_uniform_vec3(key, values); } -void Effect::register_1d_texture(const std::string &key, float *values, size_t size) +void Effect::register_vec4(const string &key, float *values) { - assert(params_tex_1d.count(key) == 0); + assert(params_vec4.count(key) == 0); + params_vec4[key] = values; + register_uniform_vec4(key, values); +} - Texture1D tex; - tex.values = values; - tex.size = size; - tex.needs_update = false; - glGenTextures(1, &tex.texture_num); +void Effect::set_gl_state(GLuint glsl_program_num, const string& prefix, unsigned *sampler_num) {} - glBindTexture(GL_TEXTURE_1D, tex.texture_num); - check_error(); - glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - check_error(); - glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - check_error(); - glTexImage1D(GL_TEXTURE_1D, 0, GL_LUMINANCE16F_ARB, size, 0, GL_LUMINANCE, GL_FLOAT, values); - check_error(); +void Effect::clear_gl_state() {} - params_tex_1d[key] = tex; +void Effect::register_uniform_sampler2d(const std::string &key, const GLint *value) +{ + Uniform uniform; + uniform.name = key; + uniform.value = value; + uniform.num_values = 1; + uniform.location = -1; + uniforms_sampler2d.push_back(uniform); } -void Effect::invalidate_1d_texture(const std::string &key) +void Effect::register_uniform_bool(const std::string &key, const bool *value) { - assert(params_tex_1d.count(key) != 0); - params_tex_1d[key].needs_update = true; + Uniform uniform; + uniform.name = key; + uniform.value = value; + uniform.num_values = 1; + uniform.location = -1; + uniforms_bool.push_back(uniform); } -void Effect::add_self_to_effect_chain(EffectChain *chain, Effect *input) +void Effect::register_uniform_int(const std::string &key, const int *value) { - chain->add_effect_raw(this, input); + Uniform uniform; + uniform.name = key; + uniform.value = value; + uniform.num_values = 1; + uniform.location = -1; + uniforms_int.push_back(uniform); } -// Output convenience uniforms for each parameter. -// These will be filled in per-frame. -std::string Effect::output_convenience_uniforms() const +void Effect::register_uniform_float(const std::string &key, const float *value) { - std::string output = ""; - for (std::map::const_iterator it = params_float.begin(); - it != params_float.end(); - ++it) { - char buf[256]; - sprintf(buf, "uniform float PREFIX(%s);\n", it->first.c_str()); - output.append(buf); - } - for (std::map::const_iterator it = params_vec2.begin(); - it != params_vec2.end(); - ++it) { - char buf[256]; - sprintf(buf, "uniform vec2 PREFIX(%s);\n", it->first.c_str()); - output.append(buf); - } - for (std::map::const_iterator it = params_vec3.begin(); - it != params_vec3.end(); - ++it) { - char buf[256]; - sprintf(buf, "uniform vec3 PREFIX(%s);\n", it->first.c_str()); - output.append(buf); - } - for (std::map::const_iterator it = params_tex_1d.begin(); - it != params_tex_1d.end(); - ++it) { - char buf[256]; - sprintf(buf, "uniform sampler1D PREFIX(%s);\n", it->first.c_str()); - output.append(buf); - } - return output; + Uniform uniform; + uniform.name = key; + uniform.value = value; + uniform.num_values = 1; + uniform.location = -1; + uniforms_float.push_back(uniform); } -void Effect::set_uniforms(GLuint glsl_program_num, const std::string& prefix, unsigned *sampler_num) +void Effect::register_uniform_vec2(const std::string &key, const float *values) { - for (std::map::const_iterator it = params_float.begin(); - it != params_float.end(); - ++it) { - set_uniform_float(glsl_program_num, prefix, it->first, *it->second); - } - for (std::map::const_iterator it = params_vec2.begin(); - it != params_vec2.end(); - ++it) { - set_uniform_vec2(glsl_program_num, prefix, it->first, it->second); - } - for (std::map::const_iterator it = params_vec3.begin(); - it != params_vec3.end(); - ++it) { - set_uniform_vec3(glsl_program_num, prefix, it->first, it->second); - } + Uniform uniform; + uniform.name = key; + uniform.value = values; + uniform.num_values = 1; + uniform.location = -1; + uniforms_vec2.push_back(uniform); +} - for (std::map::const_iterator it = params_tex_1d.begin(); - it != params_tex_1d.end(); - ++it) { - glActiveTexture(GL_TEXTURE0 + *sampler_num); - check_error(); - glBindTexture(GL_TEXTURE_1D, it->second.texture_num); - check_error(); - - if (it->second.needs_update) { - glTexImage1D(GL_TEXTURE_1D, 0, GL_LUMINANCE16F_ARB, it->second.size, 0, GL_LUMINANCE, GL_FLOAT, it->second.values); - check_error(); - } - - set_uniform_int(glsl_program_num, prefix, it->first, *sampler_num); - ++*sampler_num; - } +void Effect::register_uniform_vec3(const std::string &key, const float *values) +{ + Uniform uniform; + uniform.name = key; + uniform.value = values; + uniform.num_values = 1; + uniform.location = -1; + uniforms_vec3.push_back(uniform); +} + +void Effect::register_uniform_vec4(const std::string &key, const float *values) +{ + Uniform uniform; + uniform.name = key; + uniform.value = values; + uniform.num_values = 1; + uniform.location = -1; + uniforms_vec4.push_back(uniform); } + +void Effect::register_uniform_float_array(const std::string &key, const float *values, size_t num_values) +{ + Uniform uniform; + uniform.name = key; + uniform.value = values; + uniform.num_values = num_values; + uniform.location = -1; + uniforms_float_array.push_back(uniform); +} + +void Effect::register_uniform_vec2_array(const std::string &key, const float *values, size_t num_values) +{ + Uniform uniform; + uniform.name = key; + uniform.value = values; + uniform.num_values = num_values; + uniform.location = -1; + uniforms_vec2_array.push_back(uniform); +} + +void Effect::register_uniform_vec3_array(const std::string &key, const float *values, size_t num_values) +{ + Uniform uniform; + uniform.name = key; + uniform.value = values; + uniform.num_values = num_values; + uniform.location = -1; + uniforms_vec3_array.push_back(uniform); +} + +void Effect::register_uniform_vec4_array(const std::string &key, const float *values, size_t num_values) +{ + Uniform uniform; + uniform.name = key; + uniform.value = values; + uniform.num_values = num_values; + uniform.location = -1; + uniforms_vec4_array.push_back(uniform); +} + +void Effect::register_uniform_mat3(const std::string &key, const Matrix3d *matrix) +{ + Uniform uniform; + uniform.name = key; + uniform.value = matrix; + uniform.num_values = 1; + uniform.location = -1; + uniforms_mat3.push_back(uniform); +} + +} // namespace movit