Changed the OpenGL part and the GLSL shaders to use UBO and
[demo] / src / opengl / shader-gl.cc
index 334a1cf..296a67c 100644 (file)
@@ -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,39 +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, ... */
+       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;
+}