|
@@ -4,13 +4,22 @@
|
|
|
#include "wrapper/GL.h"
|
|
|
#include "wrapper/Shader.h"
|
|
|
|
|
|
-Shader::Shader(const char* vertexPath, const char* fragmentPath) : vertexShader(0), fragmentShader(0), program(0) {
|
|
|
+Shader::Shader(const char* vertexPath, const char* fragmentPath,
|
|
|
+ const char* geometryPath)
|
|
|
+ : vertexShader(0), geometryShader(0), fragmentShader(0), program(0) {
|
|
|
if(readFileAndCompile(vertexPath, vertexShader, GL_VERTEX_SHADER) ||
|
|
|
readFileAndCompile(fragmentPath, fragmentShader, GL_FRAGMENT_SHADER)) {
|
|
|
return;
|
|
|
}
|
|
|
+ if(geometryPath != nullptr &&
|
|
|
+ readFileAndCompile(geometryPath, geometryShader, GL_GEOMETRY_SHADER)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
program = glCreateProgram();
|
|
|
glAttachShader(program, vertexShader);
|
|
|
+ if(geometryPath != nullptr) {
|
|
|
+ glAttachShader(program, geometryShader);
|
|
|
+ }
|
|
|
glAttachShader(program, fragmentShader);
|
|
|
glLinkProgram(program);
|
|
|
if(GL::checkAndPrintError("cannot link")) {
|
|
@@ -22,17 +31,25 @@ Shader::Shader(const char* vertexPath, const char* fragmentPath) : vertexShader(
|
|
|
ErrorLog log;
|
|
|
glGetProgramInfoLog(program, log.getLength(), nullptr, log.begin());
|
|
|
std::cout << "linker log: " << log.begin() << "\n";
|
|
|
+ clean();
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
Shader::~Shader() {
|
|
|
+ clean();
|
|
|
+}
|
|
|
+
|
|
|
+void Shader::clean() {
|
|
|
glDeleteShader(vertexShader);
|
|
|
+ glDeleteShader(geometryShader);
|
|
|
glDeleteShader(fragmentShader);
|
|
|
glDeleteProgram(program);
|
|
|
+ program = 0;
|
|
|
}
|
|
|
|
|
|
-bool Shader::readFileAndCompile(const char* path, GLuint& shader, GLenum shaderType) {
|
|
|
+bool Shader::readFileAndCompile(const char* path, GLuint& shader,
|
|
|
+ GLenum shaderType) {
|
|
|
std::cout << "shader: " << path << '\n';
|
|
|
Code code;
|
|
|
if(readFile(code, path)) {
|