X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fframebuffer.h;h=f977ad7eb11fdc109740c7a19077ca1e3e7d7ec9;hp=4fcfa9002c734ca6c05e1332a5775aea1e512633;hb=HEAD;hpb=587b88ea9730cee089428b6491b9b166a1793173 diff --git a/source/framebuffer.h b/source/framebuffer.h deleted file mode 100644 index 4fcfa900..00000000 --- a/source/framebuffer.h +++ /dev/null @@ -1,181 +0,0 @@ -#ifndef MSP_GL_FRAMEBUFFER_H_ -#define MSP_GL_FRAMEBUFFER_H_ - -#include -#include "bindable.h" -#include "gl.h" -#include "texturecube.h" -#include -#include - -namespace Msp { -namespace GL { - -class Renderbuffer; -class Texture; -class Texture2D; -class Texture3D; - -enum FramebufferAttachment -{ - COLOR_ATTACHMENT0 = GL_COLOR_ATTACHMENT0, - COLOR_ATTACHMENT1 = GL_COLOR_ATTACHMENT1, - COLOR_ATTACHMENT2 = GL_COLOR_ATTACHMENT2, - COLOR_ATTACHMENT3 = GL_COLOR_ATTACHMENT3, - DEPTH_ATTACHMENT = GL_DEPTH_ATTACHMENT, - STENCIL_ATTACHMENT = GL_STENCIL_ATTACHMENT -}; - -enum FramebufferStatus -{ - FRAMEBUFFER_INCOMPLETE_ATTACHMENT = GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT, - FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT, - FRAMEBUFFER_INCOMPLETE_DIMENSIONS = GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT, - FRAMEBUFFER_INCOMPLETE_FORMATS = GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT, - FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER = GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER, - FRAMEBUFFER_INCOMPLETE_READ_BUFFER = GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER, - FRAMEBUFFER_UNSUPPORTED = GL_FRAMEBUFFER_UNSUPPORTED, - FRAMEBUFFER_COMPLETE = GL_FRAMEBUFFER_COMPLETE -}; - -enum BufferBits -{ - COLOR_BUFFER_BIT = GL_COLOR_BUFFER_BIT, - DEPTH_BUFFER_BIT = GL_DEPTH_BUFFER_BIT, - STENCIL_BUFFER_BIT = GL_STENCIL_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 -}; - -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 -fullscreen shader effects. - -A framebuffer consist of a number of logical buffers, such as color and depth -buffers. Renderbuffers and Textures can be attached to the logical buffers. At -least one image must be attached for the framebuffer to be usable. - -Requires the GL_EXT_framebuffer_object extension. The blit functions require -the GL_EXT_framebuffer_blit extension. -*/ -class Framebuffer: public Bindable -{ -private: - struct Attachment - { - FramebufferAttachment attachment; - GLenum type; - union - { - Renderbuffer *rbuf; - Texture *tex; - }; - unsigned level; - unsigned layer; - - Attachment(FramebufferAttachment); - void set(Renderbuffer &); - 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); -public: - Framebuffer(); - ~Framebuffer(); - - unsigned get_width() const { return width; } - unsigned get_height() const { return height; } - -private: - void update_attachment(unsigned) const; - void check_size(); - unsigned get_attachment_index(FramebufferAttachment); -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); - - /** Checks the completeness of the framebuffer. Returns - FRAMEBUFFER_COMPLETE if the framebuffer is complete and can be rendered to, - 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 - and destination regions have different dimensions, the contents will be - stretched. If filter is true, linear interpolation will be used, otherwise - no interpolation is done. */ - void blit_from(const Framebuffer &other, int sx0, int sy0, int sx1, int sy1, - int dx0, int dy0, int dx1, int dy1, BufferBits bits, bool filter); - - /** Blits a region from another framebuffer into this one, retaining its - dimensions. */ - void blit_from(const Framebuffer & other, int sx, int sy, - unsigned wd, unsigned ht, int dx, int dy, BufferBits bits); - - /** Blits the entire contents of another framebuffer into this one. */ - void blit_from(const Framebuffer &other, BufferBits bits, bool filter); - - void bind() const; - - static const Framebuffer *current(); - static void unbind(); - - static Framebuffer &system(); -}; - -inline BufferBits operator|(BufferBits a, BufferBits b) -{ return static_cast(static_cast(a)|static_cast(b)); } - -} // namespace GL -} // namespace Msp - -#endif