386 lines
11 KiB
C#
386 lines
11 KiB
C#
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<Vertex> 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;
|
|
}
|
|
}
|