X-Git-Url: http://git.mutantstargoat.com?a=blobdiff_plain;f=src%2Fopengl%2Fshader-gl.cc;h=296a67cdca828ede662299757c5a0bc5be37ad4f;hb=05d269a194496bcef85da78652b947f5bf1c9bcf;hp=c5b57a7954a30cce9e80ad6f91c9608a92f476be;hpb=826b0cf7adaf8b1dc4c37f57a4a98c79a3995e21;p=demo diff --git a/src/opengl/shader-gl.cc b/src/opengl/shader-gl.cc index c5b57a7..296a67c 100644 --- a/src/opengl/shader-gl.cc +++ b/src/opengl/shader-gl.cc @@ -29,6 +29,7 @@ bool ShaderGL::create(char *buf, unsigned int bsz, const char *fname) fprintf(stderr, "Unknown shader type.\n"); return false; } + name = std::string(fname); sdr = glCreateShader(stype); /* compile */ @@ -73,17 +74,14 @@ void ShaderGL::destroy() type = SDR_UNKNOWN; } -void ShaderGL::attach(unsigned int prog) -{ - glAttachShader(prog, sdr); -} - /* Shader Program */ ShaderProgramGL::ShaderProgramGL() { prog = 0; memset(shaders, 0, sizeof shaders / sizeof *shaders); + + is_linked = false; } ShaderProgramGL::~ShaderProgramGL() @@ -91,29 +89,29 @@ ShaderProgramGL::~ShaderProgramGL() destroy(); } -void ShaderProgramGL::destroy() +bool ShaderProgramGL::create() { - glDeleteProgram(prog); - prog = 0; - - delete_shaders(); -} - -void ShaderProgramGL::delete_shaders() -{ - for(unsigned int i=0; i<(sizeof shaders) / (sizeof *shaders); ++i) { - delete shaders[i]; + prog = glCreateProgram(); + if(!prog) { + fprintf(stderr, "Failed to create shader program.\n"); + return false; } + return true; } bool ShaderProgramGL::link() { + if(is_linked) + return true; + glLinkProgram(prog); int status; glGetProgramiv(prog, GL_LINK_STATUS, &status); - if(status) + if(status) { printf("Successfully linked shader program.\n"); + is_linked = true; + } else printf("Failed to link shader program.\n"); @@ -131,44 +129,29 @@ bool ShaderProgramGL::link() return status ? true : false; } -bool ShaderProgramGL::load(const char *vfname, const char *ffname) +bool ShaderProgramGL::use() const { - Shader *vsdr = new ShaderGL; - if(!vsdr->load(vfname, SDR_VERTEX)) { - delete vsdr; + if(!is_linked) { return false; } - Shader *fsdr = new ShaderGL; - if(!fsdr->load(ffname, SDR_FRAGMENT)) { - delete vsdr; - delete fsdr; + if(!prog) { return false; } - prog = glCreateProgram(); - - vsdr->attach(prog); - fsdr->attach(prog); - - if(!link()) { - delete vsdr; - delete fsdr; - glDeleteProgram(prog); - return false; - } - - /* the order of shaders in the array is the order they have in - enum Type, so atm it goes like: VS, FS, ... because we have SDR_VERTEX, - SDR_FRAGMENT, ... */ - - shaders[0] = vsdr; - shaders[1] = fsdr; - + glUseProgram(prog); return true; } -void ShaderProgramGL::use() +void ShaderProgramGL::destroy() { - glUseProgram(prog); -} \ No newline at end of file + glDeleteProgram(prog); + prog = 0; + is_linked = false; +} + +void ShaderProgramGL::attach_shader(Shader *shader) +{ + glAttachShader(prog, ((ShaderGL *)shader)->sdr); + is_linked = false; +}