From 6eb915c129fc90c6f4c82ae097dd6ffad5239efc Mon Sep 17 00:00:00 2001 From: chai Date: Mon, 25 Jan 2021 14:28:30 +0800 Subject: +scripts --- .../Scripts/XMainClient/CombineMeshUtility.cs | 188 +++++++++++++++++++++ 1 file changed, 188 insertions(+) create mode 100644 Client/Assets/Scripts/XMainClient/CombineMeshUtility.cs (limited to 'Client/Assets/Scripts/XMainClient/CombineMeshUtility.cs') diff --git a/Client/Assets/Scripts/XMainClient/CombineMeshUtility.cs b/Client/Assets/Scripts/XMainClient/CombineMeshUtility.cs new file mode 100644 index 00000000..a1b85241 --- /dev/null +++ b/Client/Assets/Scripts/XMainClient/CombineMeshUtility.cs @@ -0,0 +1,188 @@ +using System; +using System.Collections.Generic; +using UnityEngine; +using XUtliPoolLib; + +namespace XMainClient +{ + internal class CombineMeshUtility + { + public static int MaxPartCount = 8; + + private List matCombineInstanceArrayCache = new List(); + + public CombineMeshUtility() + { + for (int i = 0; i < CombineMeshUtility.MaxPartCount; i++) + { + this.matCombineInstanceArrayCache.Add(new CombineInstance[i + 1]); + } + } + + private CombineInstance[] GetMatCombineInstanceArray(int partCount) + { + int num = partCount - 1; + bool flag = num >= 0; + CombineInstance[] result; + if (flag) + { + bool flag2 = num >= this.matCombineInstanceArrayCache.Count; + if (flag2) + { + result = new CombineInstance[partCount]; + } + else + { + result = this.matCombineInstanceArrayCache[num]; + } + } + else + { + result = null; + } + return result; + } + + public bool Combine(CombineMeshTask combineTask) + { + int num = 0; + for (int i = 0; i < 8; i++) + { + PartLoadTask partLoadTask = combineTask.parts[i] as PartLoadTask; + bool flag = partLoadTask.HasMesh(); + if (flag) + { + num++; + } + } + combineTask.isOnepart = false; + CombineInstance[] matCombineInstanceArray = this.GetMatCombineInstanceArray(num); + bool flag2 = matCombineInstanceArray != null && combineTask.skin != null; + bool result; + if (flag2) + { + bool flag3 = false; + PartLoadTask partLoadTask2 = null; + int num2 = 0; + for (int j = 0; j < 8; j++) + { + PartLoadTask partLoadTask3 = combineTask.parts[j] as PartLoadTask; + bool flag4 = partLoadTask3.HasMesh(); + if (flag4) + { + bool isReadable = partLoadTask3.mesh.isReadable; + if (isReadable) + { + CombineInstance combineInstance = default(CombineInstance); + combineInstance.mesh = partLoadTask3.mesh; + bool flag5 = partLoadTask3.partType != XMeshPartList.NormalPart; + if (flag5) + { + combineTask.isOnepart = true; + flag3 = (partLoadTask3.partType == XMeshPartList.CutoutPart); + partLoadTask2 = partLoadTask3; + } + combineInstance.subMeshIndex = 0; + combineInstance.subMeshIndex = 0; + matCombineInstanceArray[num2++] = combineInstance; + } + else + { + XSingleton.singleton.AddErrorLog2("Mesh not readable:{0}", new object[] + { + j + }); + } + } + } + bool flag6 = combineTask.skin.sharedMesh == null; + if (flag6) + { + combineTask.skin.sharedMesh = new Mesh(); + combineTask.skin.sharedMesh.MarkDynamic(); + } + else + { + combineTask.skin.sharedMesh.Clear(true); + } + combineTask.skin.enabled = false; + combineTask.skin.gameObject.SetActive(false); + combineTask.skin.sharedMesh.CombineMeshes(matCombineInstanceArray, true, false); + combineTask.skin.gameObject.SetActive(true); + bool flag7 = combineTask.skin.sharedMaterial != null; + if (flag7) + { + XEquipDocument.ReturnMaterial(combineTask.skin.sharedMaterial); + combineTask.skin.sharedMaterial = null; + } + bool flag8 = combineTask.skin.sharedMaterial == null; + if (flag8) + { + bool flag9 = CombineMeshTask.s_CombineMatType == ECombineMatType.ECombined; + if (flag9) + { + combineTask.skin.sharedMaterial = XEquipDocument.GetRoleMat(combineTask.isOnepart, flag3, 0); + } + else + { + combineTask.skin.sharedMaterial = XEquipDocument.GetRoleMat(combineTask.isOnepart, flag3, combineTask.roleType); + } + } + bool flag10 = combineTask.skin.sharedMaterial != null; + if (flag10) + { + combineTask.skin.GetPropertyBlock(combineTask.mpb); + bool isOnepart = combineTask.isOnepart; + if (isOnepart) + { + PartLoadTask partLoadTask4 = combineTask.parts[XFastEnumIntEqualityComparer.ToInt(EPartType.ECombinePartStart)] as PartLoadTask; + PartLoadTask partLoadTask5 = combineTask.parts[XFastEnumIntEqualityComparer.ToInt(EPartType.EHair)] as PartLoadTask; + PartLoadTask partLoadTask6 = combineTask.parts[XFastEnumIntEqualityComparer.ToInt(EPartType.EHeadgear)] as PartLoadTask; + Texture texture = partLoadTask5.GetTexture(); + ShaderManager.SetTexture(combineTask.mpb, partLoadTask4.GetTexture(), ShaderManager._ShaderKeyIDFace); + bool flag11 = texture == null; + if (flag11) + { + ShaderManager.SetTexture(combineTask.mpb, partLoadTask6.GetTexture(), ShaderManager._ShaderKeyIDHair); + } + else + { + ShaderManager.SetTexture(combineTask.mpb, texture, ShaderManager._ShaderKeyIDHair); + } + bool flag12 = partLoadTask2 != null; + if (flag12) + { + ShaderManager.SetTexture(combineTask.mpb, partLoadTask2.GetTexture(), ShaderManager._ShaderKeyIDBody); + bool flag13 = flag3; + if (flag13) + { + ShaderManager.SetTexture(combineTask.mpb, partLoadTask2.GetAlpha(), ShaderManager._ShaderKeyIDAlpha); + } + } + } + else + { + int k = 0; + int num3 = XFastEnumIntEqualityComparer.ToInt(EPartType.ECombinePartEnd); + while (k < num3) + { + PartLoadTask partLoadTask7 = combineTask.parts[k] as PartLoadTask; + bool flag14 = partLoadTask7.HasMesh(); + if (flag14) + { + ShaderManager.SetTexture(combineTask.mpb, partLoadTask7.GetTexture(), ShaderManager._ShaderKeyIDSkin[k]); + } + k++; + } + } + } + result = true; + } + else + { + result = false; + } + return result; + } + } +} -- cgit v1.1-26-g67d0