class Texture;
class Texture2D;
class Texture3D;
+class WindowView;
enum FramebufferAttachment
{
Requires the GL_EXT_framebuffer_object extension. The blit functions require
the GL_EXT_framebuffer_blit extension.
*/
-class Framebuffer: public Bindable<Framebuffer>
+class Framebuffer
{
private:
struct Attachment
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<Attachment> attachments;
unsigned width;
unsigned height;
- Viewport view;
+ mutable FramebufferStatus status;
mutable unsigned dirty;
Framebuffer(unsigned);
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();
};