void ObjMeshRender::renderGroupEdges(const char * groupName) { //get the group string name(groupName); ObjMesh::Group group = mesh->getGroup(name); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glEnable(GL_POLYGON_OFFSET_LINE); glPolygonOffset(1.0, 1.0); for( unsigned int iFace = 0; iFace < group.getNumFaces(); ++iFace ) { ObjMesh::Face face = group.getFace(iFace); glBegin(GL_POLYGON); for( unsigned int iVertex = 0; iVertex < face.getNumVertices(); ++iVertex ) { const ObjMesh::Vertex * vertexHandle = face.getVertexHandle(iVertex); Vec3d v = mesh->getPosition(*vertexHandle); glVertex3d(v[0], v[1], v[2]); } glEnd(); } glDisable(GL_POLYGON_OFFSET_LINE); }
ObjMesh * ObjMeshOrientable::GenerateOrientedMesh() { ObjMesh * outputObjMesh = new ObjMesh(*objMesh); for(unsigned int i=0; i < outputObjMesh->getNumGroups(); i++) // over all groups { ObjMesh::Group * groupHandle = (ObjMesh::Group*) outputObjMesh->getGroupHandle(i); for (unsigned int j=0; j < groupHandle->getNumFaces(); j++) // over all faces { const ObjMesh::Face * face = groupHandle->getFaceHandle(j); if (face->getNumVertices() < 3) { printf("Warning: encountered a face with fewer than 3 vertices.\n"); continue; } HalfEdge edge = edgeAtFace(i, j); // loop until edge is first edge unsigned int startPosition = face->getVertex(0).getPositionIndex(); while (edgeStartVertex(edge).getPositionIndex() != startPosition) edge = edgeNext(edge); // reverse the face if not correctly oriented if (edgeEndVertex(edge).getPositionIndex() != face->getVertex(1).getPositionIndex()) groupHandle->reverseFace(j); } } return outputObjMesh; }