diff options
Diffstat (limited to 'Assets/Scripts/Unit/Components/UnitLensEffect.cs')
-rw-r--r-- | Assets/Scripts/Unit/Components/UnitLensEffect.cs | 234 |
1 files changed, 0 insertions, 234 deletions
diff --git a/Assets/Scripts/Unit/Components/UnitLensEffect.cs b/Assets/Scripts/Unit/Components/UnitLensEffect.cs deleted file mode 100644 index e145c331..00000000 --- a/Assets/Scripts/Unit/Components/UnitLensEffect.cs +++ /dev/null @@ -1,234 +0,0 @@ -using System; -using System.Reflection; -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using UnityEngine.Rendering; - -// Unit效果之一,镜头效果,通过command buffer实现 - -public partial class UnitLensEffect : UnitComponent -{
- private List<RendererProxy> renderers;
-
- private static ObjectPool<CommandBuffer> m_CommandBufferPool;
-
- private List<LensEffectBase> m_Effects; - - // 每个角色维护单独的command buffers,而不是共享command buffer。有一定开销,但不重要。 - private Dictionary<ERenderingEvent, CommandBuffer> m_InUseCommandBuffers;
- private Dictionary<ERenderingEvent, CommandBuffer> m_CachedCommandBuffers;
-
- static UnitLensEffect()
- {
- m_CommandBufferPool = new ObjectPool<CommandBuffer>(null, null);
- }
-
- public override void Initialize()
- {
- base.Initialize();
-
- renderers = new List<RendererProxy>();
- m_Effects = new List<LensEffectBase>(); - m_InUseCommandBuffers = new Dictionary<ERenderingEvent, CommandBuffer>(); - m_CachedCommandBuffers = new Dictionary<ERenderingEvent, CommandBuffer>(); - }
-
- public override void OnUpdate()
- {
- base.OnUpdate();
-
- }
-
- public override void OnPostInitialize()
- {
- base.OnPostInitialize();
-
- IBodyRendererAgent body = owner.unitRender.body;
- if (body == null || body.renderers == null)
- return;
- for (int i = 0; i < body.renderers.Length; ++i)
- {
- var renderer = body.renderers[i];
- if (renderer == null)
- continue;
- RendererProxy proxy = renderer.renderer.gameObject.GetOrAddComponent<RendererProxy>();
- proxy.Initialize(renderer);
- proxy.onWillRenderObject = OnWillRenderObj;
- proxy.onRenderObject = OnRenderObj;
- renderers.Add(proxy);
- }
-
- MainCamera.Instance.customRenderingPipeline.onPreCull += OnWillRenderUnit;
- MainCamera.Instance.customRenderingPipeline.onPostRender += OnRenderUnit;
-
- /////
- //m_Effects.Add(new LensEffect_MotionBlur());
- //m_Effects.Add(new LensEffect_BlurRim(Color.blue));
- //m_Effects.Add(new LensEffect_Buzz());
- }
-
- public override void Release()
- {
- MainCamera.Instance.customRenderingPipeline.onPreCull -= OnWillRenderUnit;
- MainCamera.Instance.customRenderingPipeline.onPostRender -= OnRenderUnit;
-
- base.Release();
- }
-
- private void OnWillRenderUnit()
- { - if (m_Effects == null || m_Effects.Count == 0) - return; - - PrepareCommandBuffers(); -
- IBodyRendererAgent body = owner.unitRender.body;
- if (body == null || body.renderers == null)
- return;
- if (m_Effects == null || m_Effects.Count == 0)
- return;
- foreach (var cb in m_InUseCommandBuffers)
- {
- cb.Value.Clear();
- ERenderingEvent re = cb.Key;
- CameraEvent ce = re.ToCameraEvent();
- for (int i = 0; i < m_Effects.Count; ++i)
- {
- LensEffectBase eff = m_Effects[i];
- if (!eff.renderingEvents.HasFlag(re))
- continue;
- MethodInfo method = eff.GetType().GetMethod(re.ToString(), BindingFlags.Instance | BindingFlags.Public, null, new Type[] { typeof(LensEffectBase.EStage), typeof(CommandBuffer) }, null);
- if (method == null)
- continue;
- eff.owner = owner;
- method.Invoke(eff, new object[] { LensEffectBase.EStage.BeforeIterate, cb.Value });
-
- // iterate unit renderers
- for (int j = 0; j < body.renderers.Length; ++j)
- {
- var renderer = body.renderers[j];
- if (renderer == null)
- continue;
- eff.curBodypartRenderer = renderer;
- method.Invoke(eff, new object[] { LensEffectBase.EStage.Iterate, cb.Value });
- }
-
- method.Invoke(eff, new object[] { LensEffectBase.EStage.AfterIterate, cb.Value });
- } - MainCamera.Instance.camera.AddCommandBuffer(ce, cb.Value); - }
- }
-
- private void OnRenderUnit()
- { - if (m_Effects == null || m_Effects.Count == 0) - return;
-
- // 执行每个event的finisher
- foreach (var cb in m_InUseCommandBuffers)
- {
- ERenderingEvent re = cb.Key;
- for (int i = 0; i < m_Effects.Count; ++i)
- {
- LensEffectBase eff = m_Effects[i];
- if (!eff.renderingEvents.HasFlag(re))
- continue;
- MethodInfo method = eff.GetType().GetMethod(re.ToString(), BindingFlags.Instance | BindingFlags.Public, null, new Type[] { typeof(LensEffectBase.EStage), typeof(CommandBuffer) }, null);
- if (method == null)
- continue;
- method.Invoke(eff, new object[] { LensEffectBase.EStage.FinishRender, cb.Value });
- }
- }
-
- List<LensEffectBase> temp = ListPool<LensEffectBase>.Get();
-
- for (int i = 0; i < m_Effects.Count; ++i)
- {
- LensEffectBase eff = m_Effects[i];
- eff.OnRenderFinish();
- if (eff.CanDestroy())
- temp.Add(eff);
- }
-
- for (int i = 0; i < temp.Count; ++i)
- {
- temp[i].OnDestroy();
- m_Effects.Remove(temp[i]);
- }
-
- ListPool<LensEffectBase>.Release(temp);
-
- foreach (var cb in m_InUseCommandBuffers)
- {
- CameraEvent ce = cb.Key.ToCameraEvent();
- MainCamera.Instance.camera.RemoveCommandBuffer(ce, cb.Value); - }
- }
-
- private void OnWillRenderObj(BodyPartRenderer renderer)
- {
- }
-
- private void OnRenderObj(BodyPartRenderer renderer)
- {
- } - - void PrepareCommandBuffers()
- {
- if (m_InUseCommandBuffers.Count != 0)
- {
- var temp = m_CachedCommandBuffers;
- m_CachedCommandBuffers = m_InUseCommandBuffers;
- m_InUseCommandBuffers = temp;
- }
- ERenderingEvent usedEvent = ERenderingEvent.None; - for (int i = 0; i < m_Effects.Count; ++i)
- {
- usedEvent |= m_Effects[i].renderingEvents;
- }
- foreach (ERenderingEvent evt in Enum.GetValues(typeof(ERenderingEvent)))
- {
- if (evt == ERenderingEvent.None)
- continue;
- if (usedEvent.HasFlag(evt))
- {
- CommandBuffer cb;
- if (m_CachedCommandBuffers.TryGetValue(evt, out cb))
- {
- m_CachedCommandBuffers.Remove(evt);
- }
- else
- {
- cb = m_CommandBufferPool.Get();
- cb.name = evt.ToString();
- }
- m_InUseCommandBuffers.Add(evt, cb);
- }
- }
- foreach (var cb in m_CachedCommandBuffers)
- {
- m_CommandBufferPool.Release(cb.Value);
- }
- m_CachedCommandBuffers.Clear();
- }
-
- static CommandBuffer ClaimCommandBuffer()
- {
- CommandBuffer cb = m_CommandBufferPool.Get();
- cb.Clear();
- return cb;
- }
-
- static void ReleaseCommandBuffer(ref CommandBuffer cb)
- {
- m_CommandBufferPool.Release(cb);
- cb = null;
- } - - public void AddEffect(LensEffectBase effect)
- {
- m_Effects.Add(effect);
- }
-
-}
\ No newline at end of file |