#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()
{
/* we won't use them */
skytex = 0;
dskytex = 0;
+
+ fog_density = 0;
+
+ mbuf = vbuf = fbuf = svbuf = 0;
}
MorphRenderer::~MorphRenderer()
{
+ delete mbuf;
}
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");
+ if(!vbuf) {
+ vbuf = gfx_create_uniform_buffer();
+ if(!vbuf->create(sizeof vu)) {
+ fprintf(stderr, "Failed to create uniform buffer.\n");
+ return false;
+ }
+ }
- /* uniform locations for matrices */
+ if(!fbuf) {
+ fbuf = gfx_create_uniform_buffer();
+ if(!fbuf->create(sizeof fu)) {
+ 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(!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;
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);
+
+ vu.mmod = scene->objects[i]->transform.upper3x3();
+ vbuf->update(&vu);
+ vbuf->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