From 8ba21166bedcda491dc137b1cb9cfe1885d873e0 Mon Sep 17 00:00:00 2001 From: dnesov Date: Tue, 2 Jun 2026 00:59:29 +0200 Subject: [PATCH] Expose scissor mode, use it in UI --- Voile/Source/Rendering/RaylibRenderSystem.cs | 7 +++++++ Voile/Source/Rendering/RenderSystem.cs | 3 +++ Voile/Source/Rendering/StandardRenderSystem.cs | 10 ++++++++++ Voile/Source/UI/Containers/Container.cs | 4 ++++ Voile/Source/UI/UIElement.cs | 2 ++ 5 files changed, 26 insertions(+) diff --git a/Voile/Source/Rendering/RaylibRenderSystem.cs b/Voile/Source/Rendering/RaylibRenderSystem.cs index bad8981..068e5cf 100644 --- a/Voile/Source/Rendering/RaylibRenderSystem.cs +++ b/Voile/Source/Rendering/RaylibRenderSystem.cs @@ -139,6 +139,13 @@ namespace Voile.Rendering Raylib.EndBlendMode(); } + public override void BeginScissored(Vector2 position, Rect rect) + { + Raylib.BeginScissorMode((int)position.X, (int)position.Y, (int)rect.Width, (int)rect.Height); + } + + public override void EndScissored() => Raylib.EndScissorMode(); + public override void BeginCamera2d(Vector2 offset, Vector2 target, float rotation, float zoom) { var camera = new Camera2D(offset, target, rotation, zoom); diff --git a/Voile/Source/Rendering/RenderSystem.cs b/Voile/Source/Rendering/RenderSystem.cs index 58f330f..8da1b64 100644 --- a/Voile/Source/Rendering/RenderSystem.cs +++ b/Voile/Source/Rendering/RenderSystem.cs @@ -125,6 +125,9 @@ namespace Voile.Rendering public abstract void BeginBlended(BlendMode blendMode); public abstract void EndBlended(); + public abstract void BeginScissored(Vector2 position, Rect rect); + public abstract void EndScissored(); + /// /// Begins drawing using a 2D camera. /// diff --git a/Voile/Source/Rendering/StandardRenderSystem.cs b/Voile/Source/Rendering/StandardRenderSystem.cs index 7bede5c..86d016b 100644 --- a/Voile/Source/Rendering/StandardRenderSystem.cs +++ b/Voile/Source/Rendering/StandardRenderSystem.cs @@ -404,6 +404,16 @@ namespace Voile.Rendering throw new NotImplementedException(); } + public override void BeginScissored(Vector2 position, Rect rect) + { + throw new NotImplementedException(); + } + + public override void EndScissored() + { + throw new NotImplementedException(); + } + private Vector2 _windowSize = Vector2.Zero; private IWindow? _window; diff --git a/Voile/Source/UI/Containers/Container.cs b/Voile/Source/UI/Containers/Container.cs index 54f7d10..cd1b3e6 100644 --- a/Voile/Source/UI/Containers/Container.cs +++ b/Voile/Source/UI/Containers/Container.cs @@ -161,6 +161,8 @@ public abstract class Container : UIElement, IParentableElement protected override void OnRender(RenderSystem renderer, Style style) { + renderer.BeginScissored(GlobalPosition, LayoutSize); + foreach (var child in Children) { if (child is not IRenderableElement renderable) continue; @@ -172,6 +174,8 @@ public abstract class Container : UIElement, IParentableElement renderable.Render(renderer, childStyle); } + + renderer.EndScissored(); } private List _children = new(); diff --git a/Voile/Source/UI/UIElement.cs b/Voile/Source/UI/UIElement.cs index 29b789c..8a43901 100644 --- a/Voile/Source/UI/UIElement.cs +++ b/Voile/Source/UI/UIElement.cs @@ -109,7 +109,9 @@ public abstract class UIElement : IElement, IRenderableElement, IResizeableEleme public void Render(RenderSystem renderer, Style style) { RenderStyleBox(renderer, style); + renderer.BeginScissored(GlobalPosition, LayoutSize); OnRender(renderer, style); + renderer.EndScissored(); } public void DrawSize(RenderSystem renderer)