| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 | using System.Collections.Generic;using UnityEngine;using UnityEngine.Profiling;namespace Coffee.UIParticleExtensions{    internal static class MeshHelper    {        public static List<bool> activeMeshIndices { get; private set; }        private static readonly List<CombineInstanceEx> s_CachedInstance;        private static int count;        public static void Init()        {            activeMeshIndices = new List<bool>();        }        static MeshHelper()        {            s_CachedInstance = new List<CombineInstanceEx>(8);            for (var i = 0; i < 8; i++)            {                s_CachedInstance.Add(new CombineInstanceEx());            }        }        private static CombineInstanceEx Get(int index, long hash)        {            if (0 < count && s_CachedInstance[count - 1].hash == hash)                return s_CachedInstance[count - 1];            if (s_CachedInstance.Count <= count)            {                var newInst = new CombineInstanceEx();                s_CachedInstance.Add(newInst);            }            var inst = s_CachedInstance[count];            inst.hash = hash;            if (inst.index != -1) return inst;            inst.index = index;            count++;            return inst;        }        public static Mesh GetTemporaryMesh()        {            return MeshPool.Rent();        }        public static void Push(int index, long hash, Mesh mesh, Matrix4x4 transform)        {            if (mesh.vertexCount <= 0)            {                DiscardTemporaryMesh(mesh);                return;            }            Profiler.BeginSample("[UIParticle] MeshHelper > Get CombineInstanceEx");            var inst = Get(index, hash);            Profiler.EndSample();            Profiler.BeginSample("[UIParticle] MeshHelper > Push To Mesh Helper");            inst.Push(mesh, transform);            Profiler.EndSample();            activeMeshIndices[inst.index] = true;        }        public static void Clear()        {            count = 0;            activeMeshIndices.Clear();            foreach (var inst in s_CachedInstance)            {                inst.Clear();            }        }        public static void CombineMesh(Mesh result)        {            if (count == 0) return;            for (var i = 0; i < count; i++)            {                Profiler.BeginSample("[UIParticle] MeshHelper > Combine Mesh Internal");                s_CachedInstance[i].Combine();                Profiler.EndSample();            }            Profiler.BeginSample("[UIParticle] MeshHelper > Combine Mesh");            var cis = CombineInstanceArrayPool.Get(s_CachedInstance, count);            result.CombineMeshes(cis, false, true);            cis.Clear();            Profiler.EndSample();            result.RecalculateBounds();        }        public static void DiscardTemporaryMesh(Mesh mesh)        {            MeshPool.Return(mesh);        }    }}
 |