void wxBFXCanvas::setSelectionBuffer()
{
if(m_SBO != 0) // delete current selection buffer if it exists
{
glDeleteFramebuffers(1, &m_SBO);
glDeleteRenderbuffers(1, &m_SBODepth);
glDeleteRenderbuffers(1, &m_SBOPixels);
m_SBO = 0;
}
// create depth renderbuffer
glGenRenderbuffers(1, &m_SBODepth);
glBindRenderbuffer(GL_RENDERBUFFER, m_SBODepth);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, m_CanvasWidth, m_CanvasHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_SBODepth);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
// create pixel renderbuffer
glGenRenderbuffers(1, &m_SBOPixels);
glBindRenderbuffer(GL_RENDERBUFFER, m_SBOPixels);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB, m_CanvasWidth, m_CanvasHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_SBOPixels);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
// create framebuffer object
glGenFramebuffers(1, &m_SBO);
glBindFramebuffer(GL_FRAMEBUFFER, m_SBO);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_SBOPixels);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_SBODepth);
// Check that things seem to have worked so far
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE)
{
wxMessageBox(_T("Selection buffer creation failed"),_T("Oops, Bad Cr*p...."));
glBindFramebuffer(GL_FRAMEBUFFER, 0);
m_SBODirty = false;
m_SBO = 0;
return;
}
glBindFramebufferEXT(GL_FRAMEBUFFER, 0);
m_SBODirty = false;
Refresh(false); // force a screen refresh
}