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(); }