diff options
author | chai <chaifix@163.com> | 2021-01-25 14:28:30 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2021-01-25 14:28:30 +0800 |
commit | 6eb915c129fc90c6f4c82ae097dd6ffad5239efc (patch) | |
tree | 7dd2be50edf41f36b60fac84696e731c13afe617 /Client/Assets/Scripts/XMainClient/MatPackage.cs |
+scripts
Diffstat (limited to 'Client/Assets/Scripts/XMainClient/MatPackage.cs')
-rw-r--r-- | Client/Assets/Scripts/XMainClient/MatPackage.cs | 230 |
1 files changed, 230 insertions, 0 deletions
diff --git a/Client/Assets/Scripts/XMainClient/MatPackage.cs b/Client/Assets/Scripts/XMainClient/MatPackage.cs new file mode 100644 index 00000000..68bf931c --- /dev/null +++ b/Client/Assets/Scripts/XMainClient/MatPackage.cs @@ -0,0 +1,230 @@ +using System;
+using System.Collections.Generic;
+using UnityEngine;
+using XUtliPoolLib;
+
+namespace XMainClient
+{
+ public class MatPackage : IRenderObject
+ {
+ public int InstanceID
+ {
+ set
+ {
+ this.m_instanceID = value;
+ }
+ }
+
+ private static Queue<MatPackage> m_MatPackCache = new Queue<MatPackage>();
+
+ private static Color32 color32;
+
+ public Material srcMat = null;
+
+ public Shader srcShader = null;
+
+ public Color srcColor = new Color(1f, 1f, 1f, 1f);
+
+ private int m_instanceID = -1;
+
+ private GameObject m_renderGO = null;
+
+ private Renderer m_render = null;
+
+ private MaterialPropertyBlock m_mpb = new MaterialPropertyBlock();
+
+ private uint m_flag = 0u;
+
+ public string debugName = "";
+
+ public enum EFlag
+ {
+ EShaderChanged = 1,
+ EShaderPropertySet,
+ EIsCutout = 4,
+ EHasColor = 8
+ }
+
+ public bool GetFlag(MatPackage.EFlag flag)
+ {
+ return (this.m_flag & (uint)flag) > 0u;
+ }
+
+ public void SetFlag(MatPackage.EFlag flag, bool add)
+ {
+ if (add)
+ {
+ this.m_flag |= (uint)flag;
+ }
+ else
+ {
+ this.m_flag &= (uint)(~(uint)flag);
+ }
+ }
+
+ public bool IsSameObj(int id)
+ {
+ return this.m_instanceID == id;
+ }
+
+ public void SetRenderLayer(int layer)
+ {
+ bool flag = this.m_renderGO != null;
+ if (flag)
+ {
+ this.m_renderGO.layer = layer;
+ }
+ }
+
+ public void SetShader(int type)
+ {
+ bool flag = type == 0;
+ if (flag)
+ {
+ this.SetFadeShader();
+ }
+ else
+ {
+ this.SetFlag(MatPackage.EFlag.EShaderChanged, true);
+ }
+ }
+
+ public void SetFadeShader()
+ {
+ bool flag = this.srcMat != null;
+ if (flag)
+ {
+ bool flag2 = this.srcShader == ShaderManager._skin8 || this.srcShader == ShaderManager._skin_blend;
+ if (flag2)
+ {
+ this.srcMat.shader = ShaderManager._skin_effect;
+ }
+ else
+ {
+ bool flag3 = this.srcShader == ShaderManager._skin_cutout || this.srcShader == ShaderManager._skin_cutout4;
+ if (!flag3)
+ {
+ this.srcMat.shader = ShaderManager._fade_maskR_noLight;
+ }
+ }
+ this.SetFlag(MatPackage.EFlag.EShaderChanged, true);
+ }
+ }
+
+ public void ResetShader()
+ {
+ bool flag = this.srcMat != null;
+ if (flag)
+ {
+ bool flag2 = this.srcMat.shader != this.srcShader;
+ if (flag2)
+ {
+ this.srcMat.shader = this.srcShader;
+ }
+ this.SetFlag(MatPackage.EFlag.EShaderChanged, false);
+ bool flag3 = this.m_render != null && this.m_mpb != null;
+ if (flag3)
+ {
+ bool flag4 = this.GetFlag(MatPackage.EFlag.EHasColor);
+ if (flag4)
+ {
+ ShaderManager.SetColor(this.m_mpb, this.srcColor, ShaderManager._ShaderKeyIDColor0);
+ this.m_render.SetPropertyBlock(this.m_mpb);
+ }
+ }
+ }
+ }
+
+ public void SetColor(byte r, byte g, byte b, byte a)
+ {
+ bool flag = this.GetFlag(MatPackage.EFlag.EShaderChanged);
+ if (flag)
+ {
+ MatPackage.color32.r = r;
+ MatPackage.color32.g = g;
+ MatPackage.color32.b = b;
+ MatPackage.color32.a = a;
+ ShaderManager.SetColor32(this.m_mpb, MatPackage.color32, ShaderManager._ShaderKeyIDColor0);
+ this.SetFlag(MatPackage.EFlag.EShaderPropertySet, true);
+ }
+ }
+
+ public void SetColor(Color32 c)
+ {
+ bool flag = this.GetFlag(MatPackage.EFlag.EShaderChanged);
+ if (flag)
+ {
+ ShaderManager.SetColor(this.m_mpb, c, ShaderManager._ShaderKeyIDColor0);
+ this.SetFlag(MatPackage.EFlag.EShaderPropertySet, true);
+ }
+ }
+
+ public void Update()
+ {
+ bool flag = this.m_render != null && this.m_mpb != null && this.GetFlag(MatPackage.EFlag.EShaderPropertySet);
+ if (flag)
+ {
+ this.m_render.SetPropertyBlock(this.m_mpb);
+ this.SetFlag(MatPackage.EFlag.EShaderPropertySet, false);
+ }
+ }
+
+ public void Clean()
+ {
+ this.debugName = "";
+ this.srcMat = null;
+ this.m_instanceID = -1;
+ this.m_render = null;
+ this.m_renderGO = null;
+ this.m_flag = 0u;
+ bool flag = this.m_mpb != null;
+ if (flag)
+ {
+ this.m_mpb.Clear();
+ }
+ MatPackage.ReturnMatPack(this);
+ }
+
+ private static void ReturnMatPack(MatPackage matPack)
+ {
+ MatPackage.m_MatPackCache.Enqueue(matPack);
+ }
+
+ public static MatPackage GetMatPack(Material mat, Renderer render)
+ {
+ bool flag = MatPackage.m_MatPackCache.Count > 0;
+ MatPackage matPackage;
+ if (flag)
+ {
+ matPackage = MatPackage.m_MatPackCache.Dequeue();
+ }
+ else
+ {
+ matPackage = new MatPackage();
+ }
+ matPackage.debugName = render.gameObject.name;
+ matPackage.m_render = render;
+ matPackage.m_renderGO = render.gameObject;
+ bool flag2 = mat != null;
+ if (flag2)
+ {
+ matPackage.srcMat = mat;
+ matPackage.srcShader = mat.shader;
+ matPackage.SetFlag(MatPackage.EFlag.EIsCutout, matPackage.srcMat.HasProperty("_Cutoff"));
+ bool flag3 = matPackage.srcMat.HasProperty("_Color");
+ matPackage.SetFlag(MatPackage.EFlag.EHasColor, flag3);
+ bool flag4 = flag3;
+ if (flag4)
+ {
+ matPackage.srcColor = matPackage.srcMat.GetColor("_Color");
+ }
+ }
+ bool flag5 = render != null;
+ if (flag5)
+ {
+ render.GetPropertyBlock(matPackage.m_mpb);
+ }
+ return matPackage;
+ }
+ }
+}
|