X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fframebuffer.h;h=3d3ec088138f9d4b50d675ead1d0b73807277212;hp=0dd8f5d79a5ab14c644e795350102a9dca980fff;hb=f14435e58bfa0fa697a06ba9a454bb30cd37d9d8;hpb=a361efc05fcad11b2918f3cd7abdebe794b131d8 diff --git a/source/framebuffer.h b/source/framebuffer.h index 0dd8f5d7..3d3ec088 100644 --- a/source/framebuffer.h +++ b/source/framebuffer.h @@ -1,19 +1,15 @@ -/* $Id$ - -This file is part of libmspgl -Copyright © 2007 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - #ifndef MSP_GL_FRAMEBUFFER_H_ #define MSP_GL_FRAMEBUFFER_H_ -#include "types.h" +#include +#include "bindable.h" +#include "gl.h" namespace Msp { namespace GL { class Renderbuffer; +class Texture; class Texture2D; enum FramebufferAttachment @@ -38,6 +34,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 @@ -49,21 +67,47 @@ least one image must be attached for the framebuffer to be usable. Requires the GL_EXT_framebuffer_object extension. */ -class Framebuffer +class Framebuffer: public Bindable { private: - uint id; - - static const Framebuffer *current; - + struct Attachment + { + FramebufferAttachment attachment; + GLenum type; + union + { + Renderbuffer *rbuf; + Texture *tex; + }; + unsigned level; + + Attachment(FramebufferAttachment); + void set(Renderbuffer &); + void set(Texture &, unsigned); + void clear(); + }; + + unsigned id; + std::vector attachments; + unsigned width; + unsigned height; + mutable unsigned dirty; + + Framebuffer(unsigned); public: Framebuffer(); ~Framebuffer(); - void bind() const; + unsigned get_width() const { return width; } + unsigned get_height() const { return height; } +private: + void update_attachment(unsigned) const; + void check_size(); +public: void attach(FramebufferAttachment attch, Renderbuffer &rbuf); - void attach(FramebufferAttachment attch, Texture2D &tex, int level); + void attach(FramebufferAttachment attch, Texture2D &tex, unsigned level = 0); + void detach(FramebufferAttachment attch); /** Checks the completeness status of the framebuffer. Returns @@ -72,11 +116,24 @@ public: */ FramebufferStatus check_status() const; + void clear(BufferBits); + void blit_from(const Framebuffer &, int, int, int, int, int, int, int, int, BufferBits, bool); + void blit_from(const Framebuffer &, int, int, unsigned, unsigned, int, int, BufferBits); + void blit_from(const Framebuffer &, BufferBits, bool); + + void bind() const; + + static const Framebuffer *current(); static void unbind(); + + static Framebuffer &system(); private: - void maybe_bind() const; + unsigned get_attachment_index(FramebufferAttachment); }; +inline BufferBits operator|(BufferBits a, BufferBits b) +{ return static_cast(static_cast(a)|static_cast(b)); } + } // namespace GL } // namespace Msp