From a7e174cf744da8e87bcd8a1009f1f5f5076984d1 Mon Sep 17 00:00:00 2001 From: mcrcortex <18544518+MCRcortex@users.noreply.github.com> Date: Wed, 13 Apr 2022 23:07:02 +1000 Subject: [PATCH] Changed to using IBO drawElements for quads --- .../bufferBuilding/LodQuadBuilder.java | 26 ++------- .../lod/core/objects/opengl/QuadIBO.java | 58 +++++++++++++++++++ .../objects/opengl/SimpleRenderBuffer.java | 5 +- 3 files changed, 68 insertions(+), 21 deletions(-) create mode 100644 src/main/java/com/seibel/lod/core/objects/opengl/QuadIBO.java diff --git a/src/main/java/com/seibel/lod/core/builders/lodBuilding/bufferBuilding/LodQuadBuilder.java b/src/main/java/com/seibel/lod/core/builders/lodBuilding/bufferBuilding/LodQuadBuilder.java index 557e55406..1d91cc3fb 100644 --- a/src/main/java/com/seibel/lod/core/builders/lodBuilding/bufferBuilding/LodQuadBuilder.java +++ b/src/main/java/com/seibel/lod/core/builders/lodBuilding/bufferBuilding/LodQuadBuilder.java @@ -45,7 +45,7 @@ import static com.seibel.lod.core.render.LodRenderer.EVENT_LOGGER; public class LodQuadBuilder { static final int MAX_BUFFER_SIZE = (1024 * 1024); - static final int QUAD_BYTE_SIZE = (12 * 6); + static final int QUAD_BYTE_SIZE = (12 * 4); static final int MAX_QUADS_PER_BUFFER = MAX_BUFFER_SIZE / QUAD_BYTE_SIZE; static final ILodConfigWrapperSingleton CONFIG = SingletonHandler.get(ILodConfigWrapperSingleton.class); @@ -62,18 +62,12 @@ public class LodQuadBuilder { 1, 0 }, // 0 { 1, 1 }, // 1 { 0, 1 }, // 2 - - { 1, 0 }, // 0 - { 0, 1 }, // 2 { 0, 0 }, // 3 }, { // DOWN { 0, 0 }, // 0 { 0, 1 }, // 1 { 1, 1 }, // 2 - - { 0, 0 }, // 0 - { 1, 1 }, // 2 { 1, 0 }, // 3 }, @@ -82,18 +76,14 @@ public class LodQuadBuilder { 0, 0 }, // 0 { 0, 1 }, // 1 { 1, 1 }, // 2 - - { 0, 0 }, // 0 - { 1, 1 }, // 2 + { 1, 0 }, // 3 }, { // SOUTH { 1, 0 }, // 0 { 1, 1 }, // 1 { 0, 1 }, // 2 - - { 1, 0 }, // 0 - { 0, 1 }, // 2 + { 0, 0 }, // 3 }, @@ -102,18 +92,14 @@ public class LodQuadBuilder { 0, 0 }, // 0 { 1, 0 }, // 1 { 1, 1 }, // 2 - - { 0, 0 }, // 0 - { 1, 1 }, // 2 + { 0, 1 }, // 3 }, { // EAST { 0, 1 }, // 0 { 1, 1 }, // 1 { 1, 0 }, // 2 - - { 0, 1 }, // 0 - { 1, 0 }, // 2 + { 0, 0 }, // 3 }, }; @@ -406,7 +392,7 @@ public class LodQuadBuilder } bb.rewind(); vbo.unmapBuffer(method); - vbo.vertexCount = numOfQuads * 6; + vbo.vertexCount = numOfQuads * 4; return dir < 6; } diff --git a/src/main/java/com/seibel/lod/core/objects/opengl/QuadIBO.java b/src/main/java/com/seibel/lod/core/objects/opengl/QuadIBO.java new file mode 100644 index 000000000..dc907021b --- /dev/null +++ b/src/main/java/com/seibel/lod/core/objects/opengl/QuadIBO.java @@ -0,0 +1,58 @@ +package com.seibel.lod.core.objects.opengl; + +import org.lwjgl.system.MemoryUtil; + +import static org.lwjgl.opengl.GL11C.GL_UNSIGNED_INT; +import static org.lwjgl.opengl.GL15.GL_STATIC_DRAW; +import static org.lwjgl.opengl.GL45.*; + +public class QuadIBO { + //Datatype of the stored indices (can be GL_UNSIGNED_INT, GL_UNSIGNED_SHORT, GL_UNSIGNED_BYTE) + public int type; + //IBO object + int id; + //Current capacity (in quads) + int ccap; + + //Global object, used for sharing the IBO for any draw calls + public static QuadIBO GLOBAL = new QuadIBO(); + + public QuadIBO() { + id = glCreateBuffers(); + } + + public void resize(int cap) { + //If requested capacity is less than or equal to current capacity, ignore + if (cap <= ccap) + return; + //Not really necessary, just to stop constant resizes + cap *= 1.5; + System.out.println("Resizing from "+ccap+" to " + cap); + + ccap = cap; + + //TODO: DO DYNAMIC TYPES, just makes things more efficent + type = GL_UNSIGNED_INT; + int DT_SIZE = 4;//Datatype size (int: 4, short: 2, byte: 1) + + //Resize the buffer + glNamedBufferData(id, (long) DT_SIZE * 6 * cap, GL_STATIC_DRAW);// 4L is datatype + //Map and write the index data to the buffer + long ptr = nglMapNamedBuffer(id, GL_WRITE_ONLY); + for (int base = 0; base < cap; base++) { + //Write index's + MemoryUtil.memPutInt(ptr+(base*6*DT_SIZE+DT_SIZE*0),(int)(base*4 + 0)); + MemoryUtil.memPutInt(ptr+(base*6*DT_SIZE+DT_SIZE*1),(int)(base*4 + 1)); + MemoryUtil.memPutInt(ptr+(base*6*DT_SIZE+DT_SIZE*2),(int)(base*4 + 2)); + MemoryUtil.memPutInt(ptr+(base*6*DT_SIZE+DT_SIZE*3),(int)(base*4 + 2)); + MemoryUtil.memPutInt(ptr+(base*6*DT_SIZE+DT_SIZE*4),(int)(base*4 + 3)); + MemoryUtil.memPutInt(ptr+(base*6*DT_SIZE+DT_SIZE*5),(int)(base*4 + 0)); + } + glUnmapNamedBuffer(id); + } + + public void bind(int capacity) { + resize(capacity); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, id); + } +} diff --git a/src/main/java/com/seibel/lod/core/objects/opengl/SimpleRenderBuffer.java b/src/main/java/com/seibel/lod/core/objects/opengl/SimpleRenderBuffer.java index e845b3ac5..b2f8864b2 100644 --- a/src/main/java/com/seibel/lod/core/objects/opengl/SimpleRenderBuffer.java +++ b/src/main/java/com/seibel/lod/core/objects/opengl/SimpleRenderBuffer.java @@ -23,7 +23,9 @@ import java.nio.ByteBuffer; import java.util.Iterator; import java.util.concurrent.TimeUnit; +import com.mojang.authlib.minecraft.client.MinecraftClient; import com.seibel.lod.core.builders.lodBuilding.bufferBuilding.LodQuadBuilder; +import net.minecraft.client.Minecraft; import org.lwjgl.opengl.GL32; import com.seibel.lod.core.api.ApiShared; @@ -80,7 +82,8 @@ public class SimpleRenderBuffer extends RenderBuffer hasRendered = true; GL32.glBindBuffer(GL32.GL_ARRAY_BUFFER, vbo.id); shaderProgram.bindVertexBuffer(vbo.id); - GL32.glDrawArrays(GL32.GL_TRIANGLES, 0, vbo.vertexCount); + QuadIBO.GLOBAL.bind(vbo.vertexCount/4); + GL32.glDrawElements(GL32.GL_TRIANGLES, (vbo.vertexCount/4)*6, QuadIBO.GLOBAL.type, 0); //LodRenderer.tickLogger.info("Vertex buffer: {}", vbo); } return hasRendered;