+/* $Id$
+
+This file is part of libmspgl
+Copyright © 2007 Mikko Rasa, Mikkosoft Productions
+Distributed under the LGPL
+*/
+
+#ifndef MSP_GL_FRAMEBUFFER_H_
+#define MSP_GL_FRAMEBUFFER_H_
+
+#include "types.h"
+
+namespace Msp {
+namespace GL {
+
+class Renderbuffer;
+class Texture2D;
+
+enum FramebufferAttachment
+{
+ COLOR_ATTACHMENT0 = GL_COLOR_ATTACHMENT0_EXT,
+ COLOR_ATTACHMENT1 = GL_COLOR_ATTACHMENT1_EXT,
+ COLOR_ATTACHMENT2 = GL_COLOR_ATTACHMENT2_EXT,
+ COLOR_ATTACHMENT3 = GL_COLOR_ATTACHMENT3_EXT,
+ DEPTH_ATTACHMENT = GL_DEPTH_ATTACHMENT_EXT,
+ STENCIL_ATTACHMENT = GL_STENCIL_ATTACHMENT_EXT
+};
+
+enum FramebufferStatus
+{
+ FRAMEBUFFER_INCOMPLETE_ATTACHMENT = GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT,
+ FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT,
+ 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_EXT,
+ FRAMEBUFFER_INCOMPLETE_READ_BUFFER = GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT,
+ FRAMEBUFFER_UNSUPPORTED = GL_FRAMEBUFFER_UNSUPPORTED_EXT,
+ FRAMEBUFFER_COMPLETE = GL_FRAMEBUFFER_COMPLETE_EXT
+};
+
+/**
+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.
+*/
+class Framebuffer
+{
+private:
+ uint id;
+
+ static const Framebuffer *current;
+
+public:
+ Framebuffer();
+ ~Framebuffer();
+
+ void bind() const;
+
+ void attach(FramebufferAttachment attch, Renderbuffer &rbuf);
+ void attach(FramebufferAttachment attch, Texture2D &tex, int level);
+
+ /**
+ Checks the completeness status of the framebuffer. Returns
+ FRAMEBUFFER_COMPLETE if the framebuffer is complate and can be rendered to,
+ or one of the error status codes otherwise.
+ */
+ FramebufferStatus check_status() const;
+
+ static void unbind();
+private:
+ void maybe_bind() const;
+};
+
+} // namespace GL
+} // namespace Msp
+
+#endif