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)