X-Git-Url: http://git.mutantstargoat.com?a=blobdiff_plain;f=src%2Fmorph_renderer.cc;h=a8adf56a82e9b2bc41c7dece80de5baeb1f54d33;hb=HEAD;hp=601c3359a06fe48e03ca616d2c4975f730939fb8;hpb=198fff0ac38a65f6c2db8d9061e47481febfb008;p=demo diff --git a/src/morph_renderer.cc b/src/morph_renderer.cc index 601c335..a8adf56 100644 --- a/src/morph_renderer.cc +++ b/src/morph_renderer.cc @@ -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; iobjects.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