From 60a1dfb7819f9134754c503d0672ec21bdadd8ea Mon Sep 17 00:00:00 2001 From: Anselme Date: Wed, 7 Dec 2016 16:15:25 +0100 Subject: [PATCH] small fixes in shaders and small change in camera calls parameters --- src/shader.cpp | 104 ++++++++++++++++++++++++---------------- src/shader.h | 8 +++- src/trackballcamera.cpp | 6 +-- src/trackballcamera.h | 4 +- 4 files changed, 74 insertions(+), 48 deletions(-) diff --git a/src/shader.cpp b/src/shader.cpp index 343a9c4..220eb64 100644 --- a/src/shader.cpp +++ b/src/shader.cpp @@ -5,67 +5,77 @@ Shader::Shader(const std::string &vertexSource, const std::string &fragmentSource) { - program = glCreateProgram(); + m_lastShaderError = NULL; + m_lastProgramError = NULL; + + m_program = glCreateProgram(); GLuint vertexShaderId = createShader(vertexSource, GL_VERTEX_SHADER); GLuint fragmentShaderId = createShader(fragmentSource, GL_FRAGMENT_SHADER); - glAttachShader(program, vertexShaderId); - glAttachShader(program, fragmentShaderId); + glAttachShader(m_program, vertexShaderId); + glAttachShader(m_program, fragmentShaderId); - glBindAttribLocation(program, 0, "inPosition"); - glBindAttribLocation(program, 1, "inNormal"); - glBindAttribLocation(program, 2, "inTexCoord"); - glBindAttribLocation(program, 3, "inTangent"); - glBindAttribLocation(program, 4, "inBinormal"); + glBindAttribLocation(m_program, 0, "inPosition"); + glBindAttribLocation(m_program, 1, "inNormal"); + glBindAttribLocation(m_program, 2, "inTexCoord"); + glBindAttribLocation(m_program, 3, "inTangent"); + glBindAttribLocation(m_program, 4, "inBinormal"); - glLinkProgram(program); + glLinkProgram(m_program); // check errors GLint linked; - glGetProgramiv(program, GL_LINK_STATUS, &linked); + glGetProgramiv(m_program, GL_LINK_STATUS, &linked); if (!linked) { +#ifdef RENDER_DEBUG std::cerr << "Program not linked" << std::endl; - printProgramInfoLog(program); - program = 0; +#endif + printProgramInfoLog(m_program); + m_program = 0; } - glDetachShader(program, vertexShaderId); - glDetachShader(program, fragmentShaderId); + glDetachShader(m_program, vertexShaderId); + glDetachShader(m_program, fragmentShaderId); glDeleteShader(vertexShaderId); glDeleteShader(fragmentShaderId); } Shader::Shader(const std::string &vertexSource, const std::string &geometrySource, const std::string &fragmentSource) { - program = glCreateProgram(); + m_lastShaderError = NULL; + m_lastProgramError = NULL; + + m_program = glCreateProgram(); GLuint vertexShaderId = createShader(vertexSource, GL_VERTEX_SHADER); GLuint geometryShaderId = createShader(geometrySource, GL_GEOMETRY_SHADER); GLuint fragmentShaderId = createShader(fragmentSource, GL_FRAGMENT_SHADER); - glAttachShader(program, vertexShaderId); - glAttachShader(program, geometryShaderId); - glAttachShader(program, fragmentShaderId); + glAttachShader(m_program, vertexShaderId); + glAttachShader(m_program, geometryShaderId); + glAttachShader(m_program, fragmentShaderId); - glBindAttribLocation(program, 0, "inPosition"); - glBindAttribLocation(program, 1, "inNormal"); - glBindAttribLocation(program, 2, "inTexCoord"); + glBindAttribLocation(m_program, 0, "inPosition"); + glBindAttribLocation(m_program, 1, "inNormal"); + glBindAttribLocation(m_program, 2, "inTexCoord"); - glLinkProgram(program); + glLinkProgram(m_program); // check errors GLint linked; - glGetProgramiv(program, GL_LINK_STATUS, &linked); + glGetProgramiv(m_program, GL_LINK_STATUS, &linked); if (!linked) { +#ifdef RENDER_DEBUG std::cerr << "Program not linked" << std::endl; - printProgramInfoLog(program); - program = 0; +#endif + printProgramInfoLog(m_program); + m_program = 0; } - glDetachShader(program, vertexShaderId); - glDetachShader(program, geometryShaderId); - glDetachShader(program, fragmentShaderId); + glDetachShader(m_program, vertexShaderId); + glDetachShader(m_program, geometryShaderId); + glDetachShader(m_program, fragmentShaderId); glDeleteShader(vertexShaderId); glDeleteShader(geometryShaderId); glDeleteShader(fragmentShaderId); @@ -74,9 +84,13 @@ Shader::Shader(const std::string &vertexSource, const std::string &geometrySourc Shader::~Shader() { bool ok; - ok = glIsProgram(program); + ok = glIsProgram(m_program); if(ok) - glDeleteProgram(program); + glDeleteProgram(m_program); + if(m_lastShaderError != NULL) + delete [] m_lastShaderError; + if(m_lastProgramError != NULL) + delete [] m_lastProgramError; } GLuint Shader::createShader(const std::string &source, GLenum shaderType) @@ -91,6 +105,7 @@ GLuint Shader::createShader(const std::string &source, GLenum shaderType) GLint compiled; glGetShaderiv(shaderId, GL_COMPILE_STATUS, &compiled); if (!compiled) { +#ifdef RENDER_DEBUG std::string type_str; switch(shaderType) { @@ -106,6 +121,7 @@ GLuint Shader::createShader(const std::string &source, GLenum shaderType) } std::cerr << type_str << " shader not compiled : " << std::endl; std::cout << "Shader source :" << std::endl << source << std::endl; +#endif printShaderInfoLog(shaderId); return 0; } @@ -117,13 +133,15 @@ void Shader::printShaderInfoLog(GLuint shaderId) { int infoLogLen = 0; int charsWritten = 0; - GLchar *infoLog; glGetShaderiv(shaderId, GL_INFO_LOG_LENGTH, &infoLogLen); if (infoLogLen > 0) { - infoLog = new GLchar[infoLogLen]; - glGetShaderInfoLog(shaderId, infoLogLen, &charsWritten, infoLog); - std::cerr << "InfoLog:" << std::endl << infoLog << std::endl; - delete [] infoLog; + if(m_lastShaderError != NULL) + delete [] m_lastShaderError; + m_lastShaderError = new GLchar[infoLogLen]; + glGetShaderInfoLog(shaderId, infoLogLen, &charsWritten, m_lastShaderError); +#ifdef RENDER_DEBUG + std::cerr << "InfoLog:" << std::endl << m_lastShaderError << std::endl; +#endif } } @@ -131,25 +149,27 @@ void Shader::printProgramInfoLog(GLuint programId) { int infoLogLen = 0; int charsWritten = 0; - GLchar *infoLog; glGetProgramiv(programId, GL_INFO_LOG_LENGTH, &infoLogLen); if (infoLogLen > 0) { - infoLog = new GLchar[infoLogLen]; - glGetProgramInfoLog(programId, infoLogLen, &charsWritten, infoLog); - std::cerr << "InfoLog:" << std::endl << infoLog << std::endl; - delete [] infoLog; + if(m_lastProgramError != NULL) + delete [] m_lastProgramError; + m_lastProgramError = new GLchar[infoLogLen]; + glGetProgramInfoLog(programId, infoLogLen, &charsWritten, m_lastProgramError); +#ifdef RENDER_DEBUG + std::cerr << "InfoLog:" << std::endl << m_lastProgramError << std::endl; +#endif } } GLuint Shader::getLocation(std::string attribName) { - GLuint loc = glGetUniformLocation(program, attribName.c_str()); + GLuint loc = glGetUniformLocation(m_program, attribName.c_str()); return loc; } void Shader::bind() { - glUseProgram(program); + glUseProgram(m_program); } void Shader::unbind() diff --git a/src/shader.h b/src/shader.h index 47055cf..eb60d23 100644 --- a/src/shader.h +++ b/src/shader.h @@ -7,17 +7,23 @@ class Shader { - GLuint program; +protected: + GLuint m_program; GLuint createShader(const std::string &source, GLenum shaderType); void printShaderInfoLog(GLuint shaderId); void printProgramInfoLog(GLuint programId); + GLchar* m_lastShaderError; + GLchar* m_lastProgramError; public: Shader(const std::string &vertexSource, const std::string &fragmentSource); Shader(const std::string &vertexSource, const std::string &geometrySource, const std::string &fragmentSource); ~Shader(); GLuint getLocation(std::string attribName); + const char* getLastShaderError() { return m_lastShaderError; } + const char* getLastProgramError() { return m_lastProgramError; } + bool isValid() {return m_program != 0;} void bind(); void unbind(); void bindFloat(GLuint location, float val); diff --git a/src/trackballcamera.cpp b/src/trackballcamera.cpp index 0f054dd..58bffea 100644 --- a/src/trackballcamera.cpp +++ b/src/trackballcamera.cpp @@ -62,11 +62,11 @@ void TrackBallCamera::computeView() m_view = glm::lookAt(m_center - m_direction*m_dist, m_center, glm::vec3(0, 1, 0)); } -void TrackBallCamera::zoom(int nbUnits) +void TrackBallCamera::zoom(float nbUnits) { - while(nbUnits != 0) + while(nbUnits != 0.f) { - if(nbUnits > 0) + if(nbUnits > 0.f) { m_dist *= DEFAULT_SCROLL_SPEED; --nbUnits; diff --git a/src/trackballcamera.h b/src/trackballcamera.h index 10412f4..e172d7b 100644 --- a/src/trackballcamera.h +++ b/src/trackballcamera.h @@ -21,8 +21,8 @@ public: void rotateCamera(float dx, float dy); void moveCamera(float dx, float dy); void moveCamera(const glm::vec3 &diff); - void lookAt(const glm::vec3 &pos); - void zoom(int nbScrolls); + void lookAt(const glm::vec3 &pos); + void zoom(float nbScrolls); void reset(); glm::vec3 getDefaultPxInfo(); };