Refactor Rendering of Objects (prepare for CPU rendering)
[ipdf/code.git] / src / objectrenderer.h
1 /**
2  * @file objectrenderer.h
3  * @brief Definition of ObjectRenderer class
4  */
5
6 #include "ipdf.h"
7 #include "graphicsbuffer.h"
8 #include "shaderprogram.h"
9 #include "bufferbuilder.h"
10
11 namespace IPDF
12 {
13         /**
14          * Abstract Base class representing how a particular type of object will be rendered
15          * Includes GPU rendering and CPU rendering
16          * For GPU rendering, pass GLSL shader source files to constructor in the constructor of a base class
17          *      To leave unimplemented, just pass NULL filename strings
18          * For CPU rendering, implement RenderUsingCPU in the base class
19          *  To leave unimplemented, just call ObjectRenderer::RenderUsingCPU in the base class
20          * The View class uses ObjectRenderer's; see view.h
21          */
22         class ObjectRenderer
23         {
24                 public:
25                         /** Construct the ObjectRenderer **/
26                         ObjectRenderer(const ObjectType & type, const char * vert_glsl_file, const char * frag_glsl_file, const char * geom_glsl_file = "");
27                         virtual ~ObjectRenderer() {}
28
29                         /**
30                          * Use the GPU to render the objects - GLSL shader approach
31                          * This way is definitely faster, but subject to the GPU's limitations on precision
32                          */
33                         void RenderUsingGPU();
34
35                         /** 
36                          * Use the CPU to render the objects - "make a bitmap and convert it to a texture" approach
37                          * This way is definitely slower, but gives us more control over the number representations than a GPU
38                          */
39                         virtual void RenderUsingCPU() = 0;
40                         
41                         
42                         
43                         const ObjectType m_type; /** Type of objects **/
44                 private:
45                         friend class View; //View is a friendly fellow in the world of IPDF
46                         void PrepareBuffers(unsigned max_size);
47                         void FinaliseBuffers();
48                         void AddObjectToBuffers(unsigned index);                        
49
50
51                         ShaderProgram m_shader_program; /** GLSL shaders for GPU **/
52                         GraphicsBuffer m_ibo; /** Index Buffer Object for GPU rendering **/
53                         std::vector<unsigned> m_indexes; /** Index vector for CPU rendering **/
54                         BufferBuilder<uint32_t> * m_buffer_builder; /** A BufferBuilder is temporarily used when preparing the ibo and std::vector **/
55         };
56
57         /** Renderer for filled rectangles **/
58         class RectFilledRenderer : public ObjectRenderer
59         {
60                 public:
61                         RectFilledRenderer() : ObjectRenderer(RECT_FILLED, "shaders/rect_vert.glsl", "shaders/rect_frag.glsl","shaders/rect_filled_geom.glsl") {}
62                         virtual ~RectFilledRenderer() {}
63                         virtual void RenderUsingCPU() {ObjectRenderer::RenderUsingCPU();} //TODO: Implement
64         };
65         /** Renderer for outlined rectangles **/
66         class RectOutlineRenderer : public ObjectRenderer
67         {
68                 public:
69                         RectOutlineRenderer() : ObjectRenderer(RECT_OUTLINE, "shaders/rect_vert.glsl", "shaders/rect_frag.glsl", "shaders/rect_outline_geom.glsl") {}
70                         virtual ~RectOutlineRenderer() {}
71                         virtual void RenderUsingCPU() {ObjectRenderer::RenderUsingCPU();} //TODO: Implement
72         };
73         /** Renderer for filled circles **/
74         class CircleFilledRenderer : public ObjectRenderer
75         {
76                 public:
77                         CircleFilledRenderer() : ObjectRenderer(CIRCLE_FILLED, "shaders/rect_vert.glsl", "shaders/circle_frag.glsl", "shaders/circle_filled_geom.glsl") {}
78                         virtual ~CircleFilledRenderer() {}
79                         virtual void RenderUsingCPU() {ObjectRenderer::RenderUsingCPU();} //TODO: Implement
80         };
81 }

UCC git Repository :: git.ucc.asn.au