#pragma once
|
|
#include <string>
|
|
#include <fstream>
|
|
#include <sstream>
|
|
#include <iostream>
|
|
#include <glm.hpp>
|
|
#include "opengl.h"
|
|
|
|
class Shader {
|
|
private:
|
|
// Members
|
|
GLuint m_programID;
|
|
|
|
// Checks if compilation or linking failed and if so, print the error logs
|
|
int checkCompileErrors(GLuint object, std::string type);
|
|
public:
|
|
Shader()
|
|
{
|
|
m_programID = 0;
|
|
}
|
|
|
|
~Shader()
|
|
{
|
|
if (0 != m_programID)
|
|
glDeleteShader(m_programID);
|
|
}
|
|
|
|
// Inits with two file paths
|
|
// TODO: Remove this once a resource manager is done
|
|
int initShader(const std::string vertexPath, const std::string fragmentPath, const std::string geometryPath = std::string());
|
|
|
|
// Compiles the shader from given source code
|
|
// Note: geometry source code is optional
|
|
int compile(const char *vertexSource, const char *fragmentSource, const char *geometrySource = nullptr);
|
|
|
|
// Return the program ID
|
|
inline GLuint ID()
|
|
{
|
|
return m_programID;
|
|
}
|
|
|
|
// sets the current shader as active
|
|
inline void use()
|
|
{
|
|
glUseProgram(this->ID());
|
|
}
|
|
|
|
// Utility functions
|
|
/*inline void setFloat(const GLchar *name, GLfloat value)
|
|
{
|
|
glUniform1f(glGetUniformLocation(this->ID(), name), value);
|
|
}
|
|
|
|
inline void setInt(const GLchar *name, GLint value)
|
|
{
|
|
glUniform1i(glGetUniformLocation(this->ID(), name), value);
|
|
}
|
|
|
|
inline void setVector2f(const GLchar *name, GLfloat x, GLfloat y)
|
|
{
|
|
glUniform2f(glGetUniformLocation(this->ID(), name), x, y);
|
|
}
|
|
|
|
inline void setVector2f(const GLchar *name, const glm::vec2 &value)
|
|
{
|
|
glUniform2f(glGetUniformLocation(this->ID(), name), value.x, value.y);
|
|
}
|
|
|
|
inline void setVector3f(const GLchar *name, GLfloat x, GLfloat y, GLfloat z)
|
|
{
|
|
glUniform3f(glGetUniformLocation(this->ID(), name), x, y, z);
|
|
}
|
|
|
|
inline void setVector3f(const GLchar *name, const glm::vec3 &value)
|
|
{
|
|
glUniform3f(glGetUniformLocation(this->ID(), name), value.x, value.y, value.z);
|
|
}
|
|
|
|
inline void setVector4f(const GLchar *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
|
|
{
|
|
glUniform4f(glGetUniformLocation(this->ID(), name), x, y, z, w);
|
|
}
|
|
|
|
inline void setVector4f(const GLchar *name, const glm::vec4 &value)
|
|
{
|
|
glUniform4f(glGetUniformLocation(this->ID(), name), value.x, value.y, value.z, value.w);
|
|
}
|
|
|
|
inline void setMatrix4(const GLchar *name, const glm::mat4 &matrix)
|
|
{
|
|
glUniformMatrix4fv(glGetUniformLocation(this->ID(), name), 1, GL_FALSE, glm::value_ptr(matrix));
|
|
}*/
|
|
};
|