getting uniform locations once, at the renderer creation, not everytime
authorEleni Maria Stea <elene.mst@gmail.com>
Wed, 26 Jul 2017 10:47:25 +0000 (13:47 +0300)
committerEleni Maria Stea <elene.mst@gmail.com>
Wed, 26 Jul 2017 10:47:25 +0000 (13:47 +0300)
we draw

src/renderer.cc
src/renderer.h

index f30c1ef..a223fa7 100644 (file)
@@ -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();
index c33206b..8f19243 100644 (file)
@@ -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;