backup:
[demo] / src / renderer.cc
1 #include <GL/glew.h>
2
3 #include "global.h"
4
5 #include "camera.h"
6 #include "mesh.h"
7 #include "object.h"
8 #include "renderer.h"
9 #include "scene.h"
10 #include "shader.h"
11 #include "shader_manager.h"
12
13 Renderer::Renderer()
14 {
15         scene = 0;
16         camera = 0;
17         sprog = 0;
18 }
19
20 Renderer::~Renderer()
21 {
22 }
23
24 bool Renderer::create()
25 {       
26         if(!(sprog = sdr_man->create_shader_program("default.v.glsl", "default.f.glsl"))) {
27                 return false;
28         }
29
30         return true;
31 }
32
33 void Renderer::draw() const
34 {
35         if(!camera || !scene)
36                 return;
37
38         int mview_loc;
39         if((mview_loc = sprog->get_uniform_location("mview")) != -1) {
40                 sprog->set_uniform_matrix(mview_loc, camera->get_view_matrix());
41         }
42
43         int mproj_loc;
44         if((mproj_loc = sprog->get_uniform_location("mproj")) != -1) {
45                 sprog->set_uniform_matrix(mproj_loc, mprojection);
46         }
47
48         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
49         camera->set_orbit_params(phi, theta, dist);
50
51         for(size_t i=0; i<scene->objects.size(); i++) {
52                 draw_object(scene->objects[i]);
53         }
54 }
55
56 void Renderer::draw_object(Object *object) const
57 {
58         Material *m = object->material;
59         /* diffuse */
60         int diff_loc;
61         if((diff_loc = sprog->get_uniform_location("diffuse")) != -1) {
62                 sprog->set_uniformf(diff_loc, m->diffuse.x, m->diffuse.y, m->diffuse.z);
63         }
64         /* specular */
65         int spec_loc;
66         if((spec_loc = sprog->get_uniform_location("specular")) != -1) {
67                 sprog->set_uniformf(spec_loc, m->specular.x, m->specular.y, m->specular.z);
68         }
69         /* specular exponent */
70         int shin_loc;
71         if((shin_loc = sprog->get_uniform_location("shininess")) != -1) {
72                 sprog->set_uniformf(shin_loc, m->shininess);
73         }
74
75         if (!sprog->link())
76                 return;
77
78         sprog->use();
79         object->mesh->draw();
80 }