#ifndef RENDERER_H_
#define RENDERER_H_
-/*
- this might change:
- atm we are going to have 1 renderer per scene and 1 shader program
- for the scene
- */
+#include <gmath/gmath.h>
-
-class Camera;
+class OrbitCamera;
class Object;
class Scene;
class ShaderProgram;
+class Texture;
+class UniformBuffer;
+
+enum {
+ MATRIX_UNIFORMS = 0,
+ SHADING_UNIFORMS = 1,
+ SKY_MATRIX_UNIFORMS = 2,
+ MORPHING_MATRIX_UNIFORMS = 3,
+ MORPHING_SHADING_UNIFORMS = 4,
+};
+
+struct BaseMatrixUniforms {
+ Mat4 mview;
+ Mat4 mmviewproj;
+ Mat4 mmod;
+};
+
+struct BaseShadingUniforms {
+ Vec4 diffuse;
+ Vec4 specular;
+ float shininess;
+ float fog_density;
+};
+
+struct SkyMatrixUniforms {
+ Mat4 mviewproj;
+};
class Renderer {
protected:
+ BaseMatrixUniforms default_vs_uniforms;
+ UniformBuffer *default_vs_ub;
+
+ BaseShadingUniforms default_fs_uniforms;
+ UniformBuffer *default_fs_ub;
+
+ SkyMatrixUniforms sky_vs_uniforms;
+ UniformBuffer *sky_vs_ub;
+
ShaderProgram *sprog;
- virtual void draw_object(Object *object) const = 0;
+
+ /* debug shader to draw normals */
+ ShaderProgram *nprog;
+
+ Texture *skytex, *dskytex;
+
+ virtual void draw_object(Object *object);
+ virtual void draw_skybox();
public:
+ float fog_density;
+
Scene *scene;
- Camera *camera;
+ OrbitCamera *camera;
Renderer();
- Renderer(ShaderProgram *sprog, Scene *scene, Camera *camera);
virtual ~Renderer();
- virtual bool load_shader_program(const char *vfname, const char *ffname) = 0;
- virtual void use_shader_program() = 0;
+ virtual bool create();
+ virtual void draw();
- virtual bool create() = 0;
- virtual void draw() const = 0;
+ virtual void set_sky_tex(Texture *stex);
+ virtual void set_diffuse_sky_tex(Texture *dstex);
};
-#endif // RENDERER_H_
\ No newline at end of file
+#endif // RENDERER_H_