]> git.tdb.fi Git - libs/gl.git/blobdiff - source/framebuffer.h
Rewrite Framebuffer to defer attach/detach operations until bound
[libs/gl.git] / source / framebuffer.h
index 8563d2f98418d0f315720a9e4b734a3dc6c58817..514208d6db161fd3635f39538760bc6435160b94 100644 (file)
@@ -8,13 +8,15 @@ Distributed under the LGPL
 #ifndef MSP_GL_FRAMEBUFFER_H_
 #define MSP_GL_FRAMEBUFFER_H_
 
-#include <GL/gl.h>
-#include "types.h"
+#include <vector>
+#include "bindable.h"
+#include "gl.h"
 
 namespace Msp {
 namespace GL {
 
 class Renderbuffer;
+class Texture;
 class Texture2D;
 
 enum FramebufferAttachment
@@ -39,6 +41,28 @@ enum FramebufferStatus
        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
@@ -50,21 +74,44 @@ least one image must be attached for the framebuffer to be usable.
 
 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;
+               };
+               int level;
+
+               Attachment(FramebufferAttachment);
+               void set(Renderbuffer &);
+               void set(Texture &, int);
+               void clear();
+       };
+
+       unsigned id;
+       std::vector<Attachment> attachments;
+       unsigned width;
+       unsigned height;
+       mutable unsigned dirty;
+
+       Framebuffer(unsigned);
 public:
        Framebuffer();
        ~Framebuffer();
 
-       void bind() const;
-
+private:
+       void update_attachment(unsigned) const;
+       void check_size();
+public:
        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
@@ -73,11 +120,24 @@ public:
        */
        FramebufferStatus check_status() const;
 
+       void clear(BufferBits);
+
+       void bind() const;
+
+       static const Framebuffer *current();
        static void unbind();
+
+       static Framebuffer &system();
 private:
-       void maybe_bind() const;
+       unsigned get_attachment_index(FramebufferAttachment);
+
+public:
+       
 };
 
+inline BufferBits operator|(BufferBits a, BufferBits b)
+{ return static_cast<BufferBits>(static_cast<int>(a)|static_cast<int>(b)); }
+
 } // namespace GL
 } // namespace Msp