diff --git a/src/main/java/speiger/src/coreengine/math/vector/matrix/Matrix4f.java b/src/main/java/speiger/src/coreengine/math/vector/matrix/Matrix4f.java index 3da9be5..9d14e8b 100644 --- a/src/main/java/speiger/src/coreengine/math/vector/matrix/Matrix4f.java +++ b/src/main/java/speiger/src/coreengine/math/vector/matrix/Matrix4f.java @@ -525,36 +525,48 @@ public class Matrix4f { public Matrix4f scale(float value) { return scale(value, value, value); } public Matrix4f scale(float x, float y, float z) { - data[M00] *= x; - data[M01] *= x; - data[M02] *= x; - data[M03] *= x; - data[M10] *= y; - data[M11] *= y; - data[M12] *= y; - data[M13] *= y; - data[M20] *= z; - data[M21] *= z; - data[M22] *= z; - data[M23] *= z; + if(x != 1F) { + data[M00] *= x; + data[M01] *= x; + data[M02] *= x; + data[M03] *= x; + } + if(y != 1F) { + data[M10] *= y; + data[M11] *= y; + data[M12] *= y; + data[M13] *= y; + } + if(z != 1F) { + data[M20] *= z; + data[M21] *= z; + data[M22] *= z; + data[M23] *= z; + } return evaluateProps(); } public Matrix4f unscale(float scale) { return unscale(scale, scale, scale); } public Matrix4f unscale(float x, float y, float z) { - data[M00] /= x; - data[M01] /= x; - data[M02] /= x; - data[M03] /= x; - data[M10] /= y; - data[M11] /= y; - data[M12] /= y; - data[M13] /= y; - data[M20] /= z; - data[M21] /= z; - data[M22] /= z; - data[M23] /= z; + if(x != 1F) { + data[M00] /= x; + data[M01] /= x; + data[M02] /= x; + data[M03] /= x; + } + if(y != 1F) { + data[M10] /= y; + data[M11] /= y; + data[M12] /= y; + data[M13] /= y; + } + if(z != 1F) { + data[M20] /= z; + data[M21] /= z; + data[M22] /= z; + data[M23] /= z; + } return evaluateProps(); } diff --git a/src/main/java/speiger/src/coreengine/math/vector/matrix/Matrix4fStack.java b/src/main/java/speiger/src/coreengine/math/vector/matrix/Matrix4fStack.java index f992a78..de4d966 100644 --- a/src/main/java/speiger/src/coreengine/math/vector/matrix/Matrix4fStack.java +++ b/src/main/java/speiger/src/coreengine/math/vector/matrix/Matrix4fStack.java @@ -6,8 +6,10 @@ import speiger.src.collections.utils.Stack; public class Matrix4fStack extends Matrix4f { Stack stack = new ObjectArrayList<>(); - public void push() { - stack.push(new Matrix4f(this)); + public Matrix4f push() { + Matrix4f matrix = new Matrix4f(this); + stack.push(matrix); + return matrix; } public void pop() { @@ -17,4 +19,8 @@ public class Matrix4fStack extends Matrix4f { public int size() { return stack.size(); } + + public Matrix4f copyCurrent() { + return new Matrix4f(this); + } } diff --git a/src/main/java/speiger/src/coreengine/rendering/gui/renderer/SimpleUIRenderer.java b/src/main/java/speiger/src/coreengine/rendering/gui/renderer/SimpleUIRenderer.java index 5757574..937aa0b 100644 --- a/src/main/java/speiger/src/coreengine/rendering/gui/renderer/SimpleUIRenderer.java +++ b/src/main/java/speiger/src/coreengine/rendering/gui/renderer/SimpleUIRenderer.java @@ -1,18 +1,37 @@ package speiger.src.coreengine.rendering.gui.renderer; +import java.util.List; import java.util.function.Consumer; +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.misc.Facing; import speiger.src.coreengine.math.vector.matrix.Matrix4f; +import speiger.src.coreengine.math.vector.matrix.Matrix4fStack; import speiger.src.coreengine.math.vector.quaternion.Quaternion; import speiger.src.coreengine.rendering.guiOld.helper.box.IGuiBox; import speiger.src.coreengine.rendering.models.DrawCall; +import speiger.src.coreengine.rendering.tesselation.GLCall; +import speiger.src.coreengine.rendering.tesselation.buffer.VertexBuilder; -public class SimpleUIRenderer implements IUIRenderer { +public class SimpleUIRenderer implements IUIRenderer, AutoCloseable { TexturedRect cachedRect = new TexturedRect(); - Stack transformCache = ObjectArrayList.wrap(new Matrix4f()); + Matrix4fStack transform = new Matrix4fStack(); + List transformCache = new ObjectArrayList<>(); + IntStack indexCache = new IntArrayList(); + boolean matrixChanged = false; + + List drawCalls = new ObjectArrayList<>(); + Stack cache = new ObjectArrayList<>(); + + VertexBuilder builder = new VertexBuilder(Short.MAX_VALUE); + + @Override + public void close() throws Exception { + builder.close(); + } @Override public boolean isInScissors(IGuiBox box) { @@ -39,42 +58,52 @@ public class SimpleUIRenderer implements IUIRenderer { @Override public void pushTransform() { - transformCache.push(new Matrix4f(transformCache.top())); + transform.push(); + } @Override public void popTransform() { - + transform.pop(); + if(transform.size() > indexCache.size()) { + indexCache.pop(); + } } @Override public void translate(float z) { - + transform.translate(0, 0, z); + matrixChanged = true; } @Override public void translate(float x, float y) { - + transform.translate(x, y); + matrixChanged = true; } @Override public void translate(float x, float y, float z) { - + transform.translate(x, y, z); + matrixChanged = true; } @Override public void scale(float scale) { - + transform.scale(scale); + matrixChanged = true; } @Override public void scale(float x, float y) { - + transform.scale(x, y, 1F); + matrixChanged = true; } @Override public void rotate(Quaternion rotation) { - + transform.rotate(rotation); + matrixChanged = true; } @Override 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 151678d..b888b02 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 @@ -11,7 +11,7 @@ import speiger.src.coreengine.rendering.tesselation.format.VertexElement; import speiger.src.coreengine.rendering.tesselation.format.VertexFormat; import speiger.src.coreengine.rendering.utils.values.GLMode; -public class VertexBuilder implements IVertexBuilder { +public class VertexBuilder implements IVertexBuilder, AutoCloseable { GLMode mode; ByteBuffer buffer; VertexFormat format; @@ -43,10 +43,17 @@ public class VertexBuilder implements IVertexBuilder { } private void ensureCapacity(int newValue) { - if(buffer.isDirect() && totalStoredBytes + newValue >= buffer.capacity()) { + if(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 + if(buffer.isDirect()) { + buffer = MemoryUtil.memRealloc(buffer, newSize); + } + else { + ByteBuffer newBuffer = ByteBuffer.allocate(newSize); + newBuffer.put(buffer).position(0); + buffer = newBuffer; + } } } @@ -141,7 +148,7 @@ public class VertexBuilder implements IVertexBuilder { } public VertexBuilder copy(ByteBuffer buffer) { - buffer.put(buffer.position(), this.buffer, 0, this.buffer.position()); + buffer.put(buffer.position(), this.buffer, 0, totalStoredBytes); return this; }