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(); }
public static Mesh CombineMeshes(params Mesh[] meshes) { MeshBuilder builder = new MeshBuilder(); if (meshes[0].TextureCoordinates != null) builder.UseTexCoords = true; if (meshes[0].Normals != null) builder.UseNormals = true; uint indexpos = 0; for (int i = 0; i < meshes.Length; i++) { var mesh = meshes[i]; if (builder.UseTexCoords) builder.AddTextureCoords(mesh.TextureCoordinates); if (builder.UseNormals) builder.AddNormals(mesh.Normals); for (int j = 0; j < mesh.Submeshes.Length; j++) builder.AddIndices(j, mesh.Submeshes[j]); builder.AddPositions(mesh.Positions); indexpos += (uint)mesh.Positions.Length; } return builder.Build(); }