public static void ParseMesh(IEnumerable <string> lines, ref MeshWrapper meshWrapper) { foreach (var line in lines) { ParseLine(line, ref meshWrapper); } }
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); }
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); }
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; } }