summaryrefslogtreecommitdiff
path: root/Assets/uGUI-2017.1/UnityEngine.UI/UI/Core
diff options
context:
space:
mode:
Diffstat (limited to 'Assets/uGUI-2017.1/UnityEngine.UI/UI/Core')
-rw-r--r--Assets/uGUI-2017.1/UnityEngine.UI/UI/Core/Graphics/MaskableGraphic.cs6
-rw-r--r--Assets/uGUI-2017.1/UnityEngine.UI/UI/Core/Mask/Mask.cs62
-rw-r--r--Assets/uGUI-2017.1/UnityEngine.UI/UI/Core/Mask/MaskUtilities.cs7
-rw-r--r--Assets/uGUI-2017.1/UnityEngine.UI/UI/Core/Mask/RectMask2D.cs20
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
+
}
}