diff options
author | chai <chaifix@163.com> | 2021-04-12 19:23:37 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2021-04-12 19:23:37 +0800 |
commit | 5e7fdb87120bb1883b4358df6f3248c0fc43c917 (patch) | |
tree | 6a742e388cbbd3148473fb46b40ab8ede6d5aa51 /Assets/uGUI-2017.1/UnityEngine.UI/UI/Core | |
parent | 6aed8a5cf13145e6291e4e95ee6774d5e5b4b3b8 (diff) |
*mask
Diffstat (limited to 'Assets/uGUI-2017.1/UnityEngine.UI/UI/Core')
4 files changed, 82 insertions, 13 deletions
diff --git a/Assets/uGUI-2017.1/UnityEngine.UI/UI/Core/Graphics/MaskableGraphic.cs b/Assets/uGUI-2017.1/UnityEngine.UI/UI/Core/Graphics/MaskableGraphic.cs index 51e2fe2..0d0f327 100644 --- a/Assets/uGUI-2017.1/UnityEngine.UI/UI/Core/Graphics/MaskableGraphic.cs +++ b/Assets/uGUI-2017.1/UnityEngine.UI/UI/Core/Graphics/MaskableGraphic.cs @@ -68,6 +68,7 @@ namespace UnityEngine.UI if (m_ShouldRecalculateStencil) { var rootCanvas = MaskUtilities.FindRootSortOverrideCanvas(transform); + // Graphic在masks下的深度,如果不是0且没有mask组件意味着是普通的非mask用graphic(如果是0一定是mask用的graphic) m_StencilValue = maskable ? MaskUtilities.GetStencilDepth(transform, rootCanvas) : 0; m_ShouldRecalculateStencil = false; } @@ -78,6 +79,11 @@ namespace UnityEngine.UI Mask maskComponent = GetComponent<Mask>(); if (m_StencilValue > 0 && (maskComponent == null || !maskComponent.IsActive())) { + // Ref = (1 << stencilValue) - 1 + // Op = Keep + // Func = Equal + // ReadMask = (1 << stencilValue) - 1 + // WriteMask = 0 var maskMat = StencilMaterial.Add(toUse, (1 << m_StencilValue) - 1, StencilOp.Keep, CompareFunction.Equal, ColorWriteMask.All, (1 << m_StencilValue) - 1, 0); StencilMaterial.Remove(m_MaskMaterial); m_MaskMaterial = maskMat; diff --git a/Assets/uGUI-2017.1/UnityEngine.UI/UI/Core/Mask/Mask.cs b/Assets/uGUI-2017.1/UnityEngine.UI/UI/Core/Mask/Mask.cs index 39dc291..19a5575 100644 --- a/Assets/uGUI-2017.1/UnityEngine.UI/UI/Core/Mask/Mask.cs +++ b/Assets/uGUI-2017.1/UnityEngine.UI/UI/Core/Mask/Mask.cs @@ -41,13 +41,11 @@ namespace UnityEngine.UI public Graphic graphic { get { return m_Graphic ?? (m_Graphic = GetComponent<Graphic>()); } - } - - [NonSerialized] - private Material m_MaskMaterial; - - [NonSerialized] - private Material m_UnmaskMaterial; + }
+
+ [NonSerialized] private Material m_MaskMaterial;
+
+ [NonSerialized] private Material m_UnmaskMaterial; protected Mask() {} @@ -123,7 +121,7 @@ namespace UnityEngine.UI var rootSortCanvas = MaskUtilities.FindRootSortOverrideCanvas(transform); var stencilDepth = MaskUtilities.GetStencilDepth(transform, rootSortCanvas); - if (stencilDepth >= 8) + if (stencilDepth >= 8) // 不支持8层及以上的mask, 0-7支持,这是因为stencilRef和stencilMask只有一个字节 { Debug.LogError("Attempting to use a stencil mask with depth > 8", gameObject); return baseMaterial; @@ -133,12 +131,22 @@ namespace UnityEngine.UI // if we are at the first level... // we want to destroy what is there - if (desiredStencilBit == 1) - { + if (desiredStencilBit == 1) // 最上层的mask + {
+ // Ref = 1
+ // Op = Replace
+ // Func = Always
+ // ReadMask = 255
+ // WriteMask = 255
var maskMaterial = StencilMaterial.Add(baseMaterial, 1, StencilOp.Replace, CompareFunction.Always, m_ShowMaskGraphic ? ColorWriteMask.All : 0); StencilMaterial.Remove(m_MaskMaterial); - m_MaskMaterial = maskMaterial; - + m_MaskMaterial = maskMaterial;
+
+ // Ref = 1
+ // Op = Zero
+ // Func = Always
+ // ReadMask = 255
+ // WriteMask = 255
var unmaskMaterial = StencilMaterial.Add(baseMaterial, 1, StencilOp.Zero, CompareFunction.Always, 0); StencilMaterial.Remove(m_UnmaskMaterial); m_UnmaskMaterial = unmaskMaterial; @@ -148,11 +156,22 @@ namespace UnityEngine.UI return m_MaskMaterial; } + // Ref = desiredStencilBit | (desiredStencilBit - 1) + // Op = Replace + // Func = Equal + // ReadMask = desiredStencilBit - 1 + // WriteMask = desiredStencilBit | (desiredStencilBit - 1) + //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; + // Ref = desiredStencilBit - 1 + // Op = Replace + // Func = Equal + // ReadMask = desiredStencilBit - 1 + // WriteMask = desiredStencilBit | (desiredStencilBit - 1) 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); @@ -161,6 +180,25 @@ namespace UnityEngine.UI graphic.canvasRenderer.SetPopMaterial(m_UnmaskMaterial, 0); return m_MaskMaterial; + }
+
+
+ #region UGUI_DEBUG +
+ Vector3[] cornors = new Vector3[4];
+ + void OnDrawGizmos()
+ {
+ Rect rect = rectTransform.rect;
+ Gizmos.color = Color.yellow;
+ rectTransform.GetWorldCorners(cornors);
+ for (int i = 0; i < cornors.Length; ++i)
+ {
+ Gizmos.DrawLine(cornors[i], cornors[(i + 1) % cornors.Length]);
+ }
} + + #endregion + } } diff --git a/Assets/uGUI-2017.1/UnityEngine.UI/UI/Core/Mask/MaskUtilities.cs b/Assets/uGUI-2017.1/UnityEngine.UI/UI/Core/Mask/MaskUtilities.cs index c975dc6..6abce5a 100644 --- a/Assets/uGUI-2017.1/UnityEngine.UI/UI/Core/Mask/MaskUtilities.cs +++ b/Assets/uGUI-2017.1/UnityEngine.UI/UI/Core/Mask/MaskUtilities.cs @@ -37,6 +37,7 @@ namespace UnityEngine.UI ListPool<Component>.Release(components); } + //从下往上找到第一个OverrideSorting的canvas或者root(即null) public static Transform FindRootSortOverrideCanvas(Transform start) { var canvasList = ListPool<Canvas>.Get(); @@ -56,6 +57,7 @@ namespace UnityEngine.UI return canvas != null ? canvas.transform : null; } + // 返回Mask在canvas下(canvas下所有的masks下)的深度 public static int GetStencilDepth(Transform transform, Transform stopAfter) { var depth = 0; @@ -85,6 +87,7 @@ namespace UnityEngine.UI return depth; } + // father是child的祖先节点或者father == child public static bool IsDescendantOrSelf(Transform father, Transform child) { if (father == null || child == null) @@ -164,7 +167,9 @@ namespace UnityEngine.UI bool shouldAdd = true; for (int j = canvasComponents.Count - 1; j >= 0; j--) { - if (!IsDescendantOrSelf(canvasComponents[j].transform, rectMaskComponents[i].transform) && canvasComponents[j].overrideSorting) + // 如果rectMask2D是canvas的祖先节点且这个canvas勾选了OverrideSorting,那么这个rectMask2D就会失效 + if (!IsDescendantOrSelf(canvasComponents[j].transform, rectMaskComponents[i].transform) + && canvasComponents[j].overrideSorting) { shouldAdd = false; break; diff --git a/Assets/uGUI-2017.1/UnityEngine.UI/UI/Core/Mask/RectMask2D.cs b/Assets/uGUI-2017.1/UnityEngine.UI/UI/Core/Mask/RectMask2D.cs index 5f8f2e7..d973b34 100644 --- a/Assets/uGUI-2017.1/UnityEngine.UI/UI/Core/Mask/RectMask2D.cs +++ b/Assets/uGUI-2017.1/UnityEngine.UI/UI/Core/Mask/RectMask2D.cs @@ -16,6 +16,7 @@ namespace UnityEngine.UI [NonSerialized] private RectTransform m_RectTransform; + // 可裁剪的Graphics [NonSerialized] private HashSet<IClippable> m_ClipTargets = new HashSet<IClippable>(); @@ -173,6 +174,25 @@ namespace UnityEngine.UI { base.OnCanvasHierarchyChanged(); m_ShouldRecalculateClipRects = true; + }
+
+
+ #region UGUI_DEBUG +
+ Vector3[] cornors = new Vector3[4];
+ + void OnDrawGizmos()
+ {
+ Rect rect = rectTransform.rect;
+ Gizmos.color = Color.red;
+ rectTransform.GetWorldCorners(cornors);
+ for (int i = 0; i < cornors.Length; ++i)
+ {
+ Gizmos.DrawLine(cornors[i], cornors[(i + 1) % cornors.Length]);
+ }
} + + #endregion +
} } |