using System; using System.Collections.Generic; using System.Globalization; using System.IO; using TriangleNet.Data; using TriangleNet.Geometry; namespace TriangleNet.IO { // Token: 0x02000026 RID: 38 public static class FileWriter { // Token: 0x06000135 RID: 309 RVA: 0x000160F0 File Offset: 0x000142F0 public static void Write(Mesh mesh, string filename) { FileWriter.WritePoly(mesh, Path.ChangeExtension(filename, ".poly")); FileWriter.WriteElements(mesh, Path.ChangeExtension(filename, ".ele")); } // Token: 0x06000136 RID: 310 RVA: 0x00016114 File Offset: 0x00014314 public static void WriteNodes(Mesh mesh, string filename) { using (StreamWriter streamWriter = new StreamWriter(filename)) { FileWriter.WriteNodes(streamWriter, mesh); } } // Token: 0x06000137 RID: 311 RVA: 0x0001614C File Offset: 0x0001434C private static void WriteNodes(StreamWriter writer, Mesh mesh) { int num = mesh.vertices.Count; Behavior behavior = mesh.behavior; if (behavior.Jettison) { num = mesh.vertices.Count - mesh.undeads; } if (writer != null) { writer.WriteLine("{0} {1} {2} {3}", new object[] { num, mesh.mesh_dim, mesh.nextras, behavior.UseBoundaryMarkers ? "1" : "0" }); if (mesh.numbering == NodeNumbering.None) { mesh.Renumber(); } if (mesh.numbering == NodeNumbering.Linear) { FileWriter.WriteNodes(writer, mesh.vertices.Values, behavior.UseBoundaryMarkers, mesh.nextras, behavior.Jettison); return; } Vertex[] array = new Vertex[mesh.vertices.Count]; foreach (Vertex vertex in mesh.vertices.Values) { array[vertex.id] = vertex; } FileWriter.WriteNodes(writer, array, behavior.UseBoundaryMarkers, mesh.nextras, behavior.Jettison); } } // Token: 0x06000138 RID: 312 RVA: 0x00016290 File Offset: 0x00014490 private static void WriteNodes(StreamWriter writer, IEnumerable nodes, bool markers, int attribs, bool jettison) { int num = 0; foreach (Vertex vertex in nodes) { if (!jettison || vertex.type != VertexType.UndeadVertex) { writer.Write("{0} {1} {2}", num, vertex.x.ToString(FileWriter.nfi), vertex.y.ToString(FileWriter.nfi)); for (int i = 0; i < attribs; i++) { writer.Write(" {0}", vertex.attributes[i].ToString(FileWriter.nfi)); } if (markers) { writer.Write(" {0}", vertex.mark); } writer.WriteLine(); num++; } } } // Token: 0x06000139 RID: 313 RVA: 0x0001636C File Offset: 0x0001456C public static void WriteElements(Mesh mesh, string filename) { Otri otri = default(Otri); bool useRegions = mesh.behavior.useRegions; int num = 0; otri.orient = 0; using (StreamWriter streamWriter = new StreamWriter(filename)) { streamWriter.WriteLine("{0} 3 {1}", mesh.triangles.Count, useRegions ? 1 : 0); foreach (Triangle triangle in mesh.triangles.Values) { otri.triangle = triangle; Vertex vertex = otri.Org(); Vertex vertex2 = otri.Dest(); Vertex vertex3 = otri.Apex(); streamWriter.Write("{0} {1} {2} {3}", new object[] { num, vertex.id, vertex2.id, vertex3.id }); if (useRegions) { streamWriter.Write(" {0}", otri.triangle.region); } streamWriter.WriteLine(); triangle.id = num++; } } } // Token: 0x0600013A RID: 314 RVA: 0x000164E4 File Offset: 0x000146E4 public static void WritePoly(Mesh mesh, string filename) { FileWriter.WritePoly(mesh, filename, true); } // Token: 0x0600013B RID: 315 RVA: 0x000164F0 File Offset: 0x000146F0 public static void WritePoly(Mesh mesh, string filename, bool writeNodes) { Osub osub = default(Osub); bool useBoundaryMarkers = mesh.behavior.UseBoundaryMarkers; using (StreamWriter streamWriter = new StreamWriter(filename)) { if (writeNodes) { FileWriter.WriteNodes(streamWriter, mesh); } else { streamWriter.WriteLine("0 {0} {1} {2}", mesh.mesh_dim, mesh.nextras, useBoundaryMarkers ? "1" : "0"); } streamWriter.WriteLine("{0} {1}", mesh.subsegs.Count, useBoundaryMarkers ? "1" : "0"); osub.orient = 0; int num = 0; foreach (Segment segment in mesh.subsegs.Values) { osub.seg = segment; Vertex vertex = osub.Org(); Vertex vertex2 = osub.Dest(); if (useBoundaryMarkers) { streamWriter.WriteLine("{0} {1} {2} {3}", new object[] { num, vertex.id, vertex2.id, osub.seg.boundary }); } else { streamWriter.WriteLine("{0} {1} {2}", num, vertex.id, vertex2.id); } num++; } num = 0; streamWriter.WriteLine("{0}", mesh.holes.Count); foreach (Point point in mesh.holes) { streamWriter.WriteLine("{0} {1} {2}", num++, point.X.ToString(FileWriter.nfi), point.Y.ToString(FileWriter.nfi)); } if (mesh.regions.Count > 0) { num = 0; streamWriter.WriteLine("{0}", mesh.regions.Count); foreach (RegionPointer regionPointer in mesh.regions) { streamWriter.WriteLine("{0} {1} {2} {3}", new object[] { num, regionPointer.point.X.ToString(FileWriter.nfi), regionPointer.point.Y.ToString(FileWriter.nfi), regionPointer.id }); num++; } } } } // Token: 0x0600013C RID: 316 RVA: 0x00016834 File Offset: 0x00014A34 public static void WriteEdges(Mesh mesh, string filename) { Otri otri = default(Otri); Otri otri2 = default(Otri); Osub osub = default(Osub); Behavior behavior = mesh.behavior; using (StreamWriter streamWriter = new StreamWriter(filename)) { streamWriter.WriteLine("{0} {1}", mesh.edges, behavior.UseBoundaryMarkers ? "1" : "0"); long num = 0L; foreach (Triangle triangle in mesh.triangles.Values) { otri.triangle = triangle; otri.orient = 0; while (otri.orient < 3) { otri.Sym(ref otri2); if (otri.triangle.id < otri2.triangle.id || otri2.triangle == Mesh.dummytri) { Vertex vertex = otri.Org(); Vertex vertex2 = otri.Dest(); if (behavior.UseBoundaryMarkers) { if (behavior.useSegments) { otri.SegPivot(ref osub); if (osub.seg == Mesh.dummysub) { streamWriter.WriteLine("{0} {1} {2} {3}", new object[] { num, vertex.id, vertex2.id, 0 }); } else { streamWriter.WriteLine("{0} {1} {2} {3}", new object[] { num, vertex.id, vertex2.id, osub.seg.boundary }); } } else { streamWriter.WriteLine("{0} {1} {2} {3}", new object[] { num, vertex.id, vertex2.id, (otri2.triangle == Mesh.dummytri) ? "1" : "0" }); } } else { streamWriter.WriteLine("{0} {1} {2}", num, vertex.id, vertex2.id); } num += 1L; } otri.orient++; } } } } // Token: 0x0600013D RID: 317 RVA: 0x00016AD4 File Offset: 0x00014CD4 public static void WriteNeighbors(Mesh mesh, string filename) { Otri otri = default(Otri); Otri otri2 = default(Otri); int num = 0; using (StreamWriter streamWriter = new StreamWriter(filename)) { streamWriter.WriteLine("{0} 3", mesh.triangles.Count); Mesh.dummytri.id = -1; foreach (Triangle triangle in mesh.triangles.Values) { otri.triangle = triangle; otri.orient = 1; otri.Sym(ref otri2); int id = otri2.triangle.id; otri.orient = 2; otri.Sym(ref otri2); int id2 = otri2.triangle.id; otri.orient = 0; otri.Sym(ref otri2); int id3 = otri2.triangle.id; streamWriter.WriteLine("{0} {1} {2} {3}", new object[] { num++, id, id2, id3 }); } } } // Token: 0x0600013E RID: 318 RVA: 0x00016C40 File Offset: 0x00014E40 public static void WriteVoronoi(Mesh mesh, string filename) { Otri otri = default(Otri); Otri otri2 = default(Otri); double num = 0.0; double num2 = 0.0; int num3 = 0; otri.orient = 0; using (StreamWriter streamWriter = new StreamWriter(filename)) { streamWriter.WriteLine("{0} 2 {1} 0", mesh.triangles.Count, mesh.nextras); foreach (Triangle triangle in mesh.triangles.Values) { otri.triangle = triangle; Vertex vertex = otri.Org(); Vertex vertex2 = otri.Dest(); Vertex vertex3 = otri.Apex(); Point point = Primitives.FindCircumcenter(vertex, vertex2, vertex3, ref num, ref num2); streamWriter.Write("{0} {1} {2}", num3, point.X.ToString(FileWriter.nfi), point.Y.ToString(FileWriter.nfi)); for (int i = 0; i < mesh.nextras; i++) { streamWriter.Write(" 0"); } streamWriter.WriteLine(); otri.triangle.id = num3++; } streamWriter.WriteLine("{0} 0", mesh.edges); num3 = 0; foreach (Triangle triangle2 in mesh.triangles.Values) { otri.triangle = triangle2; otri.orient = 0; while (otri.orient < 3) { otri.Sym(ref otri2); if (otri.triangle.id < otri2.triangle.id || otri2.triangle == Mesh.dummytri) { int id = otri.triangle.id; if (otri2.triangle == Mesh.dummytri) { Vertex vertex = otri.Org(); Vertex vertex2 = otri.Dest(); streamWriter.WriteLine("{0} {1} -1 {2} {3}", new object[] { num3, id, (vertex2[1] - vertex[1]).ToString(FileWriter.nfi), (vertex[0] - vertex2[0]).ToString(FileWriter.nfi) }); } else { int id2 = otri2.triangle.id; streamWriter.WriteLine("{0} {1} {2}", num3, id, id2); } num3++; } otri.orient++; } } } } // Token: 0x0600013F RID: 319 RVA: 0x00016F64 File Offset: 0x00015164 public static void WriteOffFile(Mesh mesh, string filename) { long num = (long)mesh.vertices.Count; if (mesh.behavior.Jettison) { num = (long)(mesh.vertices.Count - mesh.undeads); } int num2 = 0; using (StreamWriter streamWriter = new StreamWriter(filename)) { streamWriter.WriteLine("OFF"); streamWriter.WriteLine("{0} {1} {2}", num, mesh.triangles.Count, mesh.edges); foreach (Vertex vertex in mesh.vertices.Values) { Vertex vertex; if (!mesh.behavior.Jettison || vertex.type != VertexType.UndeadVertex) { streamWriter.WriteLine(" {0} {1} 0.0", vertex[0].ToString(FileWriter.nfi), vertex[1].ToString(FileWriter.nfi)); vertex.id = num2++; } } Otri otri; otri.orient = 0; foreach (Triangle triangle in mesh.triangles.Values) { otri.triangle = triangle; Vertex vertex = otri.Org(); Vertex vertex2 = otri.Dest(); Vertex vertex3 = otri.Apex(); streamWriter.WriteLine(" 3 {0} {1} {2}", vertex.id, vertex2.id, vertex3.id); } } } // Token: 0x040000E8 RID: 232 private static NumberFormatInfo nfi = CultureInfo.InvariantCulture.NumberFormat; } }