#ifndef MSP_GL_FRAMEBUFFER_H_
#define MSP_GL_FRAMEBUFFER_H_
+#include <vector>
+#include "bindable.h"
#include "gl.h"
-#include "types.h"
namespace Msp {
namespace GL {
class Renderbuffer;
+class Texture;
class Texture2D;
enum FramebufferAttachment
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
Requires the GL_EXT_framebuffer_object extension.
*/
-class Framebuffer
+class Framebuffer: public Bindable<Framebuffer>
{
private:
- uint id;
-
- static const Framebuffer *current;
+ struct Attachment
+ {
+ FramebufferAttachment attachment;
+ GLenum type;
+ union
+ {
+ Renderbuffer *rbuf;
+ Texture *tex;
+ };
+
+ Attachment(FramebufferAttachment);
+ Attachment &operator=(Renderbuffer &);
+ Attachment &operator=(Texture &);
+ };
+
+ unsigned id;
+ std::vector<Attachment> attachments;
+ unsigned width;
+ unsigned height;
+
+ static int sys_viewport[4];
public:
Framebuffer();
void attach(FramebufferAttachment attch, Renderbuffer &rbuf);
void attach(FramebufferAttachment attch, Texture2D &tex, int level);
+ void detach(FramebufferAttachment attch);
/**
Checks the completeness status of the framebuffer. Returns
static void unbind();
private:
void maybe_bind() const;
+ Attachment &get_or_create_attachment(FramebufferAttachment);
+ void check_size();
};
+inline BufferBits operator|(BufferBits a, BufferBits b)
+{ return static_cast<BufferBits>(static_cast<int>(a)|static_cast<int>(b)); }
+
+void viewport(int, int, unsigned, unsigned);
+void clear(BufferBits);
+void draw_buffer(RWBuffer);
+void read_buffer(RWBuffer);
+
} // namespace GL
} // namespace Msp