X-Git-Url: https://git.ucc.asn.au/?p=ipdf%2Fcode.git;a=blobdiff_plain;f=src%2Fobjectrenderer.h;h=4dd7fe1ec9e8a3ae5cbb8f13545a85da09b510da;hp=6e5176b5104f191373c515289387f930c6496b32;hb=f59f24dff392428d7219ba2d6be5e1e81c344ee0;hpb=f8ef964f021d1d6da6ea46bbb1fe8f0250a5be8c diff --git a/src/objectrenderer.h b/src/objectrenderer.h index 6e5176b..4dd7fe1 100644 --- a/src/objectrenderer.h +++ b/src/objectrenderer.h @@ -3,6 +3,9 @@ * @brief Definition of ObjectRenderer class */ +#ifndef _OBJECT_RENDERER_H +#define _OBJECT_RENDERER_H + #include "ipdf.h" #include "graphicsbuffer.h" #include "shaderprogram.h" @@ -10,13 +13,14 @@ namespace IPDF { + class View; /** * 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 + * For CPU rendering, implement RenderUsingCPU in the derived class + * To leave unimplemented, just call ObjectRenderer::RenderUsingCPU in the derived class * The View class uses ObjectRenderer's; see view.h */ class ObjectRenderer @@ -30,23 +34,44 @@ namespace IPDF * 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(); + virtual 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; + + struct CPURenderTarget + { + uint8_t * pixels; + int64_t w; + int64_t h; + }; + struct PixelBounds + { + int64_t x; int64_t y; int64_t w; int64_t h; + PixelBounds(const Rect & bounds) : x(bounds.x), y(bounds.y), w(bounds.w), h(bounds.h) {} + }; + + static Rect CPURenderBounds(const Rect & bounds, const View & view, const CPURenderTarget & target); + + + static void SaveBMP(const CPURenderTarget & target, const char * filename); + + + virtual void RenderUsingCPU(const Objects & objects, const View & view, const CPURenderTarget & target) = 0; const ObjectType m_type; /** Type of objects **/ - private: + protected: friend class View; //View is a friendly fellow in the world of IPDF void PrepareBuffers(unsigned max_size); void FinaliseBuffers(); void AddObjectToBuffers(unsigned index); - + + /** Helper for CPU rendering that will render a line using Bresenham's algorithm. Do not use the transpose argument. **/ + static void RenderLineOnCPU(int64_t x0, int64_t y0, int64_t x1, int64_t y1, const CPURenderTarget & target, const Colour & colour = Colour(0,0,0,1), bool transpose = false); ShaderProgram m_shader_program; /** GLSL shaders for GPU **/ GraphicsBuffer m_ibo; /** Index Buffer Object for GPU rendering **/ @@ -60,7 +85,7 @@ namespace IPDF 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 + virtual void RenderUsingCPU(const Objects & objects, const View & view, const CPURenderTarget & target); }; /** Renderer for outlined rectangles **/ class RectOutlineRenderer : public ObjectRenderer @@ -68,7 +93,7 @@ namespace IPDF 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 + virtual void RenderUsingCPU(const Objects & objects, const View & view, const CPURenderTarget & target); }; /** Renderer for filled circles **/ class CircleFilledRenderer : public ObjectRenderer @@ -76,6 +101,22 @@ namespace IPDF 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 + virtual void RenderUsingCPU(const Objects & objects, const View & view, const CPURenderTarget & target); + }; + + /** Renderer for bezier curves **/ + class BezierRenderer : public ObjectRenderer + { + public: + BezierRenderer() : ObjectRenderer(BEZIER, "shaders/rect_vert.glsl", "shaders/rect_frag.glsl", "shaders/rect_outline_geom.glsl") {} + virtual ~BezierRenderer() {} + virtual void RenderUsingGPU() + { + Error("Cannot render beziers on the GPU; they will appear as outlined rectangles."); + ObjectRenderer::RenderUsingGPU(); + } + virtual void RenderUsingCPU(const Objects & objects, const View & view, const CPURenderTarget & target); }; } + +#endif //_OBJECT_RENDERER_H