Implemented ShaderProgramBuilder

This commit is contained in:
2025-07-27 16:13:48 -04:00
parent 94c9216225
commit 370196ef7a
6 changed files with 135 additions and 35 deletions

View 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;
}