diff options
Diffstat (limited to 'src/glslprogram.cpp')
-rw-r--r-- | src/glslprogram.cpp | 79 |
1 files changed, 52 insertions, 27 deletions
diff --git a/src/glslprogram.cpp b/src/glslprogram.cpp index 6d0a60b2..d77f373d 100644 --- a/src/glslprogram.cpp +++ b/src/glslprogram.cpp @@ -12,39 +12,51 @@ #include <stdexcept> #include <vector> -namespace yage { +namespace yage +{ -GlslProgram::~GlslProgram() { +GlslProgram::~GlslProgram() +{ // cleanup all the shaders and the program - if (fragment_shader_id_ != 0) glDeleteShader(fragment_shader_id_); + if (fragment_shader_id_ != 0) { + glDeleteShader(fragment_shader_id_); + } - if (vertex_shader_id_ != 0) glDeleteShader(vertex_shader_id_); + if (vertex_shader_id_ != 0) { + glDeleteShader(vertex_shader_id_); + } - if (program_id_ != 0) glDeleteProgram(program_id_); + if (program_id_ != 0) { + glDeleteProgram(program_id_); + } } -void GlslProgram::compileShader(const GLuint& shader, - const std::string& file_path) { +void GlslProgram::compileShader(const GLuint &shader, + const std::string &file_path) +{ // get a string with the input from the shader file std::ifstream file(file_path); - if (!file.is_open()) + if (!file.is_open()) { throw std::runtime_error("Failed to open '" + file_path + "'"); + } std::string content = ""; std::string line; - while (std::getline(file, line)) content += line + "\n"; + while (std::getline(file, line)) { + content += line + "\n"; + } file.close(); // cast source to a c string to get the address of it and input it for // compilation - const auto* vertex_source = (const GLchar*)content.c_str(); + const auto *vertex_source = (const GLchar *)content.c_str(); glShaderSource(shader, 1, &vertex_source, nullptr); glCompileShader(shader); // check if compilation was successful GLint is_compiled = 0; - glGetShaderiv(shader, GL_COMPILE_STATUS, (int*)&is_compiled); + glGetShaderiv(shader, GL_COMPILE_STATUS, (int *)&is_compiled); // if it isn't compiled throw exception to clean up if (is_compiled == GL_FALSE) { @@ -53,34 +65,38 @@ void GlslProgram::compileShader(const GLuint& shader, std::vector<GLchar> error_log(max_length); glGetShaderInfoLog(shader, max_length, &max_length, &error_log[0]); - std::string error_log_str((const char*)&error_log[0]); + std::string error_log_str((const char *)&error_log[0]); throw std::runtime_error("Couldn't compile " + file_path + " : " + error_log_str); } } -void GlslProgram::compileShaders(const std::string& vertex_shader_path, - const std::string& fragment_shader_path) { +void GlslProgram::compileShaders(const std::string &vertex_shader_path, + const std::string &fragment_shader_path) +{ // create the program that will be run on GPU program_id_ = glCreateProgram(); // create vertex shader vertex_shader_id_ = glCreateShader(GL_VERTEX_SHADER); - if (vertex_shader_id_ == 0) + if (vertex_shader_id_ == 0) { throw std::runtime_error("Vertex shader failed to be created"); + } // create fragment shader fragment_shader_id_ = glCreateShader(GL_FRAGMENT_SHADER); - if (fragment_shader_id_ == 0) + if (fragment_shader_id_ == 0) { throw std::runtime_error("Fragment shader failed to be created"); + } // compile the two shaders compileShader(vertex_shader_id_, vertex_shader_path); compileShader(fragment_shader_id_, fragment_shader_path); } -void GlslProgram::linkShaders() { +void GlslProgram::linkShaders() +{ // attach the shaders that we want glAttachShader(program_id_, vertex_shader_id_); glAttachShader(program_id_, fragment_shader_id_); @@ -89,7 +105,7 @@ void GlslProgram::linkShaders() { glLinkProgram(program_id_); GLint is_linked = 0; - glGetProgramiv(program_id_, GL_LINK_STATUS, (int*)&is_linked); + glGetProgramiv(program_id_, GL_LINK_STATUS, (int *)&is_linked); if (is_linked == GL_FALSE) { GLint max_length = 0; glGetProgramiv(program_id_, GL_INFO_LOG_LENGTH, &max_length); @@ -98,7 +114,7 @@ void GlslProgram::linkShaders() { glGetProgramInfoLog(program_id_, max_length, &max_length, &error_log[0]); - std::string error_log_str((const char*)&error_log[0]); + std::string error_log_str((const char *)&error_log[0]); throw std::runtime_error("Could not link program : " + error_log_str); } @@ -112,26 +128,35 @@ void GlslProgram::linkShaders() { glDeleteShader(vertex_shader_id_); } -void GlslProgram::addAttribute(const std::string& attribute_name) { +void GlslProgram::addAttribute(const std::string &attribute_name) +{ glBindAttribLocation(program_id_, attribute_index_++, attribute_name.c_str()); } -GLint GlslProgram::getUniformLocation(const std::string& uniform_name) { +GLint GlslProgram::getUniformLocation(const std::string &uniform_name) +{ GLint location = glGetUniformLocation(program_id_, uniform_name.c_str()); - if ((GLuint)location == GL_INVALID_INDEX) + if ((GLuint)location == GL_INVALID_INDEX) { throw std::runtime_error("'" + uniform_name + "' not found"); + } return location; } -void GlslProgram::use() { +void GlslProgram::use() +{ glUseProgram(program_id_); - for (int i = 0; i < attribute_index_; ++i) glEnableVertexAttribArray(i); + for (int i = 0; i < attribute_index_; ++i) { + glEnableVertexAttribArray(i); + } } -void GlslProgram::unuse() { - for (int i = 0; i < attribute_index_; ++i) glDisableVertexAttribArray(i); +void GlslProgram::unuse() +{ + for (int i = 0; i < attribute_index_; ++i) { + glDisableVertexAttribArray(i); + } glUseProgram(0); } -} // yage +} // yage |