no clue :) just to push it
[demo] / src / morph_renderer.cc
index 601c335..a8adf56 100644 (file)
@@ -1,8 +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()
 {
@@ -15,10 +22,16 @@ MorphRenderer::MorphRenderer()
        dskytex = 0;
 
        fog_density = 0;
+
+       mbuf = 0;
+       default_vs_ub = 0;
+       default_fs_ub = 0;
+       sky_vs_ub = 0;
 }
 
 MorphRenderer::~MorphRenderer()
 {
+       delete mbuf;
 }
 
 bool MorphRenderer::create()
@@ -27,23 +40,40 @@ bool MorphRenderer::create()
                return false;
        }
 
-       /* getting material uniform locations: diffuse, specular, specular exponent (strength) */
+       mbuf = gfx_create_uniform_buffer();
+       if(!mbuf->create(sizeof mu)) {
+               fprintf(stderr, "Failed to create uniform buffer.\n");
+               return false;
+       }
 
-       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");
+       if(!default_vs_ub) {
+               default_vs_ub = gfx_create_uniform_buffer();
+               if(!default_vs_ub->create(sizeof default_vs_uniforms)) {
+                       fprintf(stderr, "Failed to create uniform buffer.\n");
+                       return false;
+               }
+       }
 
-       /* uniform locations for matrices */
+       if(!default_fs_ub) {
+               default_fs_ub = gfx_create_uniform_buffer();
+               if(!default_fs_ub->create(sizeof default_fs_uniforms)) {
+                       fprintf(stderr, "Failed to create uniform buffer.\n");
+                       return false;
+               }
+       }
 
-       mmviewproj_loc = sprog->get_uniform_location("mmviewproj");
-       mview_loc = sprog->get_uniform_location("mview");
+       if(!sky_vs_ub) {
+               sky_vs_ub = gfx_create_uniform_buffer();
+               if(!sky_vs_ub->create(sizeof sky_vs_uniforms)) {
+                       fprintf(stderr, "Failed to create uniform buffer.\n");
+                       return false;
+               }
+       }
 
        return true;
 }
 
-void MorphRenderer::draw() const
+void MorphRenderer::draw()
 {
        if(!camera || !scene)
                return;
@@ -51,19 +81,21 @@ void MorphRenderer::draw() const
        if(!sprog->link())
                return;
 
+       if(dskytex) {
+               dskytex->bind(1);
+       }
+
        sprog->use();
 
        for(size_t i=0; i<scene->objects.size(); i++) {
+               mu.t = (sin(time_sec + 7.3 * noise(i * M_PI)) + 1) * 0.5;
+               mbuf->update(&mu);
+               mbuf->bind(MORPHING_MATRIX_UNIFORMS);
+
+               default_vs_uniforms.mmod = scene->objects[i]->transform.upper3x3();
+               default_vs_ub->update(&default_vs_uniforms);
+               default_vs_ub->bind(MATRIX_UNIFORMS);
+
                draw_object(scene->objects[i]);
        }
 }
-
-void MorphRenderer::draw_object(Object *object) const
-{
-       float t =  (sin(time_sec) + 1) * 0.5;
-
-       if(t_loc != -1)
-               sprog->set_uniformf(t_loc, t);
-
-       Renderer::draw_object(object);
-}
\ No newline at end of file