X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fframebuffer.h;h=4fcfa9002c734ca6c05e1332a5775aea1e512633;hp=236d29e6a3dd65a8fddcf3bdc567b92530b80c21;hb=587b88ea9730cee089428b6491b9b166a1793173;hpb=6afbace895a7bbcf216ab8e48280ea0303ab5892 diff --git a/source/framebuffer.h b/source/framebuffer.h index 236d29e6..4fcfa900 100644 --- a/source/framebuffer.h +++ b/source/framebuffer.h @@ -5,6 +5,8 @@ #include "bindable.h" #include "gl.h" #include "texturecube.h" +#include +#include namespace Msp { namespace GL { @@ -12,6 +14,7 @@ namespace GL { class Renderbuffer; class Texture; class Texture2D; +class Texture3D; enum FramebufferAttachment { @@ -39,8 +42,7 @@ 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 + STENCIL_BUFFER_BIT = GL_STENCIL_BUFFER_BIT }; enum RWBuffer @@ -57,6 +59,13 @@ enum RWBuffer FRONT_AND_BACK = GL_FRONT_AND_BACK }; +class framebuffer_incomplete: public std::runtime_error +{ +public: + framebuffer_incomplete(FramebufferStatus); + virtual ~framebuffer_incomplete() throw() { } +}; + /** Framebuffer objects can be used to perform offscreen rendering. The most common application is rendering to a texture, which can then be used for @@ -82,18 +91,29 @@ private: Texture *tex; }; unsigned level; - GLenum cube_face; + unsigned layer; Attachment(FramebufferAttachment); void set(Renderbuffer &); - void set(Texture &, GLenum, unsigned); + void set(Texture &, unsigned, unsigned); void clear(); }; + struct Viewport + { + int left; + int bottom; + unsigned width; + unsigned height; + + Viewport(); + }; + unsigned id; std::vector attachments; unsigned width; unsigned height; + Viewport view; mutable unsigned dirty; Framebuffer(unsigned); @@ -111,6 +131,7 @@ private: public: void attach(FramebufferAttachment attch, Renderbuffer &rbuf); void attach(FramebufferAttachment attch, Texture2D &tex, unsigned level = 0); + void attach(FramebufferAttachment attch, Texture3D &tex, unsigned layer, unsigned level = 0); void attach(FramebufferAttachment attch, TextureCube &tex, TextureCubeFace face, unsigned level = 0); void detach(FramebufferAttachment attch); @@ -119,6 +140,13 @@ public: or one of the error status codes otherwise. */ FramebufferStatus check_status() const; + /** Ensures that the framebuffer is complete, throwing an exception if it + isn't. */ + void require_complete() const; + + void viewport(int, int, unsigned, unsigned); + void reset_viewport(); + void clear(BufferBits); /** Blits a region from another framebuffer into this one. If the source