/// <summary> /// Integrate meshes to a single mesh /// </summary> /// <param name="model"></param> /// <returns></returns> public static MeshGroup CreateSingleMesh(this Model model, string name) { // new mesh to store result var meshGroup = new MeshGroup(name); var mesh = new Mesh { VertexBuffer = new VertexBuffer() }; meshGroup.Meshes.Add(mesh); var useCountList = GetNodeSkinUseCount(model); // new Skin. // Joints has include all joint meshGroup.Skin = new Skin(); for (int i = 0; i < useCountList.Length; ++i) { if (useCountList[i] > 0) { // add joint that has bone weight meshGroup.Skin.Joints.Add(model.Nodes[i]); } } model.Skins.Clear(); model.Skins.Add(meshGroup.Skin); // concatenate all mesh foreach (var node in model.Root.Traverse().Skip(1)) { var g = node.MeshGroup; if (g != null) { foreach (var m in g.Meshes) { if (g.Skin != null && m.VertexBuffer.Joints != null && m.VertexBuffer.Weights != null) { var jointIndexMap = g.Skin.Joints.Select(x => meshGroup.Skin.Joints.IndexOf(x)).ToArray(); mesh.Append(m.VertexBuffer, m.IndexBuffer, m.Submeshes, m.MorphTargets, jointIndexMap); } else { var rootIndex = meshGroup.Skin.Joints.IndexOf(node); mesh.Append(m.VertexBuffer, m.IndexBuffer, m.Submeshes, m.MorphTargets, null, rootIndex, node.Matrix); } } } } foreach (var target in mesh.MorphTargets) { target.VertexBuffer.Resize(mesh.VertexBuffer.Count); } return(meshGroup); }