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