コード例 #1
0
        void Load(Mesh mesh, TextReader textReader)
        {
            vertices     = new List <Vector3>();
            normals      = new List <Vector3>();
            texCoords    = new List <Vector2>();
            objVertices  = new List <Mesh.ObjVertex>();
            objTriangles = new List <Mesh.ObjTriangle>();
            objQuads     = new List <Mesh.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:
                        Mesh.ObjTriangle objTriangle = new Mesh.ObjTriangle();
                        objTriangle.Index0 = ParseFaceParameter(parameters[1]);
                        objTriangle.Index1 = ParseFaceParameter(parameters[2]);
                        objTriangle.Index2 = ParseFaceParameter(parameters[3]);
                        objTriangles.Add(objTriangle);
                        break;

                    case 5:
                        Mesh.ObjQuad objQuad = new Mesh.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();
            vertices       = null;
            normals        = null;
            texCoords      = null;
            objVertices    = null;
            objTriangles   = null;
            objQuads       = null;
        }
コード例 #2
0
ファイル: meshLoader.cs プロジェクト: timolapre/Rasterization
        void Load(MeshGroup meshgroup, TextReader textReader)
        {
            Mesh mesh = new Mesh(null, null, null, 0);

            vertices     = new List <Vector3>();
            normals      = new List <Vector3>();
            texCoords    = new List <Vector2>();
            objVertices  = new List <Mesh.ObjVertex>();
            objTriangles = new List <Mesh.ObjTriangle>();
            objQuads     = new List <Mesh.ObjQuad>();
            int    firsto = 0;
            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:
                        Mesh.ObjTriangle objTriangle = new Mesh.ObjTriangle();
                        objTriangle.Index0 = ParseFaceParameter(parameters[1]);
                        objTriangle.Index1 = ParseFaceParameter(parameters[2]);
                        objTriangle.Index2 = ParseFaceParameter(parameters[3]);
                        objTriangles.Add(objTriangle);
                        break;

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

                case "mtllib":
                    string mtl = parameters[1];
                    for (int i = 2; i < parameters.Length; i++)
                    {
                        mtl += " " + parameters[i];
                    }
                    LoadMTLFile(mtl);
                    break;

                case "usemtl":
                    string umtl = "";
                    for (int i = 1; i < parameters.Length; i++)
                    {
                        umtl += parameters[i];
                    }
                    if (ignoreMaterials)
                    {
                        uiCurMaterial = 1;
                    }
                    else
                    {
                        uiCurMaterial = Materials[umtl].id;
                    }
                    break;

                case "o":
                    Console.WriteLine(parameters[1]);
                    if (firsto > 0)
                    {
                        mesh.vertices  = objVertices.ToArray();
                        mesh.triangles = objTriangles.ToArray();
                        mesh.quads     = objQuads.ToArray();
                        mesh.texture   = uiCurMaterial;
                        meshgroup.AddMesh(mesh);
                    }
                    mesh = new Mesh(null, null, null, 0);
                    firsto++;
                    //vertices = new List<Vector3>();
                    //normals = new List<Vector3>();
                    //texCoords = new List<Vector2>();
                    objVertices  = new List <Mesh.ObjVertex>();
                    objTriangles = new List <Mesh.ObjTriangle>();
                    objQuads     = new List <Mesh.ObjQuad>();
                    break;
                }
            }
            Console.WriteLine();
            mesh.vertices  = objVertices.ToArray();
            mesh.triangles = objTriangles.ToArray();
            mesh.quads     = objQuads.ToArray();
            mesh.texture   = uiCurMaterial;
            meshgroup.AddMesh(mesh);
            vertices     = null;
            normals      = null;
            texCoords    = null;
            objVertices  = null;
            objTriangles = null;
            objQuads     = null;
        }