void Effect::clear_gl_state() {}
-void Effect::register_uniform_bool(const std::string &key, const bool *value)
+void Effect::register_uniform_sampler2d(const std::string &key, const GLint *value)
{
- Uniform<bool> uniform;
+ Uniform<int> uniform;
uniform.name = key;
uniform.value = value;
uniform.num_values = 1;
uniform.location = -1;
- uniforms_bool.push_back(uniform);
+ uniforms_sampler2d.push_back(uniform);
}
-void Effect::register_uniform_int(const std::string &key, const int *value)
+void Effect::register_uniform_bool(const std::string &key, const bool *value)
{
- Uniform<int> uniform;
+ Uniform<bool> uniform;
uniform.name = key;
uniform.value = value;
uniform.num_values = 1;
uniform.location = -1;
- uniforms_int.push_back(uniform);
+ uniforms_bool.push_back(uniform);
}
-void Effect::register_uniform_sampler2d(const std::string &key, const GLint *value)
+void Effect::register_uniform_int(const std::string &key, const int *value)
{
Uniform<int> uniform;
uniform.name = key;
uniform.value = value;
uniform.num_values = 1;
uniform.location = -1;
- uniforms_sampler2d.push_back(uniform);
+ uniforms_int.push_back(uniform);
}
void Effect::register_uniform_float(const std::string &key, const float *value)
//
// Calling register_* will automatically imply register_uniform_*,
// except for register_int as noted above.
+ void register_uniform_sampler2d(const std::string &key, const int *value);
void register_uniform_bool(const std::string &key, const bool *value);
void register_uniform_int(const std::string &key, const int *value); // Note: Requires GLSL 1.30 or newer.
- void register_uniform_sampler2d(const std::string &key, const int *value);
void register_uniform_float(const std::string &key, const float *value);
void register_uniform_vec2(const std::string &key, const float *values);
void register_uniform_vec3(const std::string &key, const float *values);
std::map<std::string, float *> params_vec4;
// Picked out by EffectChain during finalization.
+ std::vector<Uniform<int> > uniforms_sampler2d;
std::vector<Uniform<bool> > uniforms_bool;
std::vector<Uniform<int> > uniforms_int;
- std::vector<Uniform<int> > uniforms_sampler2d;
std::vector<Uniform<float> > uniforms_float;
std::vector<Uniform<float> > uniforms_vec2;
std::vector<Uniform<float> > uniforms_vec3;
Node *node = phase->effects[i];
Effect *effect = node->effect;
const string effect_id = phase->effect_ids[node];
+ for (unsigned j = 0; j < effect->uniforms_sampler2d.size(); ++j) {
+ phase->uniforms_sampler2d.push_back(effect->uniforms_sampler2d[j]);
+ phase->uniforms_sampler2d.back().prefix = effect_id;
+ frag_shader_uniforms += string("uniform sampler2D ") + effect_id
+ + "_" + effect->uniforms_sampler2d[j].name + ";\n";
+ }
for (unsigned j = 0; j < effect->uniforms_bool.size(); ++j) {
phase->uniforms_bool.push_back(effect->uniforms_bool[j]);
phase->uniforms_bool.back().prefix = effect_id;
frag_shader_uniforms += string("uniform int ") + effect_id
+ "_" + effect->uniforms_int[j].name + ";\n";
}
- for (unsigned j = 0; j < effect->uniforms_sampler2d.size(); ++j) {
- phase->uniforms_int.push_back(effect->uniforms_sampler2d[j]);
- phase->uniforms_int.back().prefix = effect_id;
- frag_shader_uniforms += string("uniform sampler2D ") + effect_id
- + "_" + effect->uniforms_sampler2d[j].name + ";\n";
- }
for (unsigned j = 0; j < effect->uniforms_float.size(); ++j) {
phase->uniforms_float.push_back(effect->uniforms_float[j]);
phase->uniforms_float.back().prefix = effect_id;
phase->glsl_program_num = resource_pool->compile_glsl_program(vert_shader, frag_shader);
// Collect the resulting program numbers for each uniform.
+ for (unsigned i = 0; i < phase->uniforms_sampler2d.size(); ++i) {
+ Uniform<int> &uniform = phase->uniforms_sampler2d[i];
+ uniform.location = get_uniform_location(phase->glsl_program_num, uniform.prefix, uniform.name);
+ }
for (unsigned i = 0; i < phase->uniforms_bool.size(); ++i) {
Uniform<bool> &uniform = phase->uniforms_bool[i];
uniform.location = get_uniform_location(phase->glsl_program_num, uniform.prefix, uniform.name);
void EffectChain::setup_uniforms(Phase *phase)
{
// TODO: Use UBO blocks.
+ for (size_t i = 0; i < phase->uniforms_sampler2d.size(); ++i) {
+ const Uniform<int> &uniform = phase->uniforms_sampler2d[i];
+ if (uniform.location != -1) {
+ glUniform1iv(uniform.location, uniform.num_values, uniform.value);
+ }
+ }
for (size_t i = 0; i < phase->uniforms_bool.size(); ++i) {
const Uniform<bool> &uniform = phase->uniforms_bool[i];
assert(uniform.num_values == 1);
std::map<Node *, std::string> effect_ids;
// Uniforms for this phase; combined from all the effects.
+ std::vector<Uniform<int> > uniforms_sampler2d;
std::vector<Uniform<bool> > uniforms_bool;
std::vector<Uniform<int> > uniforms_int;
std::vector<Uniform<float> > uniforms_float;