示例#1
0
    static void Load(ObjMesh mesh, TextReader textReader)
    {
        vertices = new List<Vector3>();
        normals = new List<Vector3>();
        texCoords = new List<Vector2>();
        objVerticesIndexDictionary = new Dictionary<ObjMesh.ObjVertex, int>();
        objVertices = new List<ObjMesh.ObjVertex>();
        objTriangles = new List<ObjMesh.ObjTriangle>();
        objQuads = new List<ObjMesh.ObjQuad>();

        string line;
        while ((line = textReader.ReadLine()) != null)
        {
            line = line.Trim(splitCharacters);
            line = line.Replace("  ", " ");

            string[] parameters = line.Split(splitCharacters);

            switch (parameters[0])
            {
                case "p": // Point
                    break;

                case "v": // Vertex
                    float x = float.Parse(parameters[1]);
                    float y = float.Parse(parameters[2]);
                    float z = float.Parse(parameters[3]);
                    vertices.Add(new Vector3(x, y, z));
                    break;

                case "vt": // TexCoord
                    float u = float.Parse(parameters[1]);
                    float v = float.Parse(parameters[2]);
                    texCoords.Add(new Vector2(u, v));
                    break;

                case "vn": // Normal
                    float nx = float.Parse(parameters[1]);
                    float ny = float.Parse(parameters[2]);
                    float nz = float.Parse(parameters[3]);
                    normals.Add(new Vector3(nx, ny, nz));
                    break;

                case "f":
                    switch (parameters.Length)
                    {
                        case 4:
                            ObjMesh.ObjTriangle objTriangle = new ObjMesh.ObjTriangle();
                            objTriangle.Index0 = ParseFaceParameter(parameters[1]);
                            objTriangle.Index1 = ParseFaceParameter(parameters[2]);
                            objTriangle.Index2 = ParseFaceParameter(parameters[3]);
                            objTriangles.Add(objTriangle);
                            break;

                        case 5:
                            ObjMesh.ObjQuad objQuad = new ObjMesh.ObjQuad();
                            objQuad.Index0 = ParseFaceParameter(parameters[1]);
                            objQuad.Index1 = ParseFaceParameter(parameters[2]);
                            objQuad.Index2 = ParseFaceParameter(parameters[3]);
                            objQuad.Index3 = ParseFaceParameter(parameters[4]);
                            objQuads.Add(objQuad);
                            break;
                    }
                    break;
            }
        }

        mesh.Vertices = objVertices.ToArray();
        mesh.Triangles = objTriangles.ToArray();
        mesh.Quads = objQuads.ToArray();

        objVerticesIndexDictionary = null;
        vertices = null;
        normals = null;
        texCoords = null;
        objVertices = null;
        objTriangles = null;
        objQuads = null;
    }
示例#2
0
    static void Load(ObjMesh mesh, StreamReader textReader)
    {
        //try {
        //vertices = null;
            //objVertices = null;
            if(vertices == null) {
        vertices = new List<Vector3>();
            }
            if(normals == null) {
        normals = new List<Vector3>();
            }
            if(texCoords == null) {
        texCoords = new List<Vector2>();
            }
            if(objVerticesIndexDictionary == null) {
        objVerticesIndexDictionary = new Dictionary<ObjMesh.ObjVertex, int>();
            }
            if(objVertices == null) {
        objVertices = new List<ObjMesh.ObjVertex>();
            }
        objTriangles = new List<ObjMesh.ObjTriangle>();
        objQuads = new List<ObjMesh.ObjQuad>();
            mesh.vertexPositionOffset = vertices.Count;
        string line;
        while ((line = textReader.ReadLine()) != null)
        {
            if(line.Length<2) {
            break;
            }
            line = line.Trim(splitCharacters);
            line = line.Replace("  ", " ");

            string[] parameters = line.Split(splitCharacters);

            switch (parameters[0])
            {
                case "usemtl":
                    //Material specification
                    try {
                    mesh.Material = materials[parameters[1]];
                    }catch(KeyNotFoundException) {
                    Console.WriteLine("WARNING: Texture parse failure: "+parameters[1]);
                    }
                    break;
                case "p": // Point
                    break;

                case "v": // Vertex
                    float x = parsefloat(parameters[1]);
                    float y = parsefloat(parameters[2]);
                    float z = parsefloat(parameters[3]);
                    vertices.Add(new Vector3(x, y, z));
                    break;

                case "vt": // TexCoord
                    float u = parsefloat(parameters[1]);
                    float v = parsefloat(parameters[2]);
                    texCoords.Add(new Vector2(u, v));
                    break;

                case "vn": // Normal
                    float nx = parsefloat(parameters[1]);
                    float ny = parsefloat(parameters[2]);
                    float nz = parsefloat(parameters[3]);
                    normals.Add(new Vector3(nx, ny, nz));
                    break;

                case "f":
                    switch (parameters.Length)
                    {
                        case 4:
                            ObjMesh.ObjTriangle objTriangle = new ObjMesh.ObjTriangle();
                            objTriangle.Index0 = ParseFaceParameter(parameters[1]);
                            objTriangle.Index1 = ParseFaceParameter(parameters[2]);
                            objTriangle.Index2 = ParseFaceParameter(parameters[3]);
                            objTriangles.Add(objTriangle);
                            break;

                        case 5:
                            ObjMesh.ObjQuad objQuad = new ObjMesh.ObjQuad();
                            objQuad.Index0 = ParseFaceParameter(parameters[1]);
                            objQuad.Index1 = ParseFaceParameter(parameters[2]);
                            objQuad.Index2 = ParseFaceParameter(parameters[3]);
                            objQuad.Index3 = ParseFaceParameter(parameters[4]);
                            objQuads.Add(objQuad);
                            break;
                    }
                    break;
            }

            }
        //}catch(Exception er) {
        //	Console.WriteLine(er);
        //	Console.WriteLine("Successfully recovered. Bounds/Collision checking may fail though");
        //}

        mesh.Vertices = objVertices.ToArray();
        mesh.Triangles = objTriangles.ToArray();
        mesh.Quads = objQuads.ToArray();
        textReader.BaseStream.Close();
    }
示例#3
0
    static void Load(ObjMesh mesh, TextReader textReader)
    {
        vertices  = new List <Vector3>();
        normals   = new List <Vector3>();
        texCoords = new List <Vector2>();
        objVerticesIndexDictionary = new Dictionary <ObjMesh.ObjVertex, int>();
        objVertices  = new List <ObjMesh.ObjVertex>();
        objTriangles = new List <ObjMesh.ObjTriangle>();
        objQuads     = new List <ObjMesh.ObjQuad>();

        string line;

        while ((line = textReader.ReadLine()) != null)
        {
            line = line.Trim(splitCharacters);
            line = line.Replace("  ", " ");

            string[] parameters = line.Split(splitCharacters);

            switch (parameters[0])
            {
            case "p":     // Point
                break;

            case "v":     // Vertex
                float x = float.Parse(parameters[1]);
                float y = float.Parse(parameters[2]);
                float z = float.Parse(parameters[3]);
                vertices.Add(new Vector3(x, y, z));
                break;

            case "vt":     // TexCoord
                float u = float.Parse(parameters[1]);
                float v = float.Parse(parameters[2]);
                texCoords.Add(new Vector2(u, v));
                break;

            case "vn":     // Normal
                float nx = float.Parse(parameters[1]);
                float ny = float.Parse(parameters[2]);
                float nz = float.Parse(parameters[3]);
                normals.Add(new Vector3(nx, ny, nz));
                break;

            case "f":
                switch (parameters.Length)
                {
                case 4:
                    ObjMesh.ObjTriangle objTriangle = new ObjMesh.ObjTriangle();
                    objTriangle.Index0 = ParseFaceParameter(parameters[1]);
                    objTriangle.Index1 = ParseFaceParameter(parameters[2]);
                    objTriangle.Index2 = ParseFaceParameter(parameters[3]);
                    objTriangles.Add(objTriangle);
                    break;

                case 5:
                    ObjMesh.ObjQuad objQuad = new ObjMesh.ObjQuad();
                    objQuad.Index0 = ParseFaceParameter(parameters[1]);
                    objQuad.Index1 = ParseFaceParameter(parameters[2]);
                    objQuad.Index2 = ParseFaceParameter(parameters[3]);
                    objQuad.Index3 = ParseFaceParameter(parameters[4]);
                    objQuads.Add(objQuad);
                    break;
                }
                break;
            }
        }

        mesh.Vertices  = objVertices.ToArray();
        mesh.Triangles = objTriangles.ToArray();
        mesh.Quads     = objQuads.ToArray();

        objVerticesIndexDictionary = null;
        vertices     = null;
        normals      = null;
        texCoords    = null;
        objVertices  = null;
        objTriangles = null;
        objQuads     = null;
    }