private Polygon readPolygon(StringTokenizer tokenizer) {
        List<Vertex> verticies = new java.util.ArrayList<Vertex>();
        while (tokenizer.hasMoreTokens()) {
            String token = tokenizer.nextToken();
            String vertex_tokens[] = token.split("/");
            ObjVertex geo, tex, norm;

            switch(vertex_tokens.length) {
                case 1:
                    /* Single number - lookup geo vertex only */
                    geo = geoVerticies.get(Integer.parseInt(vertex_tokens[0]) - 1); /* Obj files starts w/ vertex 1 */
                    verticies.add(new Vertex(geo.x, geo.y, geo.z));
                    break;
                case 2:
                    /* Two numbers - geo vertex, and texture coordinate */
                    geo = geoVerticies.get(Integer.parseInt(vertex_tokens[0]) - 1);
                    tex = textureverticies.get(Integer.parseInt(vertex_tokens[1]) - 1);
                    verticies.add(new Vertex(geo.x, geo.y, geo.z, tex.x, tex.y));
                    break;
                case 3:
                    /* geo vertex, texture coordinate and normal */
                    geo = geoVerticies.get(Integer.parseInt(vertex_tokens[0]) - 1);
                    tex = textureverticies.get(Integer.parseInt(vertex_tokens[1]) - 1);
                    norm = vertexNormals.get(Integer.parseInt(vertex_tokens[2]) - 1);
                    // TODO do something with vertex normals
                    verticies.add(new Vertex(geo.x, geo.y, geo.z, tex.x, tex.y, norm.x, norm.y, norm.z));
                    break;
                default:
                    throw new IllegalArgumentException("Malformed vertex token: " + token);
            }
        }
        Polygon p = new Polygon(currentMaterial, verticies);
        p.groups = currentGroups;
        p.object = currentObject;
        return p;
    }