Example #1
0
void drawHierarchicalObjects(std::vector<Shape*> shapes) {
    
    if (shapes.size() == 0) return;
    
    glPushMatrix();
    for(std::vector<Shape*>::iterator itr = shapes.begin(); itr != shapes.end(); ++itr) {
        Shape * s = *itr;
        
        glPushMatrix();
        glTranslated(s->getOffset()[0], s->getOffset()[1], 0);    // children should take on the parent's position, not the scale
        
        /* draw any render text in the shape */
        std::vector<RenderText*> renderTexts = s->getRenderTexts();
        for (std::vector<RenderText*>::iterator itrText = renderTexts.begin(); itrText != renderTexts.end(); itrText++) {
            RenderText * rt = *itrText;
            glColor3f(rt->getColor()[0], rt->getColor()[1], rt->getColor()[2]);
            glPushMatrix();
            
            glTranslated(rt->getOffset()[0], rt->getOffset()[1], rt->getOffset()[2]);
            glScaled(rt->getScaling()[0], rt->getScaling()[1], rt->getScaling()[2]);
            
            for(int i = 0; i < rt->getText().size(); i++) {
                glTranslated(10, 0.0, 0.0); // extra space between the letters so its more readable
                glutStrokeCharacter(GLUT_STROKE_ROMAN,  rt->getText().at(i));
            }
            glPopMatrix();
            
            glPushMatrix();
            drawHierarchicalObjects(rt->getChildren());
            glPopMatrix();
            
        }
        
        glPushMatrix();
        glScaled(s->getScaling()[0], s->getScaling()[1], 0);
        glColor3f(s->getColor()[0], s->getColor()[1], s->getColor()[2]);
        glBegin(s->shapeType);
        
        std::vector<Vertex3> vertices = s->getVerticies();
        for(std::vector<Vertex3>::iterator iterVertices = vertices.begin();
            iterVertices != vertices.end();
            ++iterVertices)
        {
            Vertex3 v = *iterVertices;
            glVertex3f(v.getX(), v.getY(), v.getZ());
        }
        glEnd();
        glPopMatrix();
        
        drawHierarchicalObjects(s->getChildren());
        glPopMatrix();
        
    }
    
    glPopMatrix();
    
}