From c0915f6cc7bf834c5d745f2be0e218715a9dc845 Mon Sep 17 00:00:00 2001 From: Eleni Maria Stea Date: Wed, 26 Jul 2017 13:47:25 +0300 Subject: [PATCH] getting uniform locations once, at the renderer creation, not everytime we draw --- src/renderer.cc | 77 +++++++++++++++++++++++++++++++++---------------------- src/renderer.h | 6 +++++ 2 files changed, 52 insertions(+), 31 deletions(-) diff --git a/src/renderer.cc b/src/renderer.cc index f30c1ef..a223fa7 100644 --- a/src/renderer.cc +++ b/src/renderer.cc @@ -28,6 +28,39 @@ bool Renderer::create() return false; } + if(!(sprog->link())) { + return false; + } + + /* getting material uniform locations: diffuse, specular, specular exponent (strength) */ + + if((diff_loc = sprog->get_uniform_location("diffuse")) == -1) { + fprintf(stderr, "Invalid uniform location: can't find \"diffuse\".\n"); + return false; + } + + if((spec_loc = sprog->get_uniform_location("specular")) == -1) { + fprintf(stderr, "Invalid uniform location: can't find \"specular\".\n"); + return false; + } + + if((shin_loc = sprog->get_uniform_location("shininess")) == -1) { + fprintf(stderr, "Invalid uniform location: can't find \"shininess\".\n"); + return false; + } + + /* uniform locations for matrices */ + + if((mmviewproj_loc = sprog->get_uniform_location("mmviewproj")) == -1) { + fprintf(stderr, "Invalid uniform location: can't find \"mmviewproj\".\n"); + return false; + } + + if((mview_loc = sprog->get_uniform_location("mview")) == -1) { + fprintf(stderr, "Invalid uniform location: can't find \"mview\".\n"); + return false; + } + return true; } @@ -52,43 +85,25 @@ void Renderer::draw() const void Renderer::draw_object(Object *object) const { Material *m = object->material; - /* diffuse */ - int diff_loc; - if((diff_loc = sprog->get_uniform_location("diffuse")) != -1) { - sprog->set_uniformf(diff_loc, m->diffuse.x, m->diffuse.y, m->diffuse.z, 1); - } - /* specular */ - int spec_loc; - if((spec_loc = sprog->get_uniform_location("specular")) != -1) { - sprog->set_uniformf(spec_loc, m->specular.x, m->specular.y, m->specular.z, 1); - } - /* specular exponent */ - int shin_loc; - if((shin_loc = sprog->get_uniform_location("shininess")) != -1) { - sprog->set_uniformf(shin_loc, m->shininess); - } + + /* setting uniforms for material */ + + sprog->set_uniformf(diff_loc, m->diffuse.x, m->diffuse.y, m->diffuse.z, 1); + sprog->set_uniformf(spec_loc, m->specular.x, m->specular.y, m->specular.z, 1); + sprog->set_uniformf(shin_loc, m->shininess); + /* texture */ + if (m->dtex) m->dtex->bind(); - // Mat4 mmviewproj = mprojection * camera->get_view_matrix() * object->transform; + /* setting uniforms for matrices */ + Mat4 mmviewproj = object->transform * camera->get_view_matrix() * mprojection; - // printf("\nmatrices:\n"); - // mprojection.print(); - // camera->get_view_matrix().print(); - // object->transform.print(); - // mmodelview.print(); - - int mmviewproj_loc; - if((mmviewproj_loc = sprog->get_uniform_location("mmviewproj")) != -1) { - sprog->set_uniform_matrix(mmviewproj_loc, mmviewproj); - } + sprog->set_uniform_matrix(mmviewproj_loc, mmviewproj); - Mat4 mview = camera->get_view_matrix(); //* object->transform; - int mview_loc; - if((mview_loc = sprog->get_uniform_location("mview")) != -1) { - sprog->set_uniform_matrix(mview_loc, mview); - } + Mat4 mview = object->transform * camera->get_view_matrix(); + sprog->set_uniform_matrix(mview_loc, mview); object->mesh->update_vertex_data(); object->mesh->draw(); diff --git a/src/renderer.h b/src/renderer.h index c33206b..8f19243 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -8,6 +8,12 @@ class ShaderProgram; class Renderer { protected: + int diff_loc; + int spec_loc; + int shin_loc; + int mmviewproj_loc; + int mview_loc; + ShaderProgram *sprog; virtual void draw_object(Object *object) const; -- 1.7.10.4