void OpenGLGraphics::render_overlay(CoreOverlay* overlay) {
    if (!overlay->visible()) {
        return;
    }
    
    float x = overlay->corner_x();
    float y = overlay->corner_y(); 
    
    // Now translate to the top-left corner of the overlay, and render
    // the text and background image
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glTranslatef(x, y, 0.0f);
    
    // Render the background as a single quad
    OpenGLTexture* background = static_cast<OpenGLTexture*>(overlay->background());
    if (background) {
        background->sampler(0);        
        glBegin(GL_QUADS);
        glTexCoord2f(0.0f, 0.0f);
        glVertex2f(0.0f, 0.0f);
        glTexCoord2f(1.0f, 0.0f);
        glVertex2f(overlay->width(), 0.0f);
        glTexCoord2f(1.0f, 1.0f);
        glVertex2f(overlay->width(), overlay->height());
        glTexCoord2f(0.0f, 1.0f);
        glVertex2f(0.0f, overlay->height());    
        glEnd();
    }
    
    // Now render the text
    OpenGLFont* font = static_cast<OpenGLFont*>(overlay->font());
    if (!overlay->text().empty() && font) {
        glColor4fv(overlay->text_color());
        glPushMatrix();
        glTranslatef(0, (float)font->height(), 0);
        font->render(overlay->text());
        glPopMatrix();
    }
    
    // Render all the children
    for (Iterator<CoreOverlayPtr> i = overlay->children(); i; i++) {
        render_overlay(i->get());
    }
    
    glPopMatrix();
}
void OpenGLGraphics::render_visible_quad_sets() {
	OpenGLTexture* texture = 0;

	glDisable(GL_LIGHTING);
	glDisable(GL_CULL_FACE);
	glEnable(GL_BLEND);
	glEnable(GL_TEXTURE_2D);
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
	glColor3f(1.0f, 1.0f, 1.0f);


	// Render all quad sets
	for (vector<CoreQuadSetPtr>::iterator i = quad_sets_.begin(); i != quad_sets_.end(); i++) {
		// Switch textures if necessary
		CoreQuadSet* quad_set = i->get();
		OpenGLTexture* next_texture = static_cast<OpenGLTexture*>(quad_set->texture());
		if (texture != next_texture) {
			texture = next_texture;
			texture->sampler(TS_DIFFUSE);
		}

		// Transform the modelview an dtexture matrics
		glMatrixMode(GL_MODELVIEW);
		glPushMatrix();
		glMultMatrixf(quad_set->parent()->matrix());

		glBegin(GL_QUADS);
		for (size_t i = 0; i < quad_set->vertex_count(); i++) {
			const Vertex& v = quad_set->vertex_data()[i];
			glNormal3fv(v.normal);
			glTexCoord2fv(v.texcoord);
			glVertex3fv(v.position);
		}
		glEnd();

		// Set the matrix mode
		glMatrixMode(GL_MODELVIEW);
		glPopMatrix();
	}

	glEnable(GL_LIGHTING);
	glEnable(GL_CULL_FACE);
	glDisable(GL_TEXTURE_2D);
	glDisable(GL_BLEND);
	
}