diff --git a/src/AbstractShaderProgram.cpp b/src/AbstractShaderProgram.cpp index 0bfab23e7..f696eb0e4 100644 --- a/src/AbstractShaderProgram.cpp +++ b/src/AbstractShaderProgram.cpp @@ -15,17 +15,15 @@ #include "AbstractShaderProgram.h" -#include #include #define LINKER_MESSAGE_MAX_LENGTH 1024 using namespace std; +using namespace Corrade::Utility; namespace Magnum { -AbstractShaderProgram::LogLevel AbstractShaderProgram::_logLevel = AbstractShaderProgram::Errors; - AbstractShaderProgram::AbstractShaderProgram(): state(Initialized) { program = glCreateProgram(); } @@ -52,6 +50,11 @@ bool AbstractShaderProgram::attachShader(Shader* shader) { } bool AbstractShaderProgram::bindAttribute(GLuint location, const string& name) { + if(state != Initialized) { + Error() << "AbstractShaderProgram: attribute cannot be bound after linking."; + return false; + } + /* Check whether given id already exists */ if(attributes.find(location) != attributes.end()) return false; @@ -82,21 +85,18 @@ void AbstractShaderProgram::link() { glGetProgramiv(program, GL_LINK_STATUS, &status); /* Display errors or warnings */ - if((status == GL_FALSE && _logLevel != None) || _logLevel == Warnings) { - /* Get message */ - char message[LINKER_MESSAGE_MAX_LENGTH]; - glGetProgramInfoLog(program, LINKER_MESSAGE_MAX_LENGTH, 0, message); - - /* Show error log and delete shader */ - if(status == GL_FALSE) { - cerr << "Shader program failed to link. Error message:" << endl - << message << endl; - - /* Or just warnings, if there are any */ - } else if(message[0] != 0) { - cerr << "Shader program was linked with the following warnings:" << endl - << message << endl; - } + char message[LINKER_MESSAGE_MAX_LENGTH]; + glGetProgramInfoLog(program, LINKER_MESSAGE_MAX_LENGTH, 0, message); + + /* Show error log and delete shader */ + if(status == GL_FALSE) { + Error() << "AbstractShaderProgram: linking failed with the following message:\n" + << message; + + /* Or just warnings, if there are any */ + } else if(message[0] != 0) { + Debug() << "AbstractShaderProgram: linking succeeded with the following message:\n" + << message; } if(status == GL_FALSE) { @@ -107,8 +107,15 @@ void AbstractShaderProgram::link() { } GLint AbstractShaderProgram::uniformLocation(const std::string& name) { - if(state != Linked) return -1; - return glGetUniformLocation(program, name.c_str()); + if(state != Linked) { + Error() << "AbstractShaderProgram: uniform location cannot be retrieved before linking."; + return -1; + } + + GLint location = glGetUniformLocation(program, name.c_str()); + if(location == -1) + Error() << "AbstractShaderProgram: location of uniform \'" + name + "\' cannot be retrieved!"; + return location; } } diff --git a/src/AbstractShaderProgram.h b/src/AbstractShaderProgram.h index f219609fa..d15e03c03 100644 --- a/src/AbstractShaderProgram.h +++ b/src/AbstractShaderProgram.h @@ -84,23 +84,6 @@ class MAGNUM_EXPORT AbstractShaderProgram { AbstractShaderProgram& operator=(AbstractShaderProgram&& other) = delete; public: - /** @brief Logging level */ - enum LogLevel { - None, /**< @brief Don't display anything */ - Errors, /**< @brief Display only errors */ - Warnings /**< @brief Display only errors and warnings */ - }; - - /** - * @brief Log level - * - * Log level for displaying compilation messages. Default is Errors. - */ - inline static LogLevel logLevel() { return _logLevel; } - - /** @brief Set log level */ - inline static void setLogLevel(LogLevel level) { _logLevel = level; } - /** @brief Default constructor */ AbstractShaderProgram(); @@ -213,8 +196,6 @@ class MAGNUM_EXPORT AbstractShaderProgram { Failed }; - static LogLevel _logLevel; - GLuint program; State state; std::map attributes; diff --git a/src/Shader.cpp b/src/Shader.cpp index 45bd895f3..ae6fa38fd 100644 --- a/src/Shader.cpp +++ b/src/Shader.cpp @@ -15,25 +15,22 @@ #include "Shader.h" -#include #include #define COMPILER_MESSAGE_MAX_LENGTH 1024 using namespace std; +using namespace Corrade::Utility; namespace Magnum { -Shader::LogLevel Shader::_logLevel = Shader::Errors; - bool Shader::addFile(const std::string& filename) { /* Open file */ ifstream file(filename.c_str()); if(!file.good()) { file.close(); - cerr << "Shader file " << filename << " cannot be opened." << endl; - + Error() << "Shader file " << '\'' + filename + '\'' << " cannot be opened."; return false; } @@ -77,26 +74,28 @@ GLuint Shader::compile() { glGetShaderiv(shader, GL_COMPILE_STATUS, &status); /* Display errors or warnings */ - if((status == GL_FALSE && _logLevel != None) || _logLevel == Warnings) { - /* Get message */ - char message[COMPILER_MESSAGE_MAX_LENGTH]; - glGetShaderInfoLog(shader, COMPILER_MESSAGE_MAX_LENGTH, 0, message); - - if(status == GL_FALSE || message[0] != 0) switch(_type) { - case Vertex: cerr << "Vertex"; break; - case Geometry: cerr << "Geometry"; break; - case Fragment: cerr << "Fragment"; break; + char message[COMPILER_MESSAGE_MAX_LENGTH]; + glGetShaderInfoLog(shader, COMPILER_MESSAGE_MAX_LENGTH, 0, message); + + if(status == GL_FALSE || message[0] != 0) { + Error err; + err << "Shader:"; + + switch(_type) { + case Vertex: err << "vertex"; break; + case Geometry: err << "geometry"; break; + case Fragment: err << "fragment"; break; } /* Show error log and delete shader */ if(status == GL_FALSE) { - cerr << " shader failed to compile. Error message:" << endl - << message << endl; + err << "shader failed to compile with the following message:\n" + << message; /* Or just warnings, if there are any */ } else if(message[0] != 0) { - cerr << " shader was compiled with the following warnings:" << endl - << message << endl; + err << "shader was successfully compiled with the following message:\n" + << message; } } diff --git a/src/Shader.h b/src/Shader.h index 8b16808ef..2225afe30 100644 --- a/src/Shader.h +++ b/src/Shader.h @@ -40,13 +40,6 @@ class MAGNUM_EXPORT Shader { Shader& operator=(Shader&& other) = delete; public: - /** @brief Logging level */ - enum LogLevel { - None, /**< @brief Don't display anything */ - Errors, /**< @brief Display only errors */ - Warnings /**< @brief Display only errors and warnings */ - }; - /** @brief Shader type */ enum Type { Vertex = GL_VERTEX_SHADER, /**< @brief Vertex shader */ @@ -61,16 +54,6 @@ class MAGNUM_EXPORT Shader { Failed /**< @brief Compilation failed */ }; - /** - * @brief Log level - * - * Log level for displaying compilation messages. - */ - inline static LogLevel logLevel() { return _logLevel; } - - /** @brief Set log level */ - inline static void setLogLevel(LogLevel level) { _logLevel = level; } - /** * @brief Load shader from source * @param type Shader type @@ -179,8 +162,6 @@ class MAGNUM_EXPORT Shader { GLuint compile(); private: - static LogLevel _logLevel; - Type _type; State _state;