5b81be39ee643e45cbf29a6b121666bb2da312e0
[demo] / src / opengl / renderer-gl.cc
1 #include <GL/glew.h>
2
3 #include "object.h"
4 #include "scene.h"
5
6 #include "opengl/mesh-gl.h"
7 #include "opengl/renderer-gl.h"
8 #include "opengl/shader-gl.h"
9 #include "opengl/texture-gl.h"
10
11 RendererGL::RendererGL()
12 {
13         sprog = 0;
14         scene = 0;
15         camera = 0;
16 }
17
18 RendererGL::RendererGL(ShaderProgram *sprog, Scene *scene, Camera *camera)
19 {
20         this->sprog = sprog;
21         this->scene = scene;
22         this->camera = camera;
23 }
24
25 RendererGL::~RendererGL()
26 {
27         destroy_shaders();
28 }
29
30 void RendererGL::draw() const
31 {
32         /* use shaders */
33         if(!sprog) {
34                 fprintf(stderr, "No active shaders found. Using default.\n");
35                 glUseProgram(0);
36         }
37         else {
38                 sprog->use();
39         }
40
41         /* draw all scene components */
42         for(size_t i=0; i<scene->objects.size(); ++i) {
43                 draw_object(scene->objects[i]);
44         }
45 }
46
47
48 bool RendererGL::init_shaders(const char *vfname, const char *ffname)
49 {
50         if(sprog)
51                 delete sprog;
52
53         sprog = new ShaderProgramGL;
54         if(!sprog->load(vfname, ffname))
55                 goto error;
56
57         if(!sprog->link())
58                 goto error;
59
60         sprog->use();
61
62         glEnable(GL_DEPTH_TEST);
63         glEnable(GL_CULL_FACE);
64
65         return true;
66
67 error:
68         destroy_shaders();
69         return false;
70 }
71
72 void RendererGL::destroy_shaders()
73 {
74         if(sprog) {
75                 delete sprog;
76                 sprog = 0;
77         }
78 }
79
80 void RendererGL::draw_object(Object *object) const
81 {
82         object->material->dtex->bind();
83
84
85
86         object->mesh->draw();
87 }