private static void MergeMeshes(SBMLoader loader, out Mesh result, out string[] materials) { if (loader.MeshCount == 0) { result = null; materials = null; return; } if (loader.MeshCount == 1) { loader.GetMesh(0, out result, out materials); return; } List<string> finalmaterials = new List<string>(); MeshBuilder merged = new MeshBuilder(); merged.UseNormals = true; merged.UseTangents = true; merged.UseTexCoords = true; int totalsubmeshes = 0; for (int i = 0; i < loader.MeshCount; i++) { Mesh cmesh; string[] curmats; loader.GetMesh(i, out cmesh, out curmats); totalsubmeshes += cmesh.Submeshes.Length; int baseindex = merged.CurrentVertexCount; merged.AddPositions(cmesh.Positions); merged.AddNormals(cmesh.Normals); merged.AddTextureCoords(cmesh.TextureCoordinates); merged.AddTangents(cmesh.Tangents); for (int j = 0; j < cmesh.Submeshes.Length; j++) { int submeshindex; if (finalmaterials.Contains(curmats[j])) submeshindex = finalmaterials.IndexOf(curmats[j]); else { submeshindex = finalmaterials.Count; finalmaterials.Add(curmats[j]); } merged.AddIndices(submeshindex, cmesh.Submeshes[j], (uint)baseindex); } } Console.WriteLine("Merged {0} meshes with a total of {1} submeshes into 1 mesh with a total of {2} submeshes.", loader.MeshCount, totalsubmeshes, finalmaterials.Count); result = merged.Build(); materials = finalmaterials.ToArray(); }