X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Fframebuffer.h;h=275f516e8d4d3b22acca3393a48065cb5d5422fb;hb=715672cf2c64dab0744db676fdee255ee3a4cef7;hp=3054bd646b3e4d4709c4ee7ec8a96a5b20bdfa7a;hpb=7aaec9a70b8d7733429bec043f8e33e02956f266;p=libs%2Fgl.git diff --git a/source/core/framebuffer.h b/source/core/framebuffer.h index 3054bd64..275f516e 100644 --- a/source/core/framebuffer.h +++ b/source/core/framebuffer.h @@ -2,7 +2,6 @@ #define MSP_GL_FRAMEBUFFER_H_ #include -#include "bindable.h" #include "gl.h" #include "texturecube.h" #include @@ -17,6 +16,7 @@ class Renderbuffer; class Texture; class Texture2D; class Texture3D; +class WindowView; enum FramebufferAttachment { @@ -69,7 +69,7 @@ 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 +class Framebuffer { private: struct Attachment @@ -82,29 +82,19 @@ private: Texture *tex; }; unsigned level; - unsigned layer; + int layer; Attachment(FramebufferAttachment); void set(Renderbuffer &); - void set(Texture &, unsigned, unsigned); + void set(Texture &, unsigned, int); 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 FramebufferStatus status; mutable unsigned dirty; Framebuffer(unsigned); @@ -116,50 +106,34 @@ public: unsigned get_height() const { return height; } private: - void update_attachment(unsigned) const; + void update() const; void check_size(); unsigned get_attachment_index(FramebufferAttachment); + void set_texture_attachment(FramebufferAttachment, Texture &, unsigned, int); 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 attach_layered(FramebufferAttachment attch, Texture3D &tex, unsigned level = 0); + void attach_layered(FramebufferAttachment attch, TextureCube &tex, 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; + void resize(const WindowView &); + + /** Returns FRAMEBUFFER_COMPLETE if the framebuffer is complete and can be + rendered to, or one of the error status codes otherwise. */ + FramebufferStatus get_status() const { return status; } /** 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(); - 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 refresh() const { if(dirty) update(); } - void bind() const; + unsigned get_id() const { return id; } - static const Framebuffer *current(); - static void unbind(); + void set_debug_name(const std::string &); static Framebuffer &system(); };