More work on the buffers
This commit is contained in:
parent
d0a462aed8
commit
ba4fa73cad
@ -31,6 +31,8 @@ public interface IUIRenderer {
|
|||||||
|
|
||||||
public void drawCustom(Consumer<Matrix4f> matrix);
|
public void drawCustom(Consumer<Matrix4f> matrix);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void drawLine(float minX, float minY, float maxX, float maxY, float zLevel, int color);
|
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); }
|
public default void drawFrame(IGuiBox box, int color) { drawFrame(box.getMinX(), box.getMinY(), box.getMaxX(), box.getMaxY(), 0F, color); }
|
||||||
|
@ -15,4 +15,6 @@ public interface IVertexBuffer {
|
|||||||
public IVertexBuffer normal(float x, float y, float z);
|
public IVertexBuffer normal(float x, float y, float z);
|
||||||
|
|
||||||
public IVertexBuffer endVertex();
|
public IVertexBuffer endVertex();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,17 @@
|
|||||||
package speiger.src.coreengine.rendering.tesselation.buffer;
|
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;
|
||||||
import speiger.src.coreengine.rendering.tesselation.format.VertexElement.Usage;
|
import speiger.src.coreengine.rendering.tesselation.format.VertexElement.Usage;
|
||||||
|
import speiger.src.coreengine.rendering.utils.values.GLMode;
|
||||||
|
|
||||||
public interface IVertexBuilder extends IVertexBuffer {
|
public interface IVertexBuilder extends IVertexBuffer {
|
||||||
public VertexElement current();
|
public VertexElement current();
|
||||||
public IVertexBuilder nextElement();
|
public IVertexBuilder nextElement();
|
||||||
|
public IVertexBuilder endDrawCall();
|
||||||
|
public List<BufferDrawCall> getDrawCalls();
|
||||||
|
|
||||||
public IVertexBuilder put(int offset, byte value);
|
public IVertexBuilder put(int offset, byte value);
|
||||||
public IVertexBuilder putShort(int offset, short value);
|
public IVertexBuilder putShort(int offset, short value);
|
||||||
public IVertexBuilder putInt(int offset, int 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+"]");
|
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) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,12 @@
|
|||||||
package speiger.src.coreengine.rendering.tesselation.buffer;
|
package speiger.src.coreengine.rendering.tesselation.buffer;
|
||||||
|
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import org.lwjgl.system.MemoryUtil;
|
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.VertexElement;
|
||||||
import speiger.src.coreengine.rendering.tesselation.format.VertexFormat;
|
import speiger.src.coreengine.rendering.tesselation.format.VertexFormat;
|
||||||
import speiger.src.coreengine.rendering.utils.values.GLMode;
|
import speiger.src.coreengine.rendering.utils.values.GLMode;
|
||||||
@ -17,6 +20,8 @@ public class VertexBuilder implements IVertexBuilder {
|
|||||||
int totalStoredBytes;
|
int totalStoredBytes;
|
||||||
int vertexBytes;
|
int vertexBytes;
|
||||||
int elementBytes;
|
int elementBytes;
|
||||||
|
int lastVertecies = 0;
|
||||||
|
List<BufferDrawCall> drawCalls;
|
||||||
|
|
||||||
public VertexBuilder(int size) {
|
public VertexBuilder(int size) {
|
||||||
this(MemoryUtil.memAlloc(size));
|
this(MemoryUtil.memAlloc(size));
|
||||||
@ -37,6 +42,26 @@ public class VertexBuilder implements IVertexBuilder {
|
|||||||
return this;
|
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
|
@Override
|
||||||
public IVertexBuffer endVertex() {
|
public IVertexBuffer endVertex() {
|
||||||
if(index != 0) throw new IllegalArgumentException("Format is not completed");
|
if(index != 0) throw new IllegalArgumentException("Format is not completed");
|
||||||
@ -46,9 +71,22 @@ public class VertexBuilder implements IVertexBuilder {
|
|||||||
vertecies++;
|
vertecies++;
|
||||||
}
|
}
|
||||||
vertexBytes = 0;
|
vertexBytes = 0;
|
||||||
|
//TODO ensure capacity too!
|
||||||
return this;
|
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<BufferDrawCall> getDrawCalls() {
|
||||||
|
return drawCalls == null ? ObjectLists.empty() : drawCalls;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public VertexElement current() {
|
public VertexElement current() {
|
||||||
return format.get(index);
|
return format.get(index);
|
||||||
@ -94,6 +132,19 @@ public class VertexBuilder implements IVertexBuilder {
|
|||||||
return this;
|
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() {
|
public byte[] getBytes() {
|
||||||
byte[] data = new byte[totalStoredBytes];
|
byte[] data = new byte[totalStoredBytes];
|
||||||
buffer.get(0, data);
|
buffer.get(0, data);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user