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