public static void GetCombinedMesh(List <BXDAMesh.BXDASubMesh> meshes, HandleMesh handleMesh) { BXDAMesh.BXDASubMesh combinedMesh = new BXDAMesh.BXDASubMesh(); combinedMesh.verts = new double[0]; combinedMesh.norms = new double[0]; combinedMesh.surfaces = new List <BXDAMesh.BXDASurface>(); foreach (BXDAMesh.BXDASubMesh mesh in meshes) { double[] oldVertices = combinedMesh.verts; double[] newVertices = new double[oldVertices.Length + mesh.verts.Length]; oldVertices.CopyTo(newVertices, 0); mesh.verts.CopyTo(newVertices, oldVertices.Length); combinedMesh.verts = newVertices; double[] oldNorms = combinedMesh.verts; double[] newNorms = new double[oldNorms.Length + mesh.norms.Length]; oldNorms.CopyTo(newNorms, 0); mesh.norms.CopyTo(newNorms, oldNorms.Length); combinedMesh.norms = newNorms; combinedMesh.surfaces.AddRange(mesh.surfaces); } List <BXDAMesh.BXDASubMesh> combinedMeshes = new List <BXDAMesh.BXDASubMesh>(); combinedMeshes.Add(combinedMesh); ReadMeshSet(combinedMeshes, delegate(int id, BXDAMesh.BXDASubMesh subMesh, Mesh mesh) { handleMesh(id, subMesh, mesh); }); }
public static void ReadMeshSet(List <BXDAMesh.BXDASubMesh> meshes, HandleMesh handleMesh, bool mirror = false) { for (int j = 0; j < meshes.Count; j++) { BXDAMesh.BXDASubMesh sub = meshes[j]; //takes all of the required information from the API (the API information is within "sub" above) Vector3[] vertices = sub.verts == null ? null : ArrayUtilities.WrapArray <Vector3>( delegate(double x, double y, double z) { return(new Vector3((float)x * (mirror ? -0.01f : 0.01f), (float)y * 0.01f, (float)z * 0.01f)); }, sub.verts); Vector3[] normals = sub.norms == null ? null : ArrayUtilities.WrapArray <Vector3>( delegate(double x, double y, double z) { return(new Vector3((float)x, (float)y, (float)z)); }, sub.norms); Mesh unityMesh = new Mesh(); unityMesh.vertices = vertices; unityMesh.normals = normals; unityMesh.uv = new Vector2[vertices.Length]; unityMesh.subMeshCount = sub.surfaces.Count; for (int i = 0; i < sub.surfaces.Count; i++) { int[] cpy = new int[sub.surfaces[i].indicies.Length]; Array.Copy(sub.surfaces[i].indicies, cpy, cpy.Length); if (mirror) { Array.Reverse(cpy); } unityMesh.SetTriangles(cpy, i); } if (normals != null) { unityMesh.RecalculateNormals(); } handleMesh(j, sub, unityMesh); } }