X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fframebuffer.h;h=9fe4cd8bd028f1d929ead4111ddcd8f11126d619;hp=ce36212528bb8ea5f2c5d9863fc61cb3ec810f73;hb=98c810b6d2256aa65986bbde12c38917678121bb;hpb=5658c6ea1a5caf1b408366cebf785f79d650ff53 diff --git a/source/framebuffer.h b/source/framebuffer.h index ce362125..9fe4cd8b 100644 --- a/source/framebuffer.h +++ b/source/framebuffer.h @@ -8,6 +8,7 @@ Distributed under the LGPL #ifndef MSP_GL_FRAMEBUFFER_H_ #define MSP_GL_FRAMEBUFFER_H_ +#include #include "gl.h" #include "types.h" @@ -15,6 +16,7 @@ namespace Msp { namespace GL { class Renderbuffer; +class Texture; class Texture2D; enum FramebufferAttachment @@ -39,6 +41,28 @@ enum FramebufferStatus FRAMEBUFFER_COMPLETE = GL_FRAMEBUFFER_COMPLETE_EXT }; +enum BufferBits +{ + COLOR_BUFFER_BIT = GL_COLOR_BUFFER_BIT, + DEPTH_BUFFER_BIT = GL_DEPTH_BUFFER_BIT, + STENCIL_BUFFER_BIT = GL_STENCIL_BUFFER_BIT, + ACCUM_BUFFER_BIT = GL_ACCUM_BUFFER_BIT +}; + +enum RWBuffer +{ + NO_BUFFER = GL_NONE, + FRONT_LEFT = GL_FRONT_LEFT, + FRONT_RIGHT = GL_FRONT_RIGHT, + BACK_LEFT = GL_BACK_LEFT, + BACK_RIGHT = GL_BACK_RIGHT, + FRONT = GL_FRONT, + BACK = GL_BACK, + LEFT = GL_LEFT, + RIGHT = GL_RIGHT, + FRONT_AND_BACK = GL_FRONT_AND_BACK +}; + /** Framebuffer objects can be used to perform offscreen rendering. The most common application is rendering to a texture, which can then be used for @@ -53,9 +77,28 @@ Requires the GL_EXT_framebuffer_object extension. class Framebuffer { private: + struct Attachment + { + FramebufferAttachment attachment; + GLenum type; + union + { + Renderbuffer *rbuf; + Texture *tex; + }; + + Attachment(FramebufferAttachment); + Attachment &operator=(Renderbuffer &); + Attachment &operator=(Texture &); + }; + uint id; + std::vector attachments; + unsigned width; + unsigned height; static const Framebuffer *cur_fbo; + static int sys_viewport[4]; public: Framebuffer(); @@ -65,6 +108,7 @@ public: void attach(FramebufferAttachment attch, Renderbuffer &rbuf); void attach(FramebufferAttachment attch, Texture2D &tex, int level); + void detach(FramebufferAttachment attch); /** Checks the completeness status of the framebuffer. Returns @@ -77,8 +121,18 @@ public: static void unbind(); private: void maybe_bind() const; + Attachment &get_or_create_attachment(FramebufferAttachment); + void check_size(); }; +inline BufferBits operator|(BufferBits a, BufferBits b) +{ return static_cast(static_cast(a)|static_cast(b)); } + +void viewport(int, int, unsigned, unsigned); +void clear(BufferBits); +void draw_buffer(RWBuffer); +void read_buffer(RWBuffer); + } // namespace GL } // namespace Msp