Exemple #1
0
        private bool loadMeshFaces(Mesh mesh)
        {
            bool success = true;
            int nextToken = 0;
            int f, i;
            bool haveNext = false;

            readBlockStart();

            while (haveNext || (nextToken = scanner.yylex()) != (int)TokenType.BlockEnd)
            {
                if (nextToken != (int)TokenType.Node)
                {
                    Console.Error.WriteLine("Expected a node" + " - " + scanner.yytext);
                }
                haveNext = false;

                string str = scanner.yytext;
                if (str.Equals("*MESH_FACE"))
                {
                    string index;
                    if (!readIndex(out index))
                    {
                        success = false;
                        continue;
                    }
                    f = int.Parse(index);
                    if (f >= mesh.faceCount)
                        Console.Error.WriteLine("File referred to a non-existent face ({0} >= {1})", f, mesh.faces.Count);

                    Face face = mesh.faces[f];
                    face.vertex = new int[3];

                    for (i = 0; i < 3; i++)
                    {
                        if (!readIndex()) success = false;
                        if (!readInt(out face.vertex[i])) success = false;
                    }
                    if (!readIndex()) success = false;
                    if (!readInt(out face.ab)) success = false;
                    if (!readIndex()) success = false;
                    if (!readInt(out face.bc)) success = false;
                    if (!readIndex()) success = false;
                    if (!readInt(out face.ca)) success = false;
                    mesh.faces[f] = face;
                }
                else
                {
                    if ((nextToken = skip()) == (int)TokenType.BlockEnd || nextToken < 1) break;
                    haveNext = true;
                }
            }
            return success;
        }
Exemple #2
0
        private bool loadMeshNormals(Mesh mesh)
        {
            bool success = true;
            int nextToken = 0;
            int i;
            bool haveNext = false;

            readBlockStart();

            while (haveNext || (nextToken = scanner.yylex()) != (int)TokenType.BlockEnd)
            {
                if (nextToken != (int)TokenType.Node)
                {
                    Console.Error.WriteLine("Expected a node");
                }
                haveNext = false;

                if (scanner.yytext.Equals("*MESH_FACENORMAL"))
                {
                    if (!readInt(out i))
                    {
                        success = false;
                        continue;
                    }
                    if (i >= mesh.faceCount)
                    {
                        Console.Error.WriteLine("File referred to a non-existent face");
                        success = false;
                        continue;
                    }

                    Face face = mesh.faces[i];
                    if (!readVector3D(out face.faceNormal)) success = false;
                    mesh.faces[i] = face;
                }
                else if (scanner.yytext.Equals("*MESH_VERTEXNORMAL"))
                {
                    if (!readInt(out i))
                    {
                        success = false;
                        continue;
                    }
                    if (i >= mesh.vertexCount)
                    {
                        Console.Error.WriteLine("File referred to a non-existent vertex");
                        success = false;
                        continue;
                    }

                    Vector3D normal = mesh.vertexNormals[i];
                    if (!readVector3D(out normal)) success = false;
                    mesh.vertexNormals[i] = normal;
                }
                else
                {
                    if ((nextToken = skip()) == (int)TokenType.BlockEnd || nextToken < 1) break;
                    haveNext = true;
                }
            }
            return success;
        }
Exemple #3
0
        private bool loadMesh(out Mesh mesh)
        {
            bool success = true;
            int nextToken = 0;
            bool haveNext = false;

            mesh = new Mesh();

            readBlockStart();

            while (haveNext || (nextToken = scanner.yylex()) != (int)TokenType.BlockEnd)
            {
                if (nextToken != (int)TokenType.Node)
                {
                    Console.Error.WriteLine("Expected a node" + " - " + scanner.yytext);
                }
                haveNext = false;

                string str = scanner.yytext;
                if (str.Equals("*TIMEVALUE"))
                {
                    if (!readInt(out mesh.timeValue)) success = false;
                }
                else if (str.Equals("*MESH_NUMVERTEX"))
                {
                    if (!readInt(out mesh.vertexCount)) success = false;
                    mesh.vertexNormals = new List<Vector3D>();
                    for (int i = 0; i < mesh.vertexCount; i++) mesh.vertexNormals.Add(new Vector3D());
                }
                else if (str.Equals("*MESH_NUMFACES"))
                {
                    if (!readInt(out mesh.faceCount)) success = false;
                    mesh.faces = new List<Face>();
                    for (int i = 0; i < mesh.faceCount; i++) mesh.faces.Add(new Face());
                }
                else if (str.Equals("*MESH_VERTEX_LIST"))
                {
                    readBlockStart();
                    while ((nextToken = scanner.yylex()) != (int)TokenType.BlockEnd)
                    {
                        int i;
                        if (nextToken != (int)TokenType.Node || !scanner.yytext.Equals("*MESH_VERTEX"))
                        {
                            Console.Error.WriteLine("Expected a *MESH_VERTEX node");
                            continue;
                        }
                        if (!readInt(out i)) success = false;
                        if (i >= mesh.vertexCount)
                        {
                            Console.Error.WriteLine("File referred to a non-existent vertex");
                            continue;
                        }
                        if (mesh.verticies == null) mesh.verticies = new List<Vector3D>();
                        Vector3D vertex;
                        if (!readVector3D(out vertex)) success = false;
                        mesh.verticies.Add(vertex);
                    }
                }
                else if (str.Equals("*MESH_FACE_LIST"))
                {
                    if (!loadMeshFaces(mesh)) success = false;
                }
                else if (str.Equals("*MESH_NUMTVERTEX"))
                {
                    if (!readInt(out mesh.textureCoordinateCount)) success = false;
                }
                else if (str.Equals("*MESH_TVERTLIST"))
                {
                    readBlockStart();
                    while ((nextToken = scanner.yylex()) != (int)TokenType.BlockEnd)
                    {
                        int i;
                        if (nextToken != (int)TokenType.Node || !scanner.yytext.Equals("*MESH_TVERT"))
                        {
                            Console.Error.WriteLine("Expected a *MESH_TVERT node");
                            continue;
                        }
                        if (!readInt(out i)) success = false;
                        if (i >= mesh.textureCoordinateCount)
                        {
                            Console.Error.WriteLine("File referred to a non-existent vertex");
                            continue;
                        }
                        if (mesh.textureCoordinates == null) mesh.textureCoordinates = new List<Vector3D>();
                        Vector3D vertex;
                        if (!readVector3D(out vertex)) success = false;
                        mesh.textureCoordinates.Add(vertex);
                    }
                }
                else if (str.Equals("*MESH_NUMTVFACES"))
                {
                    int i;
                    if (!readInt(out i)) success = false;
                    if (i != mesh.faceCount)
                        Console.Error.WriteLine("Expected face texture count does not match face count");
                }
                else if (str.Equals("*MESH_TFACELIST"))
                {
                    readBlockStart();
                    while ((nextToken = scanner.yylex()) != (int)TokenType.BlockEnd)
                    {
                        int i;
                        if (nextToken != (int)TokenType.Node || !scanner.yytext.Equals("*MESH_TFACE"))
                        {
                            Console.Error.WriteLine("Expected a *MESH_TFACE node");
                            continue;
                        }
                        if (!readInt(out i)) success = false;
                        if (i >= mesh.faceCount)
                        {
                            Console.Error.WriteLine("File referred to a non-existent face");
                            continue;
                        }
                        if (mesh.faces != null)
                        {
                            Face face = mesh.faces[i];
                            if (!readInt3(out face.textureCoordinates)) success = false;
                            mesh.faces[i] = face;
                        }
                        else
                        {
                            success = false;
                        }
                    }
                }
                else if (str.Equals("*MESH_NORMALS"))
                {
                    if (!loadMeshNormals(mesh)) success = false;
                }
                else
                {
                    if ((nextToken = skip()) == (int)TokenType.BlockEnd || nextToken < 1) break;
                    haveNext = true;
                }
            }
            return success;
        }