Refactor Rendering of Objects (prepare for CPU rendering)
[ipdf/code.git] / src / objectrenderer.h
diff --git a/src/objectrenderer.h b/src/objectrenderer.h
new file mode 100644 (file)
index 0000000..6e5176b
--- /dev/null
@@ -0,0 +1,81 @@
+/**
+ * @file objectrenderer.h
+ * @brief Definition of ObjectRenderer class
+ */
+
+#include "ipdf.h"
+#include "graphicsbuffer.h"
+#include "shaderprogram.h"
+#include "bufferbuilder.h"
+
+namespace IPDF
+{
+       /**
+        * Abstract Base class representing how a particular type of object will be rendered
+        * Includes GPU rendering and CPU rendering
+        * For GPU rendering, pass GLSL shader source files to constructor in the constructor of a base class
+        *      To leave unimplemented, just pass NULL filename strings
+        * For CPU rendering, implement RenderUsingCPU in the base class
+        *  To leave unimplemented, just call ObjectRenderer::RenderUsingCPU in the base class
+        * The View class uses ObjectRenderer's; see view.h
+        */
+       class ObjectRenderer
+       {
+               public:
+                       /** Construct the ObjectRenderer **/
+                       ObjectRenderer(const ObjectType & type, const char * vert_glsl_file, const char * frag_glsl_file, const char * geom_glsl_file = "");
+                       virtual ~ObjectRenderer() {}
+
+                       /**
+                        * Use the GPU to render the objects - GLSL shader approach
+                        * This way is definitely faster, but subject to the GPU's limitations on precision
+                        */
+                       void RenderUsingGPU();
+
+                       /** 
+                        * Use the CPU to render the objects - "make a bitmap and convert it to a texture" approach
+                        * This way is definitely slower, but gives us more control over the number representations than a GPU
+                        */
+                       virtual void RenderUsingCPU() = 0;
+                       
+                       
+                       
+                       const ObjectType m_type; /** Type of objects **/
+               private:
+                       friend class View; //View is a friendly fellow in the world of IPDF
+                       void PrepareBuffers(unsigned max_size);
+                       void FinaliseBuffers();
+                       void AddObjectToBuffers(unsigned index);                        
+
+
+                       ShaderProgram m_shader_program; /** GLSL shaders for GPU **/
+                       GraphicsBuffer m_ibo; /** Index Buffer Object for GPU rendering **/
+                       std::vector<unsigned> m_indexes; /** Index vector for CPU rendering **/
+                       BufferBuilder<uint32_t> * m_buffer_builder; /** A BufferBuilder is temporarily used when preparing the ibo and std::vector **/
+       };
+
+       /** Renderer for filled rectangles **/
+       class RectFilledRenderer : public ObjectRenderer
+       {
+               public:
+                       RectFilledRenderer() : ObjectRenderer(RECT_FILLED, "shaders/rect_vert.glsl", "shaders/rect_frag.glsl","shaders/rect_filled_geom.glsl") {}
+                       virtual ~RectFilledRenderer() {}
+                       virtual void RenderUsingCPU() {ObjectRenderer::RenderUsingCPU();} //TODO: Implement
+       };
+       /** Renderer for outlined rectangles **/
+       class RectOutlineRenderer : public ObjectRenderer
+       {
+               public:
+                       RectOutlineRenderer() : ObjectRenderer(RECT_OUTLINE, "shaders/rect_vert.glsl", "shaders/rect_frag.glsl", "shaders/rect_outline_geom.glsl") {}
+                       virtual ~RectOutlineRenderer() {}
+                       virtual void RenderUsingCPU() {ObjectRenderer::RenderUsingCPU();} //TODO: Implement
+       };
+       /** Renderer for filled circles **/
+       class CircleFilledRenderer : public ObjectRenderer
+       {
+               public:
+                       CircleFilledRenderer() : ObjectRenderer(CIRCLE_FILLED, "shaders/rect_vert.glsl", "shaders/circle_frag.glsl", "shaders/circle_filled_geom.glsl") {}
+                       virtual ~CircleFilledRenderer() {}
+                       virtual void RenderUsingCPU() {ObjectRenderer::RenderUsingCPU();} //TODO: Implement
+       };
+}

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