1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- using System;
- using UnityEngine;
- using UnityEngine.EventSystems;
- using UnityEngine.Rendering;
- using UnityEngine.Serialization;
- namespace UnityEngine.UI
- {
- [AddComponentMenu("UI/MaskAAA", 13)]
- [ExecuteAlways]
- [RequireComponent(typeof(RectTransform))]
- [DisallowMultipleComponent]
- /// <summary>
- /// A component for masking children elements.
- /// </summary>
- /// <remarks>
- /// By using this element any children elements that have masking enabled will mask where a sibling Graphic would write 0 to the stencil buffer.
- /// </remarks>
- public class MaskAAA : UnityEngine.UI.Mask
- {
- public bool m_ShowMaskGraphic
- {
- get { return showMaskGraphic; }
- }
- private Material m_MaskMaterial;
- private Material m_UnmaskMaterial;
- /// Stencil calculation time!
- public override Material GetModifiedMaterial(Material baseMaterial)
- {
- if (!MaskEnabled())
- return baseMaterial;
- var rootSortCanvas = MaskUtilities.FindRootSortOverrideCanvas(transform);
- var stencilDepth = MaskUtilities.GetStencilDepth(transform, rootSortCanvas);
- if (stencilDepth >= 8)
- {
- Debug.LogWarning("Attempting to use a stencil mask with depth > 8", gameObject);
- return baseMaterial;
- }
- int desiredStencilBit = 1 << stencilDepth;
- // if we are at the first level...
- // we want to destroy what is there
- if (desiredStencilBit == 1)
- {
- var maskMaterial = StencilMaterial.Add(baseMaterial, 1, StencilOp.Replace, CompareFunction.Always, m_ShowMaskGraphic ? ColorWriteMask.All : 0);
- StencilMaterial.Remove(m_MaskMaterial);
- m_MaskMaterial = maskMaterial;
- // var unmaskMaterial = StencilMaterial.Add(baseMaterial, 1, StencilOp.Zero, CompareFunction.Always, 0);
- // StencilMaterial.Remove(m_UnmaskMaterial);
- // m_UnmaskMaterial = unmaskMaterial;
- // graphic.canvasRenderer.popMaterialCount = 1;
- // graphic.canvasRenderer.SetPopMaterial(m_UnmaskMaterial, 0);
- return m_MaskMaterial;
- }
- //otherwise we need to be a bit smarter and set some read / write masks
- var maskMaterial2 = StencilMaterial.Add(baseMaterial, desiredStencilBit | (desiredStencilBit - 1), StencilOp.Replace, CompareFunction.Equal, m_ShowMaskGraphic ? ColorWriteMask.All : 0, desiredStencilBit - 1, desiredStencilBit | (desiredStencilBit - 1));
- StencilMaterial.Remove(m_MaskMaterial);
- m_MaskMaterial = maskMaterial2;
- graphic.canvasRenderer.hasPopInstruction = true;
- var unmaskMaterial2 = StencilMaterial.Add(baseMaterial, desiredStencilBit - 1, StencilOp.Replace, CompareFunction.Equal, 0, desiredStencilBit - 1, desiredStencilBit | (desiredStencilBit - 1));
- StencilMaterial.Remove(m_UnmaskMaterial);
- m_UnmaskMaterial = unmaskMaterial2;
- graphic.canvasRenderer.popMaterialCount = 1;
- graphic.canvasRenderer.SetPopMaterial(m_UnmaskMaterial, 0);
- return m_MaskMaterial;
- }
- }
- }
|