- if(!cur_fbo)
- get(GL_VIEWPORT, sys_viewport);
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, id);
- cur_fbo = this;
- if(width && height)
- viewport(0, 0, width, height);
+ if(current()==this)
+ {
+ GLenum color_buf = GL_NONE;
+ bool has_depth = false;
+ for(unsigned i=0; i<attachments.size(); ++i)
+ {
+ const Attachment &attch = attachments[i];
+ if(mask&(1<<i))
+ {
+ if(attch.type==GL_RENDERBUFFER_EXT)
+ glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, attch.attachment, GL_RENDERBUFFER_EXT, attch.rbuf->get_id());
+ else if(attch.type==GL_TEXTURE_2D)
+ {
+ static_cast<Texture2D *>(attch.tex)->allocate(attch.level);
+ glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, attch.attachment, attch.type, attch.tex->get_id(), attch.level);
+ }
+ else
+ glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, attch.attachment, 0, 0);
+ }
+
+ if(attch.attachment>=COLOR_ATTACHMENT0 && attch.attachment<=COLOR_ATTACHMENT3)
+ color_buf = attch.attachment;
+ if(attch.attachment==DEPTH_ATTACHMENT)
+ has_depth = true;
+ }
+
+ glDrawBuffer(color_buf);
+ glDepthMask(has_depth);
+ }
+ else
+ dirty |= mask;
+}
+
+void Framebuffer::check_size()
+{
+ for(vector<Attachment>::iterator i=attachments.begin(); i!=attachments.end(); ++i)
+ if(i->type)
+ {
+ if(i->type==GL_RENDERBUFFER_EXT)
+ {
+ width = i->rbuf->get_width();
+ height = i->rbuf->get_height();
+ }
+ else if(i->type==GL_TEXTURE_2D)
+ {
+ Texture2D *tex = static_cast<Texture2D *>(i->tex);
+ width = tex->get_width();
+ height = tex->get_height();
+ }
+ if(current()==this)
+ glViewport(0, 0, width, height);
+ break;
+ }