Changed the OpenGL part and the GLSL shaders to use UBO and
[demo] / src / morph_renderer.cc
index d076114..a691835 100644 (file)
@@ -1,10 +1,15 @@
 #include "global.h"
+#include "gfxapi.h"
+
 #include "morph_renderer.h"
 #include "object.h"
 #include "scene.h"
 #include "shader.h"
 #include "shader_manager.h"
 #include "texture.h"
+#include "uniforms.h"
+
+#define MVU 5
 
 MorphRenderer::MorphRenderer()
 {
@@ -17,10 +22,13 @@ MorphRenderer::MorphRenderer()
        dskytex = 0;
 
        fog_density = 0;
+
+       mbuf = vbuf = fbuf = svbuf = 0;
 }
 
 MorphRenderer::~MorphRenderer()
 {
+       delete mbuf;
 }
 
 bool MorphRenderer::create()
@@ -29,28 +37,40 @@ bool MorphRenderer::create()
                return false;
        }
 
-       /* getting material uniform locations: diffuse, specular, specular exponent (strength) */
-
-       diff_loc = sprog->get_uniform_location("diffuse");
-       spec_loc = sprog->get_uniform_location("specular");
-       shin_loc = sprog->get_uniform_location("shininess");
-       t_loc = sprog->get_uniform_location("t");
-       fog_loc = sprog->get_uniform_location("fog_density");
+       mbuf = gfx_create_uniform_buffer();
+       if(!mbuf->create(sizeof mu)) {
+               fprintf(stderr, "Failed to create uniform buffer.\n");
+               return false;
+       }
 
-       /* uniform locations for matrices */
+       if(!vbuf) {
+               vbuf = gfx_create_uniform_buffer();
+               if(!vbuf->create(sizeof vu)) {
+                       fprintf(stderr, "Failed to create uniform buffer.\n");
+                       return false;
+               }
+       }
 
-       mmviewproj_loc = sprog->get_uniform_location("mmviewproj");
-       mview_loc = sprog->get_uniform_location("mview");
-       mmod_loc = sprog->get_uniform_location("mmod");
+       if(!fbuf) {
+               fbuf = gfx_create_uniform_buffer();
+               if(!fbuf->create(sizeof fu)) {
+                       fprintf(stderr, "Failed to create uniform buffer.\n");
+                       return false;
+               }
+       }
 
-       dstex_loc = sprog->get_uniform_location("dstex");
-       if(dstex_loc != -1)
-               sprog->set_uniformi(dstex_loc, 1);
+       if(!svbuf) {
+               svbuf = gfx_create_uniform_buffer();
+               if(!svbuf->create(sizeof svu)) {
+                       fprintf(stderr, "Failed to create uniform buffer.\n");
+                       return false;
+               }
+       }
 
        return true;
 }
 
-void MorphRenderer::draw() const
+void MorphRenderer::draw()
 {
        if(!camera || !scene)
                return;
@@ -65,13 +85,14 @@ void MorphRenderer::draw() const
        sprog->use();
 
        for(size_t i=0; i<scene->objects.size(); i++) {
-               float t = (sin(time_sec + 7.3 * noise(i * M_PI)) + 1) * 0.5;
-               if(t_loc != -1)
-                       sprog->set_uniformf(t_loc, t);
+               mu.t = (sin(time_sec + 7.3 * noise(i * M_PI)) + 1) * 0.5;
+               mbuf->update(&mu);
+               mbuf->bind(MORPHING_UNIFORMS);
 
-               if(mmod_loc != -1)
-                       sprog->set_uniform_matrix(mmod_loc, scene->objects[i]->transform.upper3x3());
+               vu.mmod = scene->objects[i]->transform.upper3x3();
+               vbuf->update(&vu);
+               vbuf->bind(MATRIX_UNIFORMS);
 
                draw_object(scene->objects[i]);
        }
-}
\ No newline at end of file
+}