Exemplo n.º 1
0
        /// <summary>
        /// Computes the specified source mesh
        /// </summary>
        /// <param name="newDict">New geometry dictionary</param>
        /// <param name="sourceMesh">Source mesh name</param>
        /// <param name="targetMesh">Target mesh name</param>
        /// <param name="material">Material name</param>
        /// <returns>Returns a submesh content if source mesh isn't a volume</returns>
        private SubMeshContent ComputeSubmeshContent(GeometryDictionary newDict, string sourceMesh, string targetMesh, string material)
        {
            if (!this.Geometry.ContainsKey(sourceMesh))
            {
                return(null);
            }

            var dict = this.Geometry[sourceMesh];

            if (dict.ContainsKey(material))
            {
                if (dict[material].IsVolume)
                {
                    //Group into new dictionary
                    newDict.Add(targetMesh, material, dict[material]);
                }
                else
                {
                    //Return the submesh content
                    return(dict[material]);
                }
            }

            return(null);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Model content optimization
        /// </summary>
        public void Optimize()
        {
            GeometryDictionary newDict = new GeometryDictionary();

            if (this.Materials.Count > 0)
            {
                if (this.Controllers.Skins.Length > 0)
                {
                    //Skinned
                    foreach (string skin in this.Controllers.Skins)
                    {
                        foreach (string material in this.Materials.Keys)
                        {
                            this.OptimizeSkinnedMesh(newDict, skin, material);
                        }
                    }
                }

                foreach (string material in this.Materials.Keys)
                {
                    this.OptimizeStaticMesh(newDict, material);
                }
            }

            this.Geometry = newDict;
        }
Exemplo n.º 3
0
        /// <summary>
        /// Optimizes the skinned mesh
        /// </summary>
        /// <param name="newDict">New geometry dictionary</param>
        /// <param name="skin">Skin name</param>
        /// <param name="material">Material name</param>
        private void OptimizeSkinnedMesh(GeometryDictionary newDict, string skin, string material)
        {
            var skinnedM = ComputeSubmeshContent(newDict, skin, skin, material);

            if (skinnedM != null)
            {
                this.OptimizeSubmeshContent(newDict, skin, material, new[] { skinnedM });
            }
        }
Exemplo n.º 4
0
 /// <summary>
 /// Optimizes the submesh content list
 /// </summary>
 /// <param name="newDict">New geometry dictionary</param>
 /// <param name="mesh">Mesh name</param>
 /// <param name="material">Material name</param>
 /// <param name="meshList">Mesh list to optimize</param>
 private void OptimizeSubmeshContent(GeometryDictionary newDict, string mesh, string material, IEnumerable <SubMeshContent> meshList)
 {
     if (SubMeshContent.OptimizeMeshes(meshList, out var gmesh))
     {
         //Mesh grouped
         newDict.Add(mesh, material, gmesh);
     }
     else
     {
         //Cannot group
         foreach (var m in meshList)
         {
             newDict.Add(mesh, material, m);
         }
     }
 }
Exemplo n.º 5
0
        /// <summary>
        /// Optimizes the static mesh
        /// </summary>
        /// <param name="newDict">New geometry dictionary</param>
        /// <param name="material">Material name</param>
        private void OptimizeStaticMesh(GeometryDictionary newDict, string material)
        {
            List <SubMeshContent> staticM = new List <SubMeshContent>();

            foreach (string mesh in this.Geometry.Keys)
            {
                if (!Array.Exists(this.Controllers.Skins, s => s == mesh))
                {
                    var submesh = ComputeSubmeshContent(newDict, mesh, StaticMesh, material);
                    if (submesh != null)
                    {
                        staticM.Add(submesh);
                    }
                }
            }

            if (staticM.Count > 0)
            {
                this.OptimizeSubmeshContent(newDict, StaticMesh, material, staticM);
            }
        }