From 442d1ee6540717f732496d6f0feda1d0f1b628b5 Mon Sep 17 00:00:00 2001 From: Speiger Date: Tue, 18 Aug 2026 13:36:30 +0200 Subject: [PATCH] Small Progress on the Renderer --- .../ui/gui/renderer/IUIRenderer.java | 2 +- .../coreengine/ui/gui/renderer/LayerType.java | 1 - .../ui/gui/renderer/UIRenderer.java | 82 ++++++++++++++++--- 3 files changed, 73 insertions(+), 12 deletions(-) diff --git a/src/gui/java/speiger/src/coreengine/ui/gui/renderer/IUIRenderer.java b/src/gui/java/speiger/src/coreengine/ui/gui/renderer/IUIRenderer.java index 1091926..c0b30ce 100644 --- a/src/gui/java/speiger/src/coreengine/ui/gui/renderer/IUIRenderer.java +++ b/src/gui/java/speiger/src/coreengine/ui/gui/renderer/IUIRenderer.java @@ -26,7 +26,7 @@ public interface IUIRenderer { void alignH(Align align); void pushLayer(LayerType type); - void popLayer(); + void popLayer(LayerType type); void drawLine(float startX, float startY, float endX, float endY, float lineWidth, int color); diff --git a/src/gui/java/speiger/src/coreengine/ui/gui/renderer/LayerType.java b/src/gui/java/speiger/src/coreengine/ui/gui/renderer/LayerType.java index 5aaa209..0f3810c 100644 --- a/src/gui/java/speiger/src/coreengine/ui/gui/renderer/LayerType.java +++ b/src/gui/java/speiger/src/coreengine/ui/gui/renderer/LayerType.java @@ -1,7 +1,6 @@ package speiger.src.coreengine.ui.gui.renderer; public enum LayerType { - COMPONENT, COMPONENT_STACK, WINDOW; } \ No newline at end of file diff --git a/src/gui/java/speiger/src/coreengine/ui/gui/renderer/UIRenderer.java b/src/gui/java/speiger/src/coreengine/ui/gui/renderer/UIRenderer.java index 819eb62..20f8ded 100644 --- a/src/gui/java/speiger/src/coreengine/ui/gui/renderer/UIRenderer.java +++ b/src/gui/java/speiger/src/coreengine/ui/gui/renderer/UIRenderer.java @@ -2,12 +2,19 @@ package speiger.src.coreengine.ui.gui.renderer; import java.util.List; +import speiger.src.collections.ints.collections.IntStack; +import speiger.src.collections.ints.lists.IntArrayList; import speiger.src.collections.objects.lists.ObjectArrayList; +import speiger.src.collections.utils.Stack; +import speiger.src.coreengine.math.MathUtils; +import speiger.src.coreengine.math.bits.BitUtil; import speiger.src.coreengine.math.vector.matrix.Matrix4fStack; import speiger.src.coreengine.math.vector.quaternion.Quaternion; import speiger.src.coreengine.platform.graphics.api.core.GraphicsDevice; import speiger.src.coreengine.platform.graphics.api.shader.ShaderPipeline; import speiger.src.coreengine.platform.graphics.api.utils.SampledTexture; +import speiger.src.coreengine.platform.graphics.api.utils.ScissorsManager; +import speiger.src.coreengine.platform.graphics.api.utils.ScissorsManager.IScissorsHandler; import speiger.src.coreengine.platform.graphics.api.vertex.builder.IVertexBuffer.BufferResult; import speiger.src.coreengine.platform.graphics.api.vertex.builder.IVertexBuilder; import speiger.src.coreengine.platform.graphics.api.vertex.builder.VertexBuilder; @@ -21,26 +28,30 @@ public class UIRenderer implements IUIRenderer { VertexBuilder builder = new VertexBuilder(100); List draws = new ObjectArrayList<>(); Align[] alignment = new Align[] { Align.CENTER, Align.CENTER }; + Stack layers = new ObjectArrayList<>(); + int windowLayer = 1; + int currentComponent = 0; ShaderPipeline currentPipeline; SampledTexture currentTexture; + ScissorsManager clippingManager = new ScissorsManager(64, ScissorsManager.NoOp.INSTANCE); public UIRenderer(GraphicsDevice device) { this.device = device; } - + @Override public boolean isClipping(IGuiBox box) { - return false; + return clippingManager.contains(Math.round(box.getMinX()), Math.round(box.getMinY()), Math.round(box.getWidth()), Math.round(box.getHeight())); } @Override public void pushClip(IGuiBox box) { - + clippingManager.push(Math.round(box.getMinX()), Math.round(box.getMinY()), Math.round(box.getWidth()), Math.round(box.getHeight())); } @Override public void popClip() { - + clippingManager.pop(); } @Override @@ -83,12 +94,12 @@ public class UIRenderer implements IUIRenderer { alignment[0] = vertical; alignment[1] = horizontal; } - + @Override public void alignV(Align align) { alignment[0] = align; } - + @Override public void alignH(Align align) { alignment[1] = align; @@ -96,14 +107,44 @@ public class UIRenderer implements IUIRenderer { @Override public void pushLayer(LayerType type) { - + switch(type) { + case WINDOW: + layers.push(new WindowLayer(windowLayer++)); + break; + case COMPONENT_STACK: + if(layers.isEmpty()) return; + layers.top().push(); + break; + } } @Override - public void popLayer() { - + public void popLayer(LayerType type) { + switch(type) { + case WINDOW: + layers.pop(); + break; + case COMPONENT_STACK: + if(layers.isEmpty()) return; + layers.top().pop(); + break; + } } + /** + * Idea: + * public class DrawObject { + * int windowLayer; + * int componentLayer; + * ShaderPipeline pipeline; + * Int2ObjectMap textures; + * vec4 scissors; + * byte[] vertexData; + * } + * + * We pregenerate the draw call + */ + @Override public void drawLine(float startX, float startY, float endX, float endY, float lineWidth, int color) { ensureType(UIConstants.GUI, null); @@ -173,7 +214,7 @@ public class UIRenderer implements IUIRenderer { float minX = box.getMinX(); float minY = box.getMinY(); float maxX = box.getMaxX(); - float maxY = box.getMaxY(); + float maxY = box.getMaxY(); pos(minX, maxY, 0F, xOff, yOff).tex(minU, maxV).rgba(color); pos(minX, minY, 0F, xOff, yOff).tex(minU, minV).rgba(color); pos(maxX, maxY, 0F, xOff, yOff).tex(maxU, maxV).rgba(color); @@ -212,4 +253,25 @@ public class UIRenderer implements IUIRenderer { } protected record UIDraw(ShaderPipeline pipeline, SampledTexture texture, BufferResult result) {} + + private class WindowLayer { + final int layer; + IntStack stack = new IntArrayList(); + int currentLayer = 1; + public WindowLayer(int layer) { + this.layer = layer; + } + + private void push() { + stack.push(currentLayer++); + } + + private void pop() { + stack.pop(); + } + + public int currentLayer() { + return BitUtil.toInt(layer, stack.isEmpty() ? 0 : stack.top()); + } + } }