Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "ShaderProgram.h"
- #include <string>
- #include "OpenGL.h"
- ShaderProgram::ShaderProgram() {
- program = glCreateProgram();
- }
- void ShaderProgram::attachShader(const char* fileName, uint type) {
- std::fstream file(fileName);
- std::string fileContents = "";
- //Loading file into string
- if (file.is_open()) {
- std::string line;
- while (std::getline(file, line)) {
- fileContents += line + '\n';
- }
- file.close();
- } else {
- PRINT_ERROR << "Could not load " << fileName << "!\n";
- return;
- }
- const GLchar* text = fileContents.c_str();
- GLint length = fileContents.length();
- GLuint shader = glCreateShader(type);
- glShaderSource(shader, 1, &text, &length);
- glCompileShader(shader);
- GLint isCompiled = 0;
- glGetShaderiv(shader, GL_COMPILE_STATUS, &isCompiled);
- if(isCompiled == GL_FALSE) {
- GLint maxLength = 0;
- glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &maxLength);
- char* errorLog = new char[maxLength];
- glGetShaderInfoLog(shader, maxLength, &maxLength, &errorLog[0]);
- PRINT_ERROR << "Shader failed to compile with message:\n" << errorLog << '\n';
- delete errorLog;
- glDeleteShader(shader);
- return;
- }
- glAttachShader(program, shader);
- glBindAttribLocation(program, 0, "position");
- glLinkProgram(program);
- GLint isLinked = 0;
- glGetProgramiv(program, GL_LINK_STATUS, (int *)&isLinked);
- if(isLinked == GL_FALSE) {
- GLint maxLength = 0;
- glGetProgramiv(program, GL_INFO_LOG_LENGTH, &maxLength);
- char* infoLog = new char[maxLength];
- glGetProgramInfoLog(program, maxLength, &maxLength, &infoLog[0]);
- PRINT_ERROR << "Program failed to link with message:\n" << infoLog << '\n';
- delete infoLog;
- glDeleteShader(shader);
- return;
- }
- shaders.push_back(shader);
- }
- void ShaderProgram::use() const {
- glUseProgram(program);
- }
- int ShaderProgram::getLocation(const char* name) {
- const auto loc = uniforms.find(name);
- int location;
- if (loc == uniforms.end()) {
- location = glGetUniformLocation(program, name);
- uniforms[name] = location;
- } else
- location = loc->second;
- return location;
- }
- void ShaderProgram::setUniform(const char* name, int value) {
- glUniform1i(getLocation(name), value);
- }
- void ShaderProgram::setUniform(const char* name, float value) {
- glUniform1f(getLocation(name), value);
- }
- void ShaderProgram::setUniform(const char* name, const glm::vec2& value) {
- glUniform2f(getLocation(name), value.x, value.y);
- }
- void ShaderProgram::setUniform(const char* name, const glm::vec3& value) {
- glUniform3f(getLocation(name), value.x, value.y, value.z);
- }
- void ShaderProgram::setUniform(const char* name, const glm::vec4& value) {
- glUniform4f(getLocation(name), value.x, value.y, value.z, value.w);
- }
- void ShaderProgram::setUniform(const char* name, const glm::mat2& value) {
- glUniformMatrix2fv(getLocation(name), 1, GL_FALSE, &value[0][0]);
- }
- void ShaderProgram::setUniform(const char* name, const glm::mat3& value) {
- glUniformMatrix3fv(getLocation(name), 1, GL_FALSE, &value[0][0]);
- }
- void ShaderProgram::setUniform(const char* name, const glm::mat4& value) {
- glUniformMatrix4fv(getLocation(name), 1, GL_FALSE, &value[0][0]);
- }
- ShaderProgram::~ShaderProgram() {
- for (uint shader : shaders)
- glDeleteShader(shader);
- glDeleteProgram(program);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement