void Framebuffer::bind() const
{
- if(!cur_fbo)
- get(GL_VIEWPORT, sys_viewport);
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, id);
- cur_fbo = this;
- if(width && height)
- viewport(0, 0, width, height);
+ const Framebuffer *old = current();
+ if(set_current(this))
+ {
+ if(!old)
+ get(GL_VIEWPORT, sys_viewport);
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, id);
+ if(width && height)
+ viewport(0, 0, width, height);
+ }
}
void Framebuffer::attach(FramebufferAttachment attch, Renderbuffer &rbuf)
{
- maybe_bind();
+ bind();
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, attch, GL_RENDERBUFFER_EXT, rbuf.get_id());
get_or_create_attachment(attch) = rbuf;
check_size();
void Framebuffer::attach(FramebufferAttachment attch, Texture2D &tex, int level)
{
- maybe_bind();
+ bind();
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, attch, tex.get_target(), tex.get_id(), level);
get_or_create_attachment(attch) = tex;
check_size();
void Framebuffer::detach(FramebufferAttachment attch)
{
- maybe_bind();
+ bind();
for(vector<Attachment>::iterator i=attachments.begin(); i!=attachments.end(); ++i)
if(i->attachment==attch)
{
FramebufferStatus Framebuffer::check_status() const
{
- maybe_bind();
+ bind();
return static_cast<FramebufferStatus>(glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT));
}
-const Framebuffer *Framebuffer::current()
-{
- return cur_fbo;
-}
-
void Framebuffer::unbind()
{
- if(cur_fbo)
+ if(set_current(0))
{
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
- cur_fbo = 0;
viewport(sys_viewport[0], sys_viewport[1], sys_viewport[2], sys_viewport[3]);
}
}
-void Framebuffer::maybe_bind() const
-{
- if(cur_fbo!=this)
- bind();
-}
-
Framebuffer::Attachment &Framebuffer::get_or_create_attachment(FramebufferAttachment attch)
{
for(vector<Attachment>::iterator i=attachments.begin(); i!=attachments.end(); ++i)
width = tex->get_width();
height = tex->get_height();
}
- if(cur_fbo==this)
+ if(current()==this)
viewport(0, 0, width, height);
}
}
-const Framebuffer *Framebuffer::cur_fbo = 0;
int Framebuffer::sys_viewport[4] = { 0, 0, 1, 1 };