quick 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 #include "texture.h"
13
14 Renderer::Renderer()
15 {
16         scene = 0;
17         camera = 0;
18         sprog = 0;
19 }
20
21 Renderer::~Renderer()
22 {
23 }
24
25 bool Renderer::create()
26 {
27         if(!(sprog = sdr_man->create_shader_program("default.v.glsl", "default.f.glsl"))) {
28                 return false;
29         }
30
31         return true;
32 }
33
34 void Renderer::draw() const
35 {
36         if(!camera || !scene)
37                 return;
38
39         glClearColor(0.5, 0.5, 0.5, 1);
40         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
41
42         if(!sprog->link())
43                 return;
44
45         sprog->use();
46
47         for(size_t i=0; i<scene->objects.size(); i++) {
48                 draw_object(scene->objects[i]);
49         }
50 }
51
52 void Renderer::draw_object(Object *object) const
53 {
54         Material *m = object->material;
55         /* diffuse */
56         int diff_loc;
57         if((diff_loc = sprog->get_uniform_location("diffuse")) != -1) {
58                 sprog->set_uniformf(diff_loc, m->diffuse.x, m->diffuse.y, m->diffuse.z, 1);
59         }
60         /* specular */
61         int spec_loc;
62         if((spec_loc = sprog->get_uniform_location("specular")) != -1) {
63                 sprog->set_uniformf(spec_loc, m->specular.x, m->specular.y, m->specular.z, 1);
64         }
65         /* specular exponent */
66         int shin_loc;
67         if((shin_loc = sprog->get_uniform_location("shininess")) != -1) {
68                 sprog->set_uniformf(shin_loc, m->shininess);
69         }
70         /* texture */
71         if (m->dtex)
72                 m->dtex->bind();
73
74         // Mat4 mmviewproj = mprojection * camera->get_view_matrix() * object->transform;
75         Mat4 mmviewproj = object->transform * camera->get_view_matrix() * mprojection;
76         // printf("\nmatrices:\n");
77         // mprojection.print();
78         // camera->get_view_matrix().print();
79         // object->transform.print();
80         // mmodelview.print();
81
82         int mmviewproj_loc;
83         if((mmviewproj_loc = sprog->get_uniform_location("mmviewproj")) != -1) {
84                 sprog->set_uniform_matrix(mmviewproj_loc, mmviewproj);
85         }
86
87         Mat4 mview = camera->get_view_matrix(); //* object->transform;
88         int mview_loc;
89         if((mview_loc = sprog->get_uniform_location("mview")) != -1) {
90                 sprog->set_uniform_matrix(mview_loc, mview);
91         }
92
93         object->mesh->update_vertex_data();
94         object->mesh->draw();
95 }