fprintf(stderr, "Unknown shader type.\n");
return false;
}
+ name = std::string(fname);
sdr = glCreateShader(stype);
/* compile */
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()
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");
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, ... */
+ glUseProgram(prog);
+ return true;
+}
- shaders[0] = vsdr;
- shaders[1] = fsdr;
+void ShaderProgramGL::destroy()
+{
+ glDeleteProgram(prog);
+ prog = 0;
+ is_linked = false;
+}
- return true;
-}
\ No newline at end of file
+void ShaderProgramGL::attach_shader(Shader *shader)
+{
+ glAttachShader(prog, ((ShaderGL *)shader)->sdr);
+ is_linked = false;
+}