void drawParts(vector<Part*> Parts) { for(int i = 0; i < Parts.size(); i++) { Part *p = Parts[i]; if (p->isVisible) { glMaterialfv(GL_FRONT, GL_AMBIENT, p->getMaterialAmbient()); glMaterialfv(GL_FRONT, GL_SPECULAR, p->getMaterialSpecular()); glMaterialfv(GL_FRONT, GL_DIFFUSE, p->getMaterialDiffuse()); glMaterialfv(GL_FRONT, GL_SHININESS, p->getMaterialShininess()); glPushMatrix(); for (std::vector<PartTransformation>::reverse_iterator rit = p->Transformations.rbegin(); rit != p->Transformations.rend(); ++rit) { PartTransformation op = *rit; switch(op.getOpType()) { case OP_ROTATE: glRotatef(op.getValues()[0], op.getValues()[1], op.getValues()[2], op.getValues()[3]); break; case OP_SCALE: glScalef(op.getValues()[0], op.getValues()[1], op.getValues()[2]); break; case OP_TRANSLATE: glTranslatef(op.getValues()[0], op.getValues()[1], op.getValues()[2]); break; } } // start texturing if necessary if (p->isTextured()) { glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, p->getTextureId()); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glTexCoordPointer(2, GL_FLOAT, 0, p->getTextureMap()); } glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_VERTEX_ARRAY); glNormalPointer(GL_FLOAT, 0, p->getMesh()->getNormals()); glVertexPointer(NUM_POINTS_PER_VERTEX, GL_FLOAT, 0, p->getMesh()->getVerticies()); glDrawArrays(GL_QUADS, 0, p->getMesh()->getNumVerticiesTotal()); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_NORMAL_ARRAY); // clean up texturing if we started it if (p->isTextured()) { glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisable(GL_TEXTURE_2D); } if (p->getChildCount() > 0) { drawParts(p->getChildren()); } glPopMatrix(); } } }