/// <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); }
/// <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; }
/// <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 }); } }
/// <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); } } }
/// <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); } }