]> git.tdb.fi Git - libs/gl.git/blob - source/framebuffer.h
Comment updates for texture and framebuffer classes.
[libs/gl.git] / source / framebuffer.h
1 #ifndef MSP_GL_FRAMEBUFFER_H_
2 #define MSP_GL_FRAMEBUFFER_H_
3
4 #include <vector>
5 #include "bindable.h"
6 #include "gl.h"
7 #include "texturecube.h"
8
9 namespace Msp {
10 namespace GL {
11
12 class Renderbuffer;
13 class Texture;
14 class Texture2D;
15
16 enum FramebufferAttachment
17 {
18         COLOR_ATTACHMENT0  = GL_COLOR_ATTACHMENT0_EXT,
19         COLOR_ATTACHMENT1  = GL_COLOR_ATTACHMENT1_EXT,
20         COLOR_ATTACHMENT2  = GL_COLOR_ATTACHMENT2_EXT,
21         COLOR_ATTACHMENT3  = GL_COLOR_ATTACHMENT3_EXT,
22         DEPTH_ATTACHMENT   = GL_DEPTH_ATTACHMENT_EXT,
23         STENCIL_ATTACHMENT = GL_STENCIL_ATTACHMENT_EXT
24 };
25
26 enum FramebufferStatus
27 {
28         FRAMEBUFFER_INCOMPLETE_ATTACHMENT         = GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT,
29         FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT,
30         FRAMEBUFFER_INCOMPLETE_DIMENSIONS         = GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT,
31         FRAMEBUFFER_INCOMPLETE_FORMATS            = GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT,
32         FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER        = GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT,
33         FRAMEBUFFER_INCOMPLETE_READ_BUFFER        = GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT,
34         FRAMEBUFFER_UNSUPPORTED                   = GL_FRAMEBUFFER_UNSUPPORTED_EXT,
35         FRAMEBUFFER_COMPLETE                      = GL_FRAMEBUFFER_COMPLETE_EXT
36 };
37
38 enum BufferBits
39 {
40         COLOR_BUFFER_BIT   = GL_COLOR_BUFFER_BIT,
41         DEPTH_BUFFER_BIT   = GL_DEPTH_BUFFER_BIT,
42         STENCIL_BUFFER_BIT = GL_STENCIL_BUFFER_BIT,
43         ACCUM_BUFFER_BIT   = GL_ACCUM_BUFFER_BIT
44 };
45
46 enum RWBuffer
47 {
48         NO_BUFFER      = GL_NONE,
49         FRONT_LEFT     = GL_FRONT_LEFT,
50         FRONT_RIGHT    = GL_FRONT_RIGHT,
51         BACK_LEFT      = GL_BACK_LEFT,
52         BACK_RIGHT     = GL_BACK_RIGHT,
53         FRONT          = GL_FRONT,
54         BACK           = GL_BACK,
55         LEFT           = GL_LEFT,
56         RIGHT          = GL_RIGHT,
57         FRONT_AND_BACK = GL_FRONT_AND_BACK
58 };
59
60 /**
61 Framebuffer objects can be used to perform offscreen rendering.  The most
62 common application is rendering to a texture, which can then be used for
63 fullscreen shader effects.
64
65 A framebuffer consist of a number of logical buffers, such as color and depth
66 buffers.  Renderbuffers and Textures can be attached to the logical buffers.  At
67 least one image must be attached for the framebuffer to be usable.
68
69 Requires the GL_EXT_framebuffer_object extension.  The blit functions require
70 the GL_EXT_framebuffer_blit extension.
71 */
72 class Framebuffer: public Bindable<Framebuffer>
73 {
74 private:
75         struct Attachment
76         {
77                 FramebufferAttachment attachment;
78                 GLenum type;
79                 union
80                 {
81                         Renderbuffer *rbuf;
82                         Texture *tex;
83                 };
84                 unsigned level;
85                 GLenum cube_face;
86
87                 Attachment(FramebufferAttachment);
88                 void set(Renderbuffer &);
89                 void set(Texture &, GLenum, unsigned);
90                 void clear();
91         };
92
93         unsigned id;
94         std::vector<Attachment> attachments;
95         unsigned width;
96         unsigned height;
97         mutable unsigned dirty;
98
99         Framebuffer(unsigned);
100 public:
101         Framebuffer();
102         ~Framebuffer();
103
104         unsigned get_width() const { return width; }
105         unsigned get_height() const { return height; }
106
107 private:
108         void update_attachment(unsigned) const;
109         void check_size();
110 public:
111         void attach(FramebufferAttachment attch, Renderbuffer &rbuf);
112         void attach(FramebufferAttachment attch, Texture2D &tex, unsigned level = 0);
113         void attach(FramebufferAttachment attch, TextureCube &tex, TextureCubeFace face, unsigned level = 0);
114         void detach(FramebufferAttachment attch);
115
116         /** Checks the completeness of the framebuffer.  Returns
117         FRAMEBUFFER_COMPLETE if the framebuffer is complete and can be rendered to,
118         or one of the error status codes otherwise. */
119         FramebufferStatus check_status() const;
120
121         void clear(BufferBits);
122
123         /** Blits a region from another framebuffer into this one.  If the source
124         and destination regions have different dimensions, the contents will be
125         stretched.  If filter is true, linear interpolation will be used, otherwise
126         no interpolation is done. */
127         void blit_from(const Framebuffer &other, int sx0, int sy0, int sx1, int sy1,
128                 int dx0, int dy0, int dx1, int dy1, BufferBits bits, bool filter);
129
130         /** Blits a region from another framebuffer into this one, retaining its
131         dimensions. */
132         void blit_from(const Framebuffer & other, int sx, int sy,
133                 unsigned wd, unsigned ht, int dx, int dy, BufferBits bits);
134
135         /** Blits the entire contents of another framebuffer into this one. */
136         void blit_from(const Framebuffer &other, BufferBits bits, bool filter);
137
138         void bind() const;
139
140         static const Framebuffer *current();
141         static void unbind();
142
143         static Framebuffer &system();
144 private:
145         unsigned get_attachment_index(FramebufferAttachment);
146 };
147
148 inline BufferBits operator|(BufferBits a, BufferBits b)
149 { return static_cast<BufferBits>(static_cast<int>(a)|static_cast<int>(b)); }
150
151 } // namespace GL
152 } // namespace Msp
153
154 #endif