|
|
@@ -199,6 +199,20 @@ shader_program opengl_manager::compile(identity<shader> fragmentShader,
|
|
|
return shader_program{id, fragmentShader, vertexShader};
|
|
|
}
|
|
|
|
|
|
+opengl_uniform_data & opengl_manager::data(identity<shader_program> program) {
|
|
|
+ auto & data = data_[program];
|
|
|
+ // TODO: perform this in compile()
|
|
|
+ if (data.uniform_id.empty()) {
|
|
|
+ glUseProgram(program.id);
|
|
|
+ using materials::uniform;
|
|
|
+ data.uniform_id = {
|
|
|
+ {uniform::NORMAL, glGetUniformLocation(program.id, "u_normalMap")},
|
|
|
+ {uniform::DIFFUSE, glGetUniformLocation(program.id, "u_diffuseMap")},
|
|
|
+ {uniform::SPECULAR, glGetUniformLocation(program.id, "u_specularMap")}};
|
|
|
+ }
|
|
|
+ return data;
|
|
|
+}
|
|
|
+
|
|
|
namespace graphics { namespace shaders {
|
|
|
void activate(identity<shader_program> program) {
|
|
|
// 100. Use the shader program ID to "turn it on" for all subsequent drawing
|
|
|
@@ -248,26 +262,4 @@ namespace graphics { namespace shaders {
|
|
|
// for GL_TEXTURE3, texture unit 3
|
|
|
glUniform1i(emissiveMap, 3);
|
|
|
}
|
|
|
-
|
|
|
- int uniform_location(identity<shader_program> program,
|
|
|
- std::string const & uniform) {
|
|
|
- return glGetUniformLocation(program.id, uniform.c_str());
|
|
|
- }
|
|
|
-}}
|
|
|
-
|
|
|
-namespace graphics { namespace materials {
|
|
|
- void activate(identity<shader_program> program,
|
|
|
- std::vector<uniform> const & uniforms) {
|
|
|
- glUseProgram(program.id);
|
|
|
-
|
|
|
- for (unsigned int i = 0; i < uniforms.size(); i++) {
|
|
|
- const uniform & uniform = uniforms[i];
|
|
|
- glActiveTexture(i + GL_TEXTURE0);
|
|
|
- // glEnable(GL_TEXTURE_2D);
|
|
|
- glBindTexture(GL_TEXTURE_2D, uniform.texture.id);
|
|
|
- glUniform1i(uniform.uniform_id, i);
|
|
|
- }
|
|
|
-
|
|
|
- glActiveTexture(GL_TEXTURE0);
|
|
|
- }
|
|
|
}}
|