Implemented ShaderProgramBuilder
This commit is contained in:
73
source/shader/src/ShaderProgramBuilder.cpp
Normal file
73
source/shader/src/ShaderProgramBuilder.cpp
Normal file
@@ -0,0 +1,73 @@
|
||||
#include "ShaderProgramBuilder.hpp"
|
||||
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <utility>
|
||||
|
||||
|
||||
ugly::ShaderProgramBuilder::ShaderProgramBuilder():
|
||||
mProgram{glCreateProgram()} {
|
||||
}
|
||||
|
||||
|
||||
ugly::ShaderProgramBuilder::~ShaderProgramBuilder() {
|
||||
if(mProgram != 0) {
|
||||
glDeleteProgram(mProgram);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void ugly::ShaderProgramBuilder::reset() {
|
||||
using namespace std;
|
||||
swap(*this, ShaderProgramBuilder{});
|
||||
}
|
||||
|
||||
|
||||
ugly::ShaderProgramBuilder &ugly::ShaderProgramBuilder::attachFromMemory(GLenum type, const GLchar *string, GLint length) {
|
||||
auto shader = glCreateShader(type);
|
||||
glShaderSource(shader, 1, &string, length != 0 ? &length : NULL);
|
||||
glCompileShader(shader);
|
||||
|
||||
GLint status;
|
||||
glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
|
||||
if(status != GL_TRUE) {
|
||||
char buf[512];
|
||||
glGetShaderInfoLog(shader, 512, NULL, buf);
|
||||
glDeleteShader(shader);
|
||||
std::cerr << "Failed to compile shader:\n\t" << buf << '\n';
|
||||
throw Error{"shader failed to compile"};
|
||||
}
|
||||
|
||||
glAttachShader(mProgram, shader);
|
||||
glDeleteShader(shader);
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
ugly::ShaderProgramBuilder &ugly::ShaderProgramBuilder::attachFromFile(GLenum type, const char *filename) {
|
||||
auto file = std::ifstream{filename};
|
||||
file.exceptions(std::ios_base::badbit);
|
||||
std::ostringstream ss;
|
||||
ss << file.rdbuf();
|
||||
return attachFromMemory(type, ss.str().c_str());
|
||||
}
|
||||
|
||||
|
||||
GLuint ugly::ShaderProgramBuilder::link() {
|
||||
glLinkProgram(mProgram);
|
||||
|
||||
GLint status;
|
||||
glGetProgramiv(mProgram, GL_LINK_STATUS, &status);
|
||||
if(status != GL_TRUE) {
|
||||
char buf[512];
|
||||
glGetProgramInfoLog(mProgram, 512, NULL, buf);
|
||||
std::cerr << "Failed to link program:\n\t" << buf << '\n';
|
||||
throw Error{"program failed to link"};
|
||||
}
|
||||
|
||||
auto result = mProgram;
|
||||
mProgram = 0;
|
||||
reset();
|
||||
return result;
|
||||
}
|
||||
Reference in New Issue
Block a user