コード例 #1
0
 public static void ParseMesh(IEnumerable <string> lines, ref MeshWrapper meshWrapper)
 {
     foreach (var line in lines)
     {
         ParseLine(line, ref meshWrapper);
     }
 }
コード例 #2
0
        public static Mesh LoadMeshFromFile(string fileName)
        {
            var lines       = File.ReadLines(fileName);
            var meshWrapper = new MeshWrapper {
                Name = Path.GetFileNameWithoutExtension(fileName)
            };

            ObjFormatParser.ParseMesh(lines, ref meshWrapper);

            var mesh = CreateMesh(meshWrapper);

            mesh.RecalculateBounds();
            mesh.Optimize();

            return(mesh);
        }
コード例 #3
0
        private static Mesh CreateMesh(MeshWrapper meshWrapper)
        {
            var vertices  = new Vector3[meshWrapper.Faces.Count];
            var uvs       = new Vector2[meshWrapper.Faces.Count];
            var normals   = new Vector3[meshWrapper.Faces.Count];
            var triangles = meshWrapper.Triangles.ToArray();
            var meshName  = meshWrapper.Name;

            //
            for (var i = 0; i < meshWrapper.Faces.Count; i++)
            {
                if (meshWrapper.Faces[i].x >= 1)
                {
                    vertices[i] = meshWrapper.Vertices[meshWrapper.Faces[i].x - 1];
                }

                if (meshWrapper.Faces[i].y >= 1)
                {
                    uvs[i] = meshWrapper.UVs[meshWrapper.Faces[i].y - 1];
                }

                if (meshWrapper.Faces[i].z >= 1)
                {
                    normals[i] = meshWrapper.Normals[meshWrapper.Faces[i].z - 1];
                }
            }

            var mesh = new Mesh
            {
                name      = meshName,
                vertices  = vertices,
                uv        = uvs,
                normals   = normals,
                triangles = triangles
            };

            return(mesh);
        }
コード例 #4
0
        private static void ParseLine(string line, ref MeshWrapper meshWrapper)
        {
            var args = line.Split(' ');

            switch (args[0])
            {
            case "v":     // vertex
                meshWrapper.Vertices.Add(ParseVector3Args(args));
                break;

            case "vt":     // uv
                meshWrapper.UVs.Add(ParseVector3Args(args, true));
                break;

            case "vn":     // normal
                meshWrapper.Normals.Add(ParseVector3Args(args));
                break;

            case "f":     // face
                var faceBlocks = ParseFaceArgs(args);

                // calculating triangles
                meshWrapper.GlobalFaceBlockIndex += faceBlocks.Count;
                for (var i = meshWrapper.GlobalFaceBlockIndex - faceBlocks.Count + 1;
                     i + 1 < meshWrapper.GlobalFaceBlockIndex;
                     i++)
                {
                    meshWrapper.Triangles.Add(meshWrapper.GlobalFaceBlockIndex - faceBlocks.Count);
                    meshWrapper.Triangles.Add(i);
                    meshWrapper.Triangles.Add(i + 1);
                }

                meshWrapper.Faces.AddRange(faceBlocks);
                break;
            }
        }