diff --git a/Source/Engine/UI/GUI/CanvasContainer.cs b/Source/Engine/UI/GUI/CanvasContainer.cs
index f032a99d3..084a22503 100644
--- a/Source/Engine/UI/GUI/CanvasContainer.cs
+++ b/Source/Engine/UI/GUI/CanvasContainer.cs
@@ -41,11 +41,12 @@ namespace FlaxEngine.GUI
protected override void DrawChildren()
{
// Draw all screen space canvases
+ var layerMask = MainRenderTask.Instance?.ViewLayersMask ?? LayersMask.Default;
for (int i = 0; i < _children.Count; i++)
{
var child = (CanvasRootControl)_children[i];
- if (child.Visible && child.Is2D)
+ if (child.Visible && child.Is2D && layerMask.HasLayer(child.Canvas.Layer))
{
child.Draw();
}
@@ -69,10 +70,11 @@ namespace FlaxEngine.GUI
UICanvas.CalculateRay(ref location, out Ray ray);
// Test 3D
+ var layerMask = MainRenderTask.Instance?.ViewLayersMask ?? LayersMask.Default;
for (int i = _children.Count - 1; i >= 0 && _children.Count > 0; i--)
{
var child = (CanvasRootControl)_children[i];
- if (child.Visible && child.Enabled && child.Is3D)
+ if (child.Visible && child.Enabled && child.Is3D && layerMask.HasLayer(child.Canvas.Layer))
{
if (child.Intersects3D(ref ray, out var childLocation))
{
@@ -91,10 +93,11 @@ namespace FlaxEngine.GUI
// Check all children collisions with mouse and fire events for them
bool isFirst3DHandled = false;
+ var layerMask = MainRenderTask.Instance?.ViewLayersMask ?? LayersMask.Default;
for (int i = _children.Count - 1; i >= 0 && _children.Count > 0; i--)
{
var child = (CanvasRootControl)_children[i];
- if (child.Visible && child.Enabled)
+ if (child.Visible && child.Enabled && layerMask.HasLayer(child.Canvas.Layer))
{
// Fire events
if (child.Is2D)
@@ -156,10 +159,11 @@ namespace FlaxEngine.GUI
UICanvas.CalculateRay(ref location, out Ray ray);
// Test 3D
+ var layerMask = MainRenderTask.Instance?.ViewLayersMask ?? LayersMask.Default;
for (int i = _children.Count - 1; i >= 0 && _children.Count > 0; i--)
{
var child = (CanvasRootControl)_children[i];
- if (child.Visible && child.Enabled && child.Is3D)
+ if (child.Visible && child.Enabled && child.Is3D && layerMask.HasLayer(child.Canvas.Layer))
{
if (child.Intersects3D(ref ray, out var childLocation))
{
@@ -183,10 +187,11 @@ namespace FlaxEngine.GUI
UICanvas.CalculateRay(ref location, out Ray ray);
// Test 3D
+ var layerMask = MainRenderTask.Instance?.ViewLayersMask ?? LayersMask.Default;
for (int i = _children.Count - 1; i >= 0 && _children.Count > 0; i--)
{
var child = (CanvasRootControl)_children[i];
- if (child.Visible && child.Enabled && child.Is3D)
+ if (child.Visible && child.Enabled && child.Is3D && layerMask.HasLayer(child.Canvas.Layer))
{
if (child.Intersects3D(ref ray, out var childLocation))
{
@@ -210,10 +215,11 @@ namespace FlaxEngine.GUI
UICanvas.CalculateRay(ref location, out Ray ray);
// Test 3D
+ var layerMask = MainRenderTask.Instance?.ViewLayersMask ?? LayersMask.Default;
for (int i = _children.Count - 1; i >= 0 && _children.Count > 0; i--)
{
var child = (CanvasRootControl)_children[i];
- if (child.Visible && child.Enabled && child.Is3D)
+ if (child.Visible && child.Enabled && child.Is3D && layerMask.HasLayer(child.Canvas.Layer))
{
if (child.Intersects3D(ref ray, out var childLocation))
{
@@ -237,10 +243,11 @@ namespace FlaxEngine.GUI
UICanvas.CalculateRay(ref location, out Ray ray);
// Test 3D
+ var layerMask = MainRenderTask.Instance?.ViewLayersMask ?? LayersMask.Default;
for (int i = _children.Count - 1; i >= 0 && _children.Count > 0; i--)
{
var child = (CanvasRootControl)_children[i];
- if (child.Visible && child.Enabled && child.Is3D)
+ if (child.Visible && child.Enabled && child.Is3D && layerMask.HasLayer(child.Canvas.Layer))
{
if (child.Intersects3D(ref ray, out var childLocation))
{
diff --git a/Source/Engine/UI/GUI/CanvasRootControl.cs b/Source/Engine/UI/GUI/CanvasRootControl.cs
index b4fa067e3..b2ea9aaa0 100644
--- a/Source/Engine/UI/GUI/CanvasRootControl.cs
+++ b/Source/Engine/UI/GUI/CanvasRootControl.cs
@@ -74,6 +74,8 @@ namespace FlaxEngine.GUI
return false;
}
+ private bool SkipEvents => !_canvas.ReceivesEvents || !_canvas.IsVisible();
+
///
public override CursorType Cursor
{
@@ -197,7 +199,7 @@ namespace FlaxEngine.GUI
public override void Update(float deltaTime)
{
// UI navigation
- if (_canvas.ReceivesEvents)
+ if (SkipEvents)
{
UpdateNavigation(deltaTime, _canvas.NavigateUp.Name, NavDirection.Up, ref _navigationHeldTimeUp, ref _navigationRateTimeUp);
UpdateNavigation(deltaTime, _canvas.NavigateDown.Name, NavDirection.Down, ref _navigationHeldTimeDown, ref _navigationRateTimeDown);
@@ -267,7 +269,7 @@ namespace FlaxEngine.GUI
///
public override bool OnCharInput(char c)
{
- if (!_canvas.ReceivesEvents)
+ if (SkipEvents)
return false;
return base.OnCharInput(c);
@@ -276,7 +278,7 @@ namespace FlaxEngine.GUI
///
public override DragDropEffect OnDragDrop(ref Float2 location, DragData data)
{
- if (!_canvas.ReceivesEvents)
+ if (SkipEvents)
return DragDropEffect.None;
return base.OnDragDrop(ref location, data);
@@ -285,7 +287,7 @@ namespace FlaxEngine.GUI
///
public override DragDropEffect OnDragEnter(ref Float2 location, DragData data)
{
- if (!_canvas.ReceivesEvents)
+ if (SkipEvents)
return DragDropEffect.None;
return base.OnDragEnter(ref location, data);
@@ -294,7 +296,7 @@ namespace FlaxEngine.GUI
///
public override void OnDragLeave()
{
- if (!_canvas.ReceivesEvents)
+ if (SkipEvents)
return;
base.OnDragLeave();
@@ -303,7 +305,7 @@ namespace FlaxEngine.GUI
///
public override DragDropEffect OnDragMove(ref Float2 location, DragData data)
{
- if (!_canvas.ReceivesEvents)
+ if (SkipEvents)
return DragDropEffect.None;
return base.OnDragMove(ref location, data);
@@ -312,7 +314,7 @@ namespace FlaxEngine.GUI
///
public override bool OnKeyDown(KeyboardKeys key)
{
- if (!_canvas.ReceivesEvents)
+ if (SkipEvents)
return false;
return base.OnKeyDown(key);
@@ -321,7 +323,7 @@ namespace FlaxEngine.GUI
///
public override void OnKeyUp(KeyboardKeys key)
{
- if (!_canvas.ReceivesEvents)
+ if (SkipEvents)
return;
base.OnKeyUp(key);
@@ -330,7 +332,7 @@ namespace FlaxEngine.GUI
///
public override bool OnMouseDoubleClick(Float2 location, MouseButton button)
{
- if (!_canvas.ReceivesEvents)
+ if (SkipEvents)
return false;
return base.OnMouseDoubleClick(location, button);
@@ -339,7 +341,7 @@ namespace FlaxEngine.GUI
///
public override bool OnMouseDown(Float2 location, MouseButton button)
{
- if (!_canvas.ReceivesEvents)
+ if (SkipEvents)
return false;
return base.OnMouseDown(location, button);
@@ -348,7 +350,7 @@ namespace FlaxEngine.GUI
///
public override void OnMouseEnter(Float2 location)
{
- if (!_canvas.ReceivesEvents)
+ if (SkipEvents)
return;
_mousePosition = location;
@@ -359,8 +361,7 @@ namespace FlaxEngine.GUI
public override void OnMouseLeave()
{
_mousePosition = Float2.Zero;
-
- if (!_canvas.ReceivesEvents)
+ if (SkipEvents)
return;
base.OnMouseLeave();
@@ -369,7 +370,7 @@ namespace FlaxEngine.GUI
///
public override void OnMouseMove(Float2 location)
{
- if (!_canvas.ReceivesEvents)
+ if (SkipEvents)
return;
_mousePosition = location;
@@ -379,7 +380,7 @@ namespace FlaxEngine.GUI
///
public override bool OnMouseUp(Float2 location, MouseButton button)
{
- if (!_canvas.ReceivesEvents)
+ if (SkipEvents)
return false;
return base.OnMouseUp(location, button);
@@ -388,7 +389,7 @@ namespace FlaxEngine.GUI
///
public override bool OnMouseWheel(Float2 location, float delta)
{
- if (!_canvas.ReceivesEvents)
+ if (SkipEvents)
return false;
return base.OnMouseWheel(location, delta);
@@ -397,7 +398,7 @@ namespace FlaxEngine.GUI
///
public override void OnTouchEnter(Float2 location, int pointerId)
{
- if (!_canvas.ReceivesEvents)
+ if (SkipEvents)
return;
base.OnTouchEnter(location, pointerId);
@@ -406,7 +407,7 @@ namespace FlaxEngine.GUI
///
public override bool OnTouchDown(Float2 location, int pointerId)
{
- if (!_canvas.ReceivesEvents)
+ if (SkipEvents)
return false;
return base.OnTouchDown(location, pointerId);
@@ -415,7 +416,7 @@ namespace FlaxEngine.GUI
///
public override void OnTouchMove(Float2 location, int pointerId)
{
- if (!_canvas.ReceivesEvents)
+ if (SkipEvents)
return;
base.OnTouchMove(location, pointerId);
@@ -424,7 +425,7 @@ namespace FlaxEngine.GUI
///
public override bool OnTouchUp(Float2 location, int pointerId)
{
- if (!_canvas.ReceivesEvents)
+ if (SkipEvents)
return false;
return base.OnTouchUp(location, pointerId);
@@ -433,7 +434,7 @@ namespace FlaxEngine.GUI
///
public override void OnTouchLeave(int pointerId)
{
- if (!_canvas.ReceivesEvents)
+ if (SkipEvents)
return;
base.OnTouchLeave(pointerId);
diff --git a/Source/Engine/UI/UICanvas.cs b/Source/Engine/UI/UICanvas.cs
index edbec7f7d..bc8c360d1 100644
--- a/Source/Engine/UI/UICanvas.cs
+++ b/Source/Engine/UI/UICanvas.cs
@@ -66,6 +66,8 @@ namespace FlaxEngine
///
public override void Render(GPUContext context, ref RenderContext renderContext, GPUTexture input, GPUTexture output)
{
+ if (!Canvas.IsVisible(renderContext.View.RenderLayersMask))
+ return;
var bounds = Canvas.Bounds;
bounds.Transformation.Translation -= renderContext.View.Origin;
if (renderContext.View.Frustum.Contains(bounds.GetBoundingBox()) == ContainmentType.Disjoint)
@@ -873,6 +875,20 @@ namespace FlaxEngine
}
}
+ internal bool IsVisible()
+ {
+ return IsVisible(MainRenderTask.Instance?.ViewLayersMask ?? LayersMask.Default);
+ }
+
+ internal bool IsVisible(LayersMask layersMask)
+ {
+#if FLAX_EDITOR
+ if (_editorTask != null || _editorRoot != null)
+ return true;
+#endif
+ return layersMask.HasLayer(Layer);
+ }
+
#if FLAX_EDITOR
private SceneRenderTask _editorTask;
private ContainerControl _editorRoot;