Changed the OpenGL part and the GLSL shaders to use UBO and
[demo] / src / renderer.h
1 #ifndef RENDERER_H_
2 #define RENDERER_H_
3
4 #include <gmath/gmath.h>
5
6 class OrbitCamera;
7 class Object;
8 class Scene;
9 class ShaderProgram;
10 class Texture;
11 class UniformBuffer;
12
13 enum {
14         MATRIX_UNIFORMS = 0,
15         SHADING_UNIFORMS = 1,
16         SKY_MATRIX_UNIFORMS = 2,
17         MORPHING_UNIFORMS = 3,
18         MORPHING_SHADING_UNIFORMS = 4,
19 };
20
21 struct BaseVertUniforms {
22         Mat4 mview;
23         Mat4 mmviewproj;
24         Mat4 mmod;
25 };
26
27 struct BaseFragUniforms {
28         Vec4 diffuse;
29         Vec4 specular;
30         float shininess;
31         float fog_density;
32 };
33
34 struct SkyVertUniforms {
35         Mat4 mviewproj;
36 };
37
38 class Renderer {
39 protected:
40         BaseVertUniforms vu;
41         UniformBuffer *vbuf;
42
43         BaseFragUniforms fu;
44         UniformBuffer *fbuf;
45
46         SkyVertUniforms svu;
47         UniformBuffer *svbuf;
48
49         ShaderProgram *sprog;
50
51         /* debug shader to draw normals */
52         ShaderProgram *nprog;
53
54         Texture *skytex, *dskytex;
55
56         virtual void draw_object(Object *object);
57         virtual void draw_skybox();
58
59 public:
60         float fog_density;
61
62         Scene *scene;
63         OrbitCamera *camera;
64
65         Renderer();
66         virtual ~Renderer();
67
68         virtual bool create();
69         virtual void draw();
70
71         virtual void set_sky_tex(Texture *stex);
72         virtual void set_diffuse_sky_tex(Texture *dstex);
73 };
74
75 #endif // RENDERER_H_