static void CopyMaskData(UnmaskedView.MaskData maskData, Dictionary <GUIViewProxy, MaskViewData> viewsAndResources) { viewsAndResources.Clear(); foreach (var unmaskedView in maskData.m_MaskData) { if (unmaskedView.Key == null) { continue; } var maskViewData = unmaskedView.Value; var unmaskedRegions = maskViewData.rects == null ? new List <Rect>(1) : maskViewData.rects.ToList(); if (unmaskedRegions.Count == 0) { unmaskedRegions.Add(new Rect(0f, 0f, unmaskedView.Key.Position.width, unmaskedView.Key.Position.height)); } viewsAndResources[unmaskedView.Key] = new MaskViewData() { maskType = maskViewData.maskType, rects = unmaskedRegions }; } }
/// <summary> /// Applies masking. /// </summary> /// <param name="unmaskedViewsAndRegionsMaskData"></param> /// <param name="maskColor"></param> /// <param name="highlightedRegionsMaskData"></param> /// <param name="highlightColor"></param> /// <param name="blockedInteractionsColor"></param> /// <param name="highlightThickness"></param> public static void Mask( UnmaskedView.MaskData unmaskedViewsAndRegionsMaskData, Color maskColor, UnmaskedView.MaskData highlightedRegionsMaskData, Color highlightColor, Color blockedInteractionsColor, float highlightThickness ) { Unmask(); CopyMaskData(unmaskedViewsAndRegionsMaskData, s_UnmaskedViews); CopyMaskData(highlightedRegionsMaskData, s_HighlightedViews); List <GUIViewProxy> views = new List <GUIViewProxy>(); GUIViewDebuggerHelperProxy.GetViews(views); foreach (var view in views) { if (!view.IsValid) { continue; } MaskViewData maskViewData; var viewRect = new Rect(0, 0, view.Position.width, view.Position.height); // mask everything except the unmasked view rects if (s_UnmaskedViews.TryGetValue(view, out maskViewData)) { // Beginning from 2021.2 the layout of floating/undocked EditorWindows has changed a bit and now contains // an offset caused by the tab area which we need to take into account. EditorWindow parentWindow = null; if (maskViewData.EditorWindowType != null) { parentWindow = FindOpenEditorWindowInstance(maskViewData.EditorWindowType); } List <Rect> rects = maskViewData.rects; var maskedRects = GetNegativeSpaceRects(viewRect, rects); for (var i = 0; i < maskedRects.Count; ++i) { var rect = maskedRects[i]; if (parentWindow != null && !parentWindow.IsDocked()) { // In theory we could have an X offset also but it seems highgly unlikely. rect.y -= parentWindow.rootVisualElement.layout.y; } var mask = new VisualElement(); mask.style.backgroundColor = maskColor; mask.SetLayout(rect); AddMaskToView(view, mask); s_Masks.Add(mask); } if (maskViewData.maskType == MaskType.BlockInteractions) { foreach (var rect in rects) { var mask = new VisualElement(); mask.style.backgroundColor = blockedInteractionsColor; mask.SetLayout(rect); AddMaskToView(view, mask); s_Masks.Add(mask); } } } else // mask the whole view { var mask = new VisualElement(); mask.style.backgroundColor = maskColor; mask.SetLayout(viewRect); AddMaskToView(view, mask); s_Masks.Add(mask); } if (s_HighlightedViews.TryGetValue(view, out maskViewData)) { var rects = maskViewData.rects; // unclip highlight to apply as "outer stroke" if it is being applied to some control(s) in the view var unclip = rects.Count > 1 || rects[0] != viewRect; var borderRadius = 5.0f; foreach (var rect in rects) { var highlighter = new VisualElement(); #if UNITY_2019_3_OR_NEWER highlighter.style.borderLeftColor = highlightColor; highlighter.style.borderRightColor = highlightColor; highlighter.style.borderTopColor = highlightColor; highlighter.style.borderBottomColor = highlightColor; #else highlighter.style.borderColor = highlightColor; #endif highlighter.style.borderLeftWidth = highlightThickness; highlighter.style.borderRightWidth = highlightThickness; highlighter.style.borderTopWidth = highlightThickness; highlighter.style.borderBottomWidth = highlightThickness; highlighter.style.borderBottomLeftRadius = borderRadius; highlighter.style.borderTopLeftRadius = borderRadius; highlighter.style.borderBottomRightRadius = borderRadius; highlighter.style.borderTopRightRadius = borderRadius; highlighter.pickingMode = PickingMode.Ignore; var layout = rect; if (unclip) { layout.xMin -= highlightThickness; layout.xMax += highlightThickness; layout.yMin -= highlightThickness; layout.yMax += highlightThickness; } highlighter.SetLayout(layout); UIElementsHelper.GetVisualTree(view).Add(highlighter); s_Highlighters.Add(highlighter); } } } s_LastHighlightTime = EditorApplication.timeSinceStartup; }
/// <summary> /// Applies masking. /// </summary> /// <param name="unmaskedViewsAndRegionsMaskData"></param> /// <param name="maskColor"></param> /// <param name="highlightedRegionsMaskData"></param> /// <param name="highlightColor"></param> /// <param name="blockedInteractionsColor"></param> /// <param name="highlightThickness"></param> public static void Mask( UnmaskedView.MaskData unmaskedViewsAndRegionsMaskData, Color maskColor, UnmaskedView.MaskData highlightedRegionsMaskData, Color highlightColor, Color blockedInteractionsColor, float highlightThickness ) { Unmask(); CopyMaskData(unmaskedViewsAndRegionsMaskData, s_UnmaskedViews); CopyMaskData(highlightedRegionsMaskData, s_HighlightedViews); List <GUIViewProxy> views = new List <GUIViewProxy>(); GUIViewDebuggerHelperProxy.GetViews(views); foreach (var view in views) { if (!view.IsValid) { continue; } MaskViewData maskViewData; var viewRect = new Rect(0, 0, view.Position.width, view.Position.height); // mask everything except the unmasked view rects if (s_UnmaskedViews.TryGetValue(view, out maskViewData)) { List <Rect> rects = maskViewData.rects; var maskedRects = GetNegativeSpaceRects(viewRect, rects); foreach (var rect in maskedRects) { var mask = new VisualElement(); mask.style.backgroundColor = maskColor; mask.SetLayout(rect); AddMaskToView(view, mask); s_Masks.Add(mask); } if (maskViewData.maskType == MaskType.BlockInteractions) { foreach (var rect in rects) { var mask = new VisualElement(); mask.style.backgroundColor = blockedInteractionsColor; mask.SetLayout(rect); AddMaskToView(view, mask); s_Masks.Add(mask); } } } // mask the whole view else { var mask = new VisualElement(); mask.style.backgroundColor = maskColor; mask.SetLayout(viewRect); AddMaskToView(view, mask); s_Masks.Add(mask); } if (s_HighlightedViews.TryGetValue(view, out maskViewData)) { var rects = maskViewData.rects; // unclip highlight to apply as "outer stroke" if it is being applied to some control(s) in the view var unclip = rects.Count > 1 || rects[0] != viewRect; var borderRadius = 5.0f; foreach (var rect in rects) { var highlighter = new VisualElement(); #if UNITY_2019_3_OR_NEWER highlighter.style.borderLeftColor = highlightColor; highlighter.style.borderRightColor = highlightColor; highlighter.style.borderTopColor = highlightColor; highlighter.style.borderBottomColor = highlightColor; #else highlighter.style.borderColor = highlightColor; #endif highlighter.style.borderLeftWidth = highlightThickness; highlighter.style.borderRightWidth = highlightThickness; highlighter.style.borderTopWidth = highlightThickness; highlighter.style.borderBottomWidth = highlightThickness; highlighter.style.borderBottomLeftRadius = borderRadius; highlighter.style.borderTopLeftRadius = borderRadius; highlighter.style.borderBottomRightRadius = borderRadius; highlighter.style.borderTopRightRadius = borderRadius; highlighter.pickingMode = PickingMode.Ignore; var layout = rect; if (unclip) { layout.xMin -= highlightThickness; layout.xMax += highlightThickness; layout.yMin -= highlightThickness; layout.yMax += highlightThickness; } highlighter.SetLayout(layout); UIElementsHelper.GetVisualTree(view).Add(highlighter); s_Highlighters.Add(highlighter); } } } s_LastHighlightTime = EditorApplication.timeSinceStartup; }