void ProcessTokens(string[] tokens)
        {
            switch (tokens[0].ToLower())
            {
            case "o":
                meshName = tokens[1];
                break;

            case "v":
                coords.Add(ParseCoord(tokens));
                break;

            case "vt":
            {
                uvs.Add(ParseUVCoord(tokens));
                break;
            }

            case "vn":
                normals.Add(ParseCoord(tokens));
                break;

            case "g":

                MakePrimFace();

                break;

            case "s":
                break;

            case "f":

                int[] vertIndices = new int[3];

                for (int vertexIndex = 1; vertexIndex <= 3; vertexIndex++)
                {
                    string[] indices = tokens[vertexIndex].Split('/');

                    int positionIndex = int.Parse(indices[0],
                                                  CultureInfo.InvariantCulture) - 1;

                    int texCoordIndex = -1;
                    int normalIndex   = -1;

                    if (indices.Length > 1)
                    {
                        if (int.TryParse(indices[1], NumberStyles.Integer, CultureInfo.InvariantCulture, out texCoordIndex))
                        {
                            texCoordIndex--;
                        }
                        else
                        {
                            texCoordIndex = -1;
                        }
                    }

                    if (indices.Length > 2)
                    {
                        if (int.TryParse(indices[1], NumberStyles.Integer, CultureInfo.InvariantCulture, out normalIndex))
                        {
                            normalIndex--;
                        }
                        else
                        {
                            normalIndex = -1;
                        }
                    }

                    int hash = hashInts(positionIndex, texCoordIndex, normalIndex);

                    if (viewerVertexLookup.ContainsKey(hash))
                    {
                        vertIndices[vertexIndex - 1] = viewerVertexLookup[hash];
                    }
                    else
                    {
                        ViewerVertex vv = new ViewerVertex();
                        vv.v = coords[positionIndex];
                        if (normalIndex > -1)
                        {
                            vv.n = normals[normalIndex];
                        }
                        if (texCoordIndex > -1)
                        {
                            vv.uv = uvs[texCoordIndex];
                        }
                        faceVertices.Add(vv);
                        vertIndices[vertexIndex - 1] = viewerVertexLookup[hash] = faceVertices.Count - 1;
                    }
                }

                facePolygons.Add(new ViewerPolygon(vertIndices[0], vertIndices[1], vertIndices[2]));
                break;

            case "mtllib":
                break;

            case "usemtl":
                break;
            }
        }
        private void ProcessTokens(string[] tokens)
        {
            switch (tokens[0].ToLower())
            {
                case "o":
                    meshName = tokens[1];
                    break;

                case "v":
                    coords.Add(ParseCoord(tokens));
                    break;

                case "vt":
                    {
                        uvs.Add(ParseUVCoord(tokens));
                        break;
                    }

                case "vn":
                    normals.Add(ParseCoord(tokens));
                    break;

                case "g":

                    MakePrimFace();

                    break;

                case "s":
                    break;

                case "f":

                    int[] vertIndices = new int[3];

                    for (int vertexIndex = 1; vertexIndex <= 3; vertexIndex++)
                    {
                        string[] indices = tokens[vertexIndex].Split('/');

                        int positionIndex = int.Parse(indices[0],
                            CultureInfo.InvariantCulture) - 1;

                        int texCoordIndex = -1;
                        int normalIndex = -1;

                        if (indices.Length > 1)
                        {

                            if (int.TryParse(indices[1], System.Globalization.NumberStyles.Integer, CultureInfo.InvariantCulture, out texCoordIndex))
                                texCoordIndex--;
                            else texCoordIndex = -1;

                        }

                        if (indices.Length > 2)
                        {
                            if (int.TryParse(indices[1], System.Globalization.NumberStyles.Integer, CultureInfo.InvariantCulture, out normalIndex))
                                normalIndex--;
                            else normalIndex = -1;
                        }

                        int hash = hashInts(positionIndex, texCoordIndex, normalIndex);

                        if (viewerVertexLookup.ContainsKey(hash))
                            vertIndices[vertexIndex - 1] = viewerVertexLookup[hash];
                        else
                        {
                            ViewerVertex vv = new ViewerVertex();
                            vv.v = coords[positionIndex];
                            if (normalIndex > -1)
                                vv.n = normals[normalIndex];
                            if (texCoordIndex > -1)
                                vv.uv = uvs[texCoordIndex];
                            faceVertices.Add(vv);
                            vertIndices[vertexIndex - 1] = viewerVertexLookup[hash] = faceVertices.Count - 1;
                        }
                    }

                    facePolygons.Add(new ViewerPolygon(vertIndices[0], vertIndices[1], vertIndices[2]));
                    break;

                case "mtllib":
                    break;

                case "usemtl":
                    break;

                default:
                    break;
            }
        }