4 using System.Collections.Generic;
23 private static int HeaderSize =
sizeof(int) * 2;
30 public static byte[]
Serialize(IEnumerable<Mesh> meshes)
34 using (MemoryStream stream =
new MemoryStream())
36 using (BinaryWriter writer =
new BinaryWriter(stream))
38 foreach (Mesh mesh
in meshes)
40 WriteMesh(writer, mesh);
44 data =
new byte[stream.Length];
45 stream.Read(data, 0, data.Length);
60 public static byte[]
Serialize(IEnumerable<MeshFilter> meshes, Transform secondarySpace = null)
64 using (MemoryStream stream =
new MemoryStream())
66 using (BinaryWriter writer =
new BinaryWriter(stream))
68 foreach (MeshFilter meshFilter
in meshes)
70 WriteMesh(writer, meshFilter.sharedMesh, meshFilter.transform, secondarySpace);
74 data =
new byte[stream.Length];
75 stream.Read(data, 0, data.Length);
89 List<Mesh> meshes =
new List<Mesh>();
91 using (MemoryStream stream =
new MemoryStream(data))
93 using (BinaryReader reader =
new BinaryReader(stream))
95 while (reader.BaseStream.Length - reader.BaseStream.Position >= HeaderSize)
97 meshes.Add(ReadMesh(reader));
112 private static void WriteMesh(BinaryWriter writer, Mesh mesh, Transform transform = null, Transform secondarySpace = null)
114 SysDiag.Debug.Assert(writer != null);
117 WriteMeshHeader(writer, mesh.vertexCount, mesh.triangles.Length);
118 WriteVertices(writer, mesh.vertices, transform, secondarySpace);
119 WriteTriangleIndicies(writer, mesh.triangles);
127 private static Mesh ReadMesh(BinaryReader reader)
129 SysDiag.Debug.Assert(reader != null);
132 int triangleIndexCount = 0;
135 ReadMeshHeader(reader, out vertexCount, out triangleIndexCount);
136 Vector3[] vertices = ReadVertices(reader, vertexCount);
137 int[] triangleIndices = ReadTriangleIndicies(reader, triangleIndexCount);
140 Mesh mesh =
new Mesh();
141 mesh.vertices = vertices;
142 mesh.triangles = triangleIndices;
144 mesh.RecalculateNormals();
155 private static void WriteMeshHeader(BinaryWriter writer,
int vertexCount,
int triangleIndexCount)
157 SysDiag.Debug.Assert(writer != null);
159 writer.Write(vertexCount);
160 writer.Write(triangleIndexCount);
170 private static void ReadMeshHeader(BinaryReader reader, out
int vertexCount, out
int triangleIndexCount)
172 SysDiag.Debug.Assert(reader != null);
174 vertexCount = reader.ReadInt32();
175 triangleIndexCount = reader.ReadInt32();
185 private static void WriteVertices(BinaryWriter writer, Vector3[] vertices, Transform transform = null, Transform secondarySpace = null)
187 SysDiag.Debug.Assert(writer != null);
189 if (transform != null)
191 for (
int v = 0, vLength = vertices.Length; v < vLength; ++v)
193 Vector3 vertex = transform.TransformPoint(vertices[v]);
194 if (secondarySpace != null)
196 vertex = secondarySpace.InverseTransformPoint(vertex);
198 writer.Write(vertex.x);
199 writer.Write(vertex.y);
200 writer.Write(vertex.z);
205 foreach (Vector3 vertex
in vertices)
207 writer.Write(vertex.x);
208 writer.Write(vertex.y);
209 writer.Write(vertex.z);
220 private static Vector3[] ReadVertices(BinaryReader reader,
int vertexCount)
222 SysDiag.Debug.Assert(reader != null);
224 Vector3[] vertices =
new Vector3[vertexCount];
226 for (
int i = 0; i < vertices.Length; i++)
228 vertices[i] =
new Vector3(reader.ReadSingle(),
230 reader.ReadSingle());
241 private static void WriteTriangleIndicies(BinaryWriter writer,
int[] triangleIndices)
243 SysDiag.Debug.Assert(writer != null);
245 foreach (
int index
in triangleIndices)
257 private static int[] ReadTriangleIndicies(BinaryReader reader,
int triangleIndexCount)
259 SysDiag.Debug.Assert(reader != null);
261 int[] triangleIndices =
new int[triangleIndexCount];
263 for (
int i = 0; i < triangleIndices.Length; i++)
265 triangleIndices[i] = reader.ReadInt32();
268 return triangleIndices;