opengl-playground/src/openglshader.cpp

139 lines
3.0 KiB
C++

#include <opengl-playground/openglshader.hpp>
OpenGlShaderProgram::OpenGlShaderProgram(std::string vertex_file, std::string geometry_file, std::string fragment_file)
{
this->vertex_file = vertex_file;
this->geometry_file = geometry_file;
this->fragment_file = fragment_file;
this->compiled = false;
}
char *load_shader_program_from_file(std::string file_name)
{
return NULL;
}
int OpenGlShaderProgram::compile()
{
int ret_code = 0;
int success;
char info_log[512];
unsigned int vertex_shader, geometry_shader, fragment_shader;
bool vertex_b = false, geo_b = false, frag_b = false;
char *src_code;
if (this->compiled) {
glDeleteProgram(shader_program);
this->compiled = false;
}
this->shader_program = glCreateProgram();
if (!vertex_file.empty()) {
vertex_b = true;
/* Compile the vertex shader */
vertex_shader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertex_shader, 1, &src_code, NULL);
glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &success);
free(src_code);
if (!success) {
glGetShaderInfoLog(vertex_shader, 512, NULL, info_log);
fprintf(stderr, "%s\n", info_log);
ret_code = -1;
goto delete_vertex;
}
glAttachShader(this->shader_program, vertex_shader);
}
if (!this->geometry_file.empty()) {
geo_b = true;
/* Compile the vertex shader */
geometry_shader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(geometry_shader, 1, &src_code, NULL);
glGetShaderiv(geometry_shader, GL_COMPILE_STATUS, &success);
free(src_code);
if (!success) {
glGetShaderInfoLog(geometry_shader, 512, NULL, info_log);
fprintf(stderr, "%s\n", info_log);
ret_code = -1;
goto delete_geo;
}
glAttachShader(this->shader_program, geometry_shader);
}
if (!this->fragment_file.empty()) {
frag_b = true;
/* Compile the vertex shader */
fragment_shader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(fragment_shader, 1, &src_code, NULL);
glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &success);
free(src_code);
if (!success) {
glGetShaderInfoLog(fragment_shader, 512, NULL, info_log);
fprintf(stderr, "%s\n", info_log);
ret_code = -1;
goto delete_frag;
}
glAttachShader(this->shader_program, fragment_shader);
}
glLinkProgram(this->shader_program);
glGetShaderiv(this->shader_program, GL_LINK_STATUS, &success);
if (!success) {
glGetShaderInfoLog(this->shader_program, 512, NULL, info_log);
printf("%s\n", info_log);
ret_code = -2;
}
this->compiled = true;
delete_frag:
if (frag_b)
glDeleteShader(fragment_shader);
delete_geo:
if (geo_b)
glDeleteShader(geometry_shader);
delete_vertex:
if (vertex_b)
glDeleteShader(vertex_shader);
if (ret_code) {
this->compiled = false;
glDeleteProgram(this->shader_program);
this->shader_program = 0;
}
return ret_code;
}
void OpenGlShaderProgram::unload()
{
if (this->compiled) {
glDeleteProgram(this->shader_program);
}
this->compiled = false;
}
int OpenGlShaderProgram::use()
{
if (!this->compiled)
return -1;
glUseProgram(this->shader_program);
return 0;
}