X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=effect.cpp;h=3446b42c05baab5553ae83f71c69d6ef8467774f;hp=3a4f8c8c3b30c8bbe3b2d4e423015e40b2af2825;hb=f99a1a6295d7809703f6b0dfb7ab4360916b002e;hpb=96a1cff51a8b7dc45ebe725e0d0685eecce31331 diff --git a/effect.cpp b/effect.cpp index 3a4f8c8..3446b42 100644 --- a/effect.cpp +++ b/effect.cpp @@ -1,51 +1,18 @@ -#define GL_GLEXT_PROTOTYPES 1 - +#include +#include #include #include -#include -#include "effect.h" -#include "util.h" +#include -#include -#include - -void set_uniform_float(GLuint glsl_program_num, const std::string &prefix, const std::string &key, float value) -{ - std::string name = prefix + "_" + key; - GLint l = glGetUniformLocation(glsl_program_num, name.c_str()); - if (l == -1) { - return; - } - check_error(); - glUniform1f(l, value); - check_error(); -} +#include "effect.h" +#include "effect_util.h" -void set_uniform_vec2(GLuint glsl_program_num, const std::string &prefix, const std::string &key, const float *values) -{ - std::string name = prefix + "_" + key; - GLint l = glGetUniformLocation(glsl_program_num, name.c_str()); - if (l == -1) { - return; - } - check_error(); - glUniform2fv(l, 1, values); - check_error(); -} +using namespace Eigen; +using namespace std; -void set_uniform_vec3(GLuint glsl_program_num, const std::string &prefix, const std::string &key, const float *values) -{ - std::string name = prefix + "_" + key; - GLint l = glGetUniformLocation(glsl_program_num, name.c_str()); - if (l == -1) { - return; - } - check_error(); - glUniform3fv(l, 1, 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; @@ -54,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; @@ -63,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; @@ -72,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; @@ -81,74 +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); } -// Output convenience uniforms for each parameter. -// These will be filled in per-frame. -std::string Effect::output_convenience_uniforms() +void Effect::register_vec4(const string &key, float *values) { - 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); - } - return output; + assert(params_vec4.count(key) == 0); + params_vec4[key] = values; + register_uniform_vec4(key, values); } -void Effect::set_uniforms(GLuint glsl_program_num, const std::string& prefix) +void Effect::set_gl_state(GLuint glsl_program_num, const string& prefix, unsigned *sampler_num) {} + +void Effect::clear_gl_state() {} + +void Effect::register_uniform_sampler2d(const std::string &key, const GLint *value) { - 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 = value; + uniform.num_values = 1; + uniform.location = -1; + uniforms_sampler2d.push_back(uniform); +} + +void Effect::register_uniform_bool(const std::string &key, const bool *value) +{ + Uniform uniform; + uniform.name = key; + uniform.value = value; + uniform.num_values = 1; + uniform.location = -1; + uniforms_bool.push_back(uniform); } + +void Effect::register_uniform_int(const std::string &key, const int *value) +{ + Uniform uniform; + uniform.name = key; + uniform.value = value; + uniform.num_values = 1; + uniform.location = -1; + uniforms_int.push_back(uniform); +} + +void Effect::register_uniform_float(const std::string &key, const float *value) +{ + Uniform uniform; + uniform.name = key; + uniform.value = value; + uniform.num_values = 1; + uniform.location = -1; + uniforms_float.push_back(uniform); +} + +void Effect::register_uniform_vec2(const std::string &key, const float *values) +{ + Uniform uniform; + uniform.name = key; + uniform.value = values; + uniform.num_values = 1; + uniform.location = -1; + uniforms_vec2.push_back(uniform); +} + +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