From ba4fa73cadcc3928c88e90e318c98502c3c28df1 Mon Sep 17 00:00:00 2001 From: Speiger Date: Sun, 23 Mar 2025 02:28:58 +0100 Subject: [PATCH] More work on the buffers --- .../rendering/gui/renderer/IUIRenderer.java | 2 + .../tesselation/buffer/IVertexBuffer.java | 2 + .../tesselation/buffer/IVertexBuilder.java | 11 ++++ .../tesselation/buffer/VertexBuilder.java | 51 +++++++++++++++++++ 4 files changed, 66 insertions(+) diff --git a/src/main/java/speiger/src/coreengine/rendering/gui/renderer/IUIRenderer.java b/src/main/java/speiger/src/coreengine/rendering/gui/renderer/IUIRenderer.java index b0eaeaa..6e0f7e1 100644 --- a/src/main/java/speiger/src/coreengine/rendering/gui/renderer/IUIRenderer.java +++ b/src/main/java/speiger/src/coreengine/rendering/gui/renderer/IUIRenderer.java @@ -31,6 +31,8 @@ public interface IUIRenderer { public void drawCustom(Consumer matrix); + + public void drawLine(float minX, float minY, float maxX, float maxY, float zLevel, int color); public default void drawFrame(IGuiBox box, int color) { drawFrame(box.getMinX(), box.getMinY(), box.getMaxX(), box.getMaxY(), 0F, color); } diff --git a/src/main/java/speiger/src/coreengine/rendering/tesselation/buffer/IVertexBuffer.java b/src/main/java/speiger/src/coreengine/rendering/tesselation/buffer/IVertexBuffer.java index 781a5f4..d24ba39 100644 --- a/src/main/java/speiger/src/coreengine/rendering/tesselation/buffer/IVertexBuffer.java +++ b/src/main/java/speiger/src/coreengine/rendering/tesselation/buffer/IVertexBuffer.java @@ -15,4 +15,6 @@ public interface IVertexBuffer { public IVertexBuffer normal(float x, float y, float z); public IVertexBuffer endVertex(); + + } diff --git a/src/main/java/speiger/src/coreengine/rendering/tesselation/buffer/IVertexBuilder.java b/src/main/java/speiger/src/coreengine/rendering/tesselation/buffer/IVertexBuilder.java index 08d882d..01e4d60 100644 --- a/src/main/java/speiger/src/coreengine/rendering/tesselation/buffer/IVertexBuilder.java +++ b/src/main/java/speiger/src/coreengine/rendering/tesselation/buffer/IVertexBuilder.java @@ -1,11 +1,17 @@ package speiger.src.coreengine.rendering.tesselation.buffer; +import java.util.List; + import speiger.src.coreengine.rendering.tesselation.format.VertexElement; import speiger.src.coreengine.rendering.tesselation.format.VertexElement.Usage; +import speiger.src.coreengine.rendering.utils.values.GLMode; public interface IVertexBuilder extends IVertexBuffer { public VertexElement current(); public IVertexBuilder nextElement(); + public IVertexBuilder endDrawCall(); + public List getDrawCalls(); + public IVertexBuilder put(int offset, byte value); public IVertexBuilder putShort(int offset, short value); public IVertexBuilder putInt(int offset, int value); @@ -73,4 +79,9 @@ public interface IVertexBuilder extends IVertexBuffer { throw new IllegalStateException("Expected State [Usage="+element.usage()+", Size="+element.size()+"], wasn't present. Actual State [Usage="+usage+", Size="+size+"]"); } } + + public record BufferDrawCall(GLMode mode, int startVertex, int endVertex) { + + } + } diff --git a/src/main/java/speiger/src/coreengine/rendering/tesselation/buffer/VertexBuilder.java b/src/main/java/speiger/src/coreengine/rendering/tesselation/buffer/VertexBuilder.java index e6da496..151678d 100644 --- a/src/main/java/speiger/src/coreengine/rendering/tesselation/buffer/VertexBuilder.java +++ b/src/main/java/speiger/src/coreengine/rendering/tesselation/buffer/VertexBuilder.java @@ -1,9 +1,12 @@ package speiger.src.coreengine.rendering.tesselation.buffer; import java.nio.ByteBuffer; +import java.util.List; import org.lwjgl.system.MemoryUtil; +import speiger.src.collections.objects.lists.ObjectArrayList; +import speiger.src.collections.objects.utils.ObjectLists; import speiger.src.coreengine.rendering.tesselation.format.VertexElement; import speiger.src.coreengine.rendering.tesselation.format.VertexFormat; import speiger.src.coreengine.rendering.utils.values.GLMode; @@ -17,6 +20,8 @@ public class VertexBuilder implements IVertexBuilder { int totalStoredBytes; int vertexBytes; int elementBytes; + int lastVertecies = 0; + List drawCalls; public VertexBuilder(int size) { this(MemoryUtil.memAlloc(size)); @@ -37,6 +42,26 @@ public class VertexBuilder implements IVertexBuilder { return this; } + private void ensureCapacity(int newValue) { + if(buffer.isDirect() && totalStoredBytes + newValue >= buffer.capacity()) { + int oldSize = buffer.capacity(); + int newSize = Math.max(oldSize + (oldSize >> 1), oldSize + newValue); + buffer = MemoryUtil.memRealloc(buffer, newSize); //TODO that if the old buffer gets deallocated + } + } + + public VertexBuilder reset() { + index = 0; + vertecies = 0; + elementBytes = 0; + totalStoredBytes = 0; + vertexBytes = 0; + lastVertecies = 0; + buffer.rewind(); + drawCalls = null; + return this; + } + @Override public IVertexBuffer endVertex() { if(index != 0) throw new IllegalArgumentException("Format is not completed"); @@ -46,9 +71,22 @@ public class VertexBuilder implements IVertexBuilder { vertecies++; } vertexBytes = 0; + //TODO ensure capacity too! return this; } + public VertexBuilder endDrawCall() { + if(drawCalls == null) drawCalls = new ObjectArrayList<>(); + drawCalls.add(new BufferDrawCall(mode, lastVertecies, vertecies)); + lastVertecies = vertecies; + return this; + } + + @Override + public List getDrawCalls() { + return drawCalls == null ? ObjectLists.empty() : drawCalls; + } + @Override public VertexElement current() { return format.get(index); @@ -94,6 +132,19 @@ public class VertexBuilder implements IVertexBuilder { return this; } + public VertexBuilder putBulk(ByteBuffer source) { + ensureCapacity(source.limit() + format.totalOffset()); + buffer.position(totalStoredBytes).put(source).position(0); + vertecies += source.limit() / format.totalOffset(); + totalStoredBytes += source.limit(); + return this; + } + + public VertexBuilder copy(ByteBuffer buffer) { + buffer.put(buffer.position(), this.buffer, 0, this.buffer.position()); + return this; + } + public byte[] getBytes() { byte[] data = new byte[totalStoredBytes]; buffer.get(0, data);