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
38 get(GL_VIEWPORT, sys_viewport);
39 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, id);
42 viewport(0, 0, width, height);
45 void Framebuffer::attach(FramebufferAttachment attch, Renderbuffer &rbuf)
48 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, attch, GL_RENDERBUFFER_EXT, rbuf.get_id());
49 get_or_create_attachment(attch)=rbuf;
53 void Framebuffer::attach(FramebufferAttachment attch, Texture2D &tex, int level)
56 glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, attch, tex.get_target(), tex.get_id(), level);
57 get_or_create_attachment(attch)=tex;
61 void Framebuffer::detach(FramebufferAttachment attch)
64 for(vector<Attachment>::iterator i=attachments.begin(); i!=attachments.end(); ++i)
65 if(i->attachment==attch)
67 if(i->type==GL_RENDERBUFFER_EXT)
68 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, attch, GL_RENDERBUFFER_EXT, 0);
69 else if(i->type==GL_TEXTURE_2D)
70 glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, attch, GL_TEXTURE_2D, 0, 0);
77 FramebufferStatus Framebuffer::check_status() const
80 return static_cast<FramebufferStatus>(glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT));
83 const Framebuffer *Framebuffer::current()
88 void Framebuffer::unbind()
92 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
94 viewport(sys_viewport[0], sys_viewport[1], sys_viewport[2], sys_viewport[3]);
98 void Framebuffer::maybe_bind() const
104 Framebuffer::Attachment &Framebuffer::get_or_create_attachment(FramebufferAttachment attch)
106 for(vector<Attachment>::iterator i=attachments.begin(); i!=attachments.end(); ++i)
107 if(i->attachment==attch)
109 attachments.push_back(Attachment(attch));
110 return attachments.back();
113 void Framebuffer::check_size()
115 if(!attachments.empty())
117 const Attachment &attch=attachments.front();
118 if(attch.type==GL_RENDERBUFFER_EXT)
120 width=attch.rbuf->get_width();
121 height=attch.rbuf->get_height();
123 else if(attch.type==GL_TEXTURE_2D)
125 Texture2D *tex=static_cast<Texture2D *>(attch.tex);
126 width=tex->get_width();
127 height=tex->get_height();
130 viewport(0, 0, width, height);
134 const Framebuffer *Framebuffer::cur_fbo=0;
135 int Framebuffer::sys_viewport[4]={ 0, 0, 1, 1 };
138 Framebuffer::Attachment::Attachment(FramebufferAttachment a):
143 Framebuffer::Attachment &Framebuffer::Attachment::operator=(Renderbuffer &r)
145 type=GL_RENDERBUFFER_EXT;
150 Framebuffer::Attachment &Framebuffer::Attachment::operator=(Texture &t)
158 void viewport(int x, int y, unsigned w, unsigned h)
160 glViewport(x, y, w, h);
163 void clear(BufferBits bits)
168 void draw_buffer(RWBuffer buf)
173 void read_buffer(RWBuffer buf)