3 This file is part of libmspgl
4 Copyright © 2007 Mikko Rasa, Mikkosoft Productions
5 Distributed under the LGPL
9 #include "ext_framebuffer_object.h"
10 #include "framebuffer.h"
12 #include "renderbuffer.h"
13 #include "texture2d.h"
20 Framebuffer::Framebuffer():
24 static RequireExtension _ext("GL_EXT_framebuffer_object");
26 glGenFramebuffersEXT(1, &id);
30 Framebuffer::~Framebuffer()
32 glDeleteFramebuffersEXT(1, &id);
35 void Framebuffer::bind() const
37 const Framebuffer *old = current();
41 get(GL_VIEWPORT, sys_viewport);
42 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, id);
44 viewport(0, 0, width, height);
48 void Framebuffer::attach(FramebufferAttachment attch, Renderbuffer &rbuf)
51 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, attch, GL_RENDERBUFFER_EXT, rbuf.get_id());
52 get_or_create_attachment(attch) = rbuf;
56 void Framebuffer::attach(FramebufferAttachment attch, Texture2D &tex, int level)
59 glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, attch, tex.get_target(), tex.get_id(), level);
60 get_or_create_attachment(attch) = tex;
64 void Framebuffer::detach(FramebufferAttachment attch)
67 for(vector<Attachment>::iterator i=attachments.begin(); i!=attachments.end(); ++i)
68 if(i->attachment==attch)
70 if(i->type==GL_RENDERBUFFER_EXT)
71 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, attch, GL_RENDERBUFFER_EXT, 0);
72 else if(i->type==GL_TEXTURE_2D)
73 glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, attch, GL_TEXTURE_2D, 0, 0);
80 FramebufferStatus Framebuffer::check_status() const
83 return static_cast<FramebufferStatus>(glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT));
86 void Framebuffer::unbind()
90 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
91 viewport(sys_viewport[0], sys_viewport[1], sys_viewport[2], sys_viewport[3]);
95 Framebuffer::Attachment &Framebuffer::get_or_create_attachment(FramebufferAttachment attch)
97 for(vector<Attachment>::iterator i=attachments.begin(); i!=attachments.end(); ++i)
98 if(i->attachment==attch)
100 attachments.push_back(Attachment(attch));
101 return attachments.back();
104 void Framebuffer::check_size()
106 if(!attachments.empty())
108 const Attachment &attch = attachments.front();
109 if(attch.type==GL_RENDERBUFFER_EXT)
111 width = attch.rbuf->get_width();
112 height = attch.rbuf->get_height();
114 else if(attch.type==GL_TEXTURE_2D)
116 Texture2D *tex = static_cast<Texture2D *>(attch.tex);
117 width = tex->get_width();
118 height = tex->get_height();
121 viewport(0, 0, width, height);
125 int Framebuffer::sys_viewport[4] = { 0, 0, 1, 1 };
128 Framebuffer::Attachment::Attachment(FramebufferAttachment a):
133 Framebuffer::Attachment &Framebuffer::Attachment::operator=(Renderbuffer &r)
135 type = GL_RENDERBUFFER_EXT;
140 Framebuffer::Attachment &Framebuffer::Attachment::operator=(Texture &t)
142 type = t.get_target();
148 void viewport(int x, int y, unsigned w, unsigned h)
150 glViewport(x, y, w, h);
153 void clear(BufferBits bits)
158 void draw_buffer(RWBuffer buf)
163 void read_buffer(RWBuffer buf)