예제 #1
0
        /// <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);
        }