diff --git a/core/src/main/java/com/seibel/distanthorizons/core/config/gui/OpenGLConfigScreen.java b/core/src/main/java/com/seibel/distanthorizons/core/config/gui/OpenGLConfigScreen.java index 586438062..831d30af8 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/config/gui/OpenGLConfigScreen.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/config/gui/OpenGLConfigScreen.java @@ -20,13 +20,11 @@ package com.seibel.distanthorizons.core.config.gui; import com.seibel.distanthorizons.api.enums.config.EGpuUploadMethod; -import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.render.glObject.GLProxy; import com.seibel.distanthorizons.core.render.glObject.GLState; import com.seibel.distanthorizons.core.render.glObject.buffer.GLVertexBuffer; import com.seibel.distanthorizons.core.render.glObject.shader.ShaderProgram; import com.seibel.distanthorizons.core.render.glObject.vertexAttribute.VertexAttribute; -import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper; import org.lwjgl.opengl.GL32; import java.nio.ByteBuffer; @@ -109,12 +107,12 @@ public class OpenGLConfigScreen extends AbstractScreen if (System.currentTimeMillis() % 2000 < 1000) { sameContextBuffer.bind(); - va.bindBufferToAllBindingPoint(sameContextBuffer.getId()); + va.bindBufferToAllBindingPoints(sameContextBuffer.getId()); } else { sameContextBuffer.bind(); - va.bindBufferToAllBindingPoint(sharedContextBuffer.getId()); + va.bindBufferToAllBindingPoints(sharedContextBuffer.getId()); } // Render the square GL32.glDrawArrays(GL32.GL_TRIANGLE_FAN, 0, 4); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/glObject/vertexAttribute/VertexAttribute.java b/core/src/main/java/com/seibel/distanthorizons/core/render/glObject/vertexAttribute/VertexAttribute.java index ff8bbdd65..f0515c5cc 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/glObject/vertexAttribute/VertexAttribute.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/glObject/vertexAttribute/VertexAttribute.java @@ -143,7 +143,7 @@ public abstract class VertexAttribute } // Requires VertexAttribute binded, VertexBuffer binded - public abstract void bindBufferToAllBindingPoint(int buffer); + public abstract void bindBufferToAllBindingPoints(int buffer); // Requires VertexAttribute binded, VertexBuffer binded public abstract void bindBufferToBindingPoint(int buffer, int bindingPoint); // Requires VertexAttribute binded diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/glObject/vertexAttribute/VertexAttributePostGL43.java b/core/src/main/java/com/seibel/distanthorizons/core/render/glObject/vertexAttribute/VertexAttributePostGL43.java index de2b06bb8..3fadb7bfe 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/glObject/vertexAttribute/VertexAttributePostGL43.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/glObject/vertexAttribute/VertexAttributePostGL43.java @@ -22,87 +22,126 @@ package com.seibel.distanthorizons.core.render.glObject.vertexAttribute; import com.seibel.distanthorizons.core.render.glObject.GLProxy; import org.lwjgl.opengl.GL43; -// In OpenGL 4.3 and later, Vertex Attribute got a make-over. -// Now it provides support for buffer binding points natively. -// This means that setting up the VAO just use ONE native call when -// binding to a buffer. -// -// Since I no longer needs to implement binding points, I also no -// longer needs to keep track of Pointers. - +/** + * In OpenGL 4.3 and later, Vertex Attribute got a make-over. + * Now it provides support for buffer binding points natively. + * This means that setting up the VAO just use ONE native call when + * binding to a buffer.

+ * + * Since I no longer needs to implement binding points, I also no + * longer needs to keep track of Pointers. + */ public final class VertexAttributePostGL43 extends VertexAttribute { - int numberOfBindingPoints = 0; int strideSize = 0; - // This will bind VertexAttribute + + + //=============// + // constructor // + //=============// + + /** This will bind the {@link VertexAttribute} */ public VertexAttributePostGL43() { super(); // also bind VertexAttribute } + + + //=========// + // binding // + //=========// + + /** Requires both VertexAttribute and VertexBuffer to be bound */ @Override - // Requires VertexAttribute binded, VertexBuffer binded - public void bindBufferToAllBindingPoint(int buffer) + public void bindBufferToAllBindingPoints(int buffer) { - for (int i = 0; i < numberOfBindingPoints; i++) + for (int i = 0; i < this.numberOfBindingPoints; i++) { - GL43.glBindVertexBuffer(i, buffer, 0, strideSize); + GL43.glBindVertexBuffer(i, buffer, 0, this.strideSize); } } + /** Requires both VertexAttribute and VertexBuffer to be bound */ @Override - // Requires VertexAttribute binded, VertexBuffer binded public void bindBufferToBindingPoint(int buffer, int bindingPoint) { - GL43.glBindVertexBuffer(bindingPoint, buffer, 0, strideSize); + GL43.glBindVertexBuffer(bindingPoint, buffer, 0, this.strideSize); } + + + //===========// + // unbinding // + //===========// + + /** Requires VertexAttribute to be bound */ @Override - // Requires VertexAttribute binded public void unbindBuffersFromAllBindingPoint() { - for (int i = 0; i < numberOfBindingPoints; i++) + for (int i = 0; i < this.numberOfBindingPoints; i++) { GL43.glBindVertexBuffer(i, 0, 0, 0); } } + /** Requires VertexAttribute to be bound */ @Override - // Requires VertexAttribute binded public void unbindBuffersFromBindingPoint(int bindingPoint) { GL43.glBindVertexBuffer(bindingPoint, 0, 0, 0); } + + + //==========================// + // manual attribute setting // + //==========================// + + /** Requires VertexAttribute to be bound */ @Override - // Requires VertexAttribute binded public void setVertexAttribute(int bindingPoint, int attributeIndex, VertexPointer attribute) { if (attribute.useInteger) - GL43.glVertexAttribIFormat(attributeIndex, attribute.elementCount, attribute.glType, strideSize); + { + GL43.glVertexAttribIFormat(attributeIndex, attribute.elementCount, attribute.glType, this.strideSize); + } else + { GL43.glVertexAttribFormat(attributeIndex, attribute.elementCount, attribute.glType, - attribute.normalized, strideSize); // Here strideSize is new attrib offset - strideSize += attribute.byteSize; - if (numberOfBindingPoints <= bindingPoint) numberOfBindingPoints = bindingPoint + 1; + attribute.normalized, this.strideSize); // Here strideSize is new attrib offset + } + + this.strideSize += attribute.byteSize; + if (this.numberOfBindingPoints <= bindingPoint) + { + this.numberOfBindingPoints = bindingPoint + 1; + } GL43.glVertexAttribBinding(attributeIndex, bindingPoint); GL43.glEnableVertexAttribArray(attributeIndex); } + + + //============// + // validation // + //============// + + /** Requires VertexAttribute to be bound */ @Override - // Requires VertexAttribute binded public void completeAndCheck(int expectedStrideSize) { - if (strideSize != expectedStrideSize) + if (this.strideSize != expectedStrideSize) { - GLProxy.GL_LOGGER.error("Vertex Attribute calculated stride size " + strideSize + + GLProxy.GL_LOGGER.error("Vertex Attribute calculated stride size " + this.strideSize + " does not match the provided expected stride size " + expectedStrideSize + "!"); throw new IllegalArgumentException("Vertex Attribute Incorrect Format"); } - GLProxy.GL_LOGGER.info("Vertex Attribute (GL43+) completed. It contains " + numberOfBindingPoints - + " binding points and a stride size of " + strideSize); + + GLProxy.GL_LOGGER.info("Vertex Attribute (GL43+) completed. It contains " + this.numberOfBindingPoints + + " binding points and a stride size of " + this.strideSize); } } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/glObject/vertexAttribute/VertexAttributePreGL43.java b/core/src/main/java/com/seibel/distanthorizons/core/render/glObject/vertexAttribute/VertexAttributePreGL43.java index 4e5c8a1f0..e7fdc5330 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/glObject/vertexAttribute/VertexAttributePreGL43.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/glObject/vertexAttribute/VertexAttributePreGL43.java @@ -30,9 +30,8 @@ import org.lwjgl.opengl.GL32; public final class VertexAttributePreGL43 extends VertexAttribute { - - // I tried to use as much raw arrays as possible as those lookups - // happens every frame, and the speed directly effects fps + // I tried to use raw arrays as much as possible since those lookups + // happens every frame, and the speed directly affects fps int strideSize = 0; int[][] bindingPointsToIndex; VertexPointer[] pointers; @@ -41,153 +40,202 @@ public final class VertexAttributePreGL43 extends VertexAttribute TreeMap> bindingPointsToIndexBuilder; ArrayList pointersBuilder; - // This will bind VertexAttribute + + + //=============// + // constructor // + //=============// + + /** This will bind the {@link VertexAttribute} */ public VertexAttributePreGL43() { super(); // also bind VertexAttribute - bindingPointsToIndexBuilder = new TreeMap>(); - pointersBuilder = new ArrayList(); + this.bindingPointsToIndexBuilder = new TreeMap<>(); + this.pointersBuilder = new ArrayList<>(); } + + + //=========// + // binding // + //=========// + + /** Requires both VertexAttribute and VertexBuffer to be bound */ @Override - // Requires VertexAttribute binded, VertexBuffer binded - public void bindBufferToAllBindingPoint(int buffer) + public void bindBufferToAllBindingPoints(int buffer) { - for (int i = 0; i < pointers.length; i++) + for (int i = 0; i < this.pointers.length; i++) { GL32.glEnableVertexAttribArray(i); } - for (int i = 0; i < pointers.length; i++) + for (int i = 0; i < this.pointers.length; i++) { - VertexPointer pointer = pointers[i]; - if (pointer == null) continue; + VertexPointer pointer = this.pointers[i]; + if (pointer == null) + { + continue; + } + if (pointer.useInteger) + { GL32.glVertexAttribIPointer(i, pointer.elementCount, pointer.glType, - strideSize, pointersOffset[i]); - else GL32.glVertexAttribPointer(i, pointer.elementCount, pointer.glType, - pointer.normalized, strideSize, pointersOffset[i]); + this.strideSize, this.pointersOffset[i]); + } + else + { + GL32.glVertexAttribPointer(i, pointer.elementCount, pointer.glType, + pointer.normalized, this.strideSize, this.pointersOffset[i]); + } } } + /** Requires both VertexAttribute and VertexBuffer to be bound */ @Override - // Requires VertexAttribute binded, VertexBuffer binded public void bindBufferToBindingPoint(int buffer, int bindingPoint) { - int[] toBind = bindingPointsToIndex[bindingPoint]; + int[] bindingPointIndexes = this.bindingPointsToIndex[bindingPoint]; - for (int k : toBind) + for (int bindingPointIndex : bindingPointIndexes) { - GL32.glEnableVertexAttribArray(k); + GL32.glEnableVertexAttribArray(bindingPointIndex); } - for (int j : toBind) + for (int bindingPointIndex : bindingPointIndexes) { - VertexPointer pointer = pointers[j]; + VertexPointer pointer = this.pointers[bindingPointIndex]; if (pointer == null) + { continue; + } + if (pointer.useInteger) - GL32.glVertexAttribIPointer(j, pointer.elementCount, pointer.glType, - strideSize, pointersOffset[j]); - else GL32.glVertexAttribPointer(j, pointer.elementCount, pointer.glType, - pointer.normalized, strideSize, pointersOffset[j]); + { + GL32.glVertexAttribIPointer(bindingPointIndex, pointer.elementCount, pointer.glType, + this.strideSize, this.pointersOffset[bindingPointIndex]); + } + else + { + GL32.glVertexAttribPointer(bindingPointIndex, pointer.elementCount, pointer.glType, + pointer.normalized, this.strideSize, this.pointersOffset[bindingPointIndex]); + } } } + + + + //===========// + // unbinding // + //===========// + + /** Requires VertexAttribute to be bound */ @Override - // Requires VertexAttribute binded public void unbindBuffersFromAllBindingPoint() { - for (int i = 0; i < pointers.length; i++) + for (int i = 0; i < this.pointers.length; i++) { GL32.glDisableVertexAttribArray(i); } } + /** Requires VertexAttribute to be bound */ @Override - // Requires VertexAttribute binded public void unbindBuffersFromBindingPoint(int bindingPoint) { - int[] toBind = bindingPointsToIndex[bindingPoint]; - - for (int j : toBind) + int[] bindingPointIndexes = this.bindingPointsToIndex[bindingPoint]; + for (int bindingPointIndex : bindingPointIndexes) { - GL32.glDisableVertexAttribArray(j); + GL32.glDisableVertexAttribArray(bindingPointIndex); } } + + + //==========================// + // manual attribute setting // + //==========================// + + /** Requires VertexAttribute to be bound */ @Override - // Requires VertexAttribute binded public void setVertexAttribute(int bindingPoint, int attributeIndex, VertexPointer attribute) { - TreeSet intArray = bindingPointsToIndexBuilder.computeIfAbsent(bindingPoint, k -> new TreeSet()); + TreeSet intArray = this.bindingPointsToIndexBuilder.computeIfAbsent(bindingPoint, k -> new TreeSet<>()); intArray.add(attributeIndex); - while (pointersBuilder.size() <= attributeIndex) + while (this.pointersBuilder.size() <= attributeIndex) { // This is dumb, but ArrayList doesn't have a resize, And this code - // should only be ran when it's building the Vertex Attribute anyways. - pointersBuilder.add(null); + // should only be run when it's building the Vertex Attribute anyway. + this.pointersBuilder.add(null); } - pointersBuilder.set(attributeIndex, attribute); + this.pointersBuilder.set(attributeIndex, attribute); } + + + //============// + // validation // + //============// + + /** Requires VertexAttribute to be bound */ @Override - // Requires VertexAttribute binded public void completeAndCheck(int expectedStrideSize) { - int maxBindPointNumber = bindingPointsToIndexBuilder.lastKey(); - bindingPointsToIndex = new int[maxBindPointNumber + 1][]; + int maxBindPointNumber = this.bindingPointsToIndexBuilder.lastKey(); + this.bindingPointsToIndex = new int[maxBindPointNumber + 1][]; - bindingPointsToIndexBuilder.forEach((Integer i, TreeSet set) -> { - bindingPointsToIndex[i] = new int[set.size()]; + this.bindingPointsToIndexBuilder.forEach((Integer i, TreeSet set) -> + { + this.bindingPointsToIndex[i] = new int[set.size()]; Iterator iter = set.iterator(); for (int j = 0; j < set.size(); j++) { - bindingPointsToIndex[i][j] = iter.next(); + this.bindingPointsToIndex[i][j] = iter.next(); } }); - pointers = pointersBuilder.toArray(new VertexPointer[pointersBuilder.size()]); - pointersOffset = new int[pointers.length]; - pointersBuilder = null; // Release the builder - bindingPointsToIndexBuilder = null; // Release the builder + this.pointers = this.pointersBuilder.toArray(new VertexPointer[this.pointersBuilder.size()]); + this.pointersOffset = new int[this.pointers.length]; + this.pointersBuilder = null; // Release the builder + this.bindingPointsToIndexBuilder = null; // Release the builder // Check if all pointers are valid int currentOffset = 0; - for (int i = 0; i < pointers.length; i++) + for (int i = 0; i < this.pointers.length; i++) { - VertexPointer pointer = pointers[i]; + VertexPointer pointer = this.pointers[i]; if (pointer == null) { GLProxy.GL_LOGGER.warn("Vertex Attribute index " + i + " is not set! No index should be skipped normally!"); continue; } - pointersOffset[i] = currentOffset; + this.pointersOffset[i] = currentOffset; currentOffset += pointer.byteSize; } + if (currentOffset != expectedStrideSize) { GLProxy.GL_LOGGER.error("Vertex Attribute calculated stride size " + currentOffset + " does not match the provided expected stride size " + expectedStrideSize + "!"); throw new IllegalArgumentException("Vertex Attribute Incorrect Format"); } - strideSize = currentOffset; + this.strideSize = currentOffset; GLProxy.GL_LOGGER.info("Vertex Attribute (pre GL43) completed."); // Debug logging GLProxy.GL_LOGGER.debug("AttributeIndex: ElementCount, glType, normalized, strideSize, offset"); - for (int i = 0; i < pointers.length; i++) + for (int i = 0; i < this.pointers.length; i++) { - VertexPointer pointer = pointers[i]; + VertexPointer pointer = this.pointers[i]; if (pointer == null) { GLProxy.GL_LOGGER.debug(i + ": Null!!!!"); continue; } GLProxy.GL_LOGGER.debug(i + ": " + pointer.elementCount + ", " + - pointer.glType + ", " + pointer.normalized + ", " + strideSize + ", " + pointersOffset[i]); + pointer.glType + ", " + pointer.normalized + ", " + this.strideSize + ", " + this.pointersOffset[i]); } } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/DebugRenderer.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/DebugRenderer.java index 8b8396237..004dce209 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/DebugRenderer.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/DebugRenderer.java @@ -206,7 +206,7 @@ public class DebugRenderer this.basicShader.bind(); this.va.bind(); - this.va.bindBufferToAllBindingPoint(this.boxBuffer.getId()); + this.va.bindBufferToAllBindingPoints(this.boxBuffer.getId()); this.boxOutlineBuffer.bind(); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderProgram.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderProgram.java index 2f7a30ef1..9404139b0 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderProgram.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderProgram.java @@ -159,7 +159,7 @@ public class LodRenderProgram extends ShaderProgram public void bindVertexBuffer(int vbo) { - vao.bindBufferToAllBindingPoint(vbo); + vao.bindBufferToAllBindingPoints(vbo); } public void unbindVertexBuffer() diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/ScreenQuad.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/ScreenQuad.java index aa3014b1b..978660294 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/ScreenQuad.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/ScreenQuad.java @@ -72,7 +72,7 @@ public class ScreenQuad this.init(); this.va.bind(); - this.va.bindBufferToAllBindingPoint(this.boxBuffer.getId()); + this.va.bindBufferToAllBindingPoints(this.boxBuffer.getId()); GL32.glDrawArrays(GL32.GL_TRIANGLES, 0, 6); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/TestRenderer.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/TestRenderer.java index fd91d5dfa..d78579cae 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/TestRenderer.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/TestRenderer.java @@ -123,13 +123,13 @@ public class TestRenderer if (System.currentTimeMillis() % 2000 < 1000) { sameContextBuffer.bind(); - va.bindBufferToAllBindingPoint(sameContextBuffer.getId()); + va.bindBufferToAllBindingPoints(sameContextBuffer.getId()); spamLogger.debug("same context buffer"); } else { sameContextBuffer.bind(); - va.bindBufferToAllBindingPoint(sharedContextBuffer.getId()); + va.bindBufferToAllBindingPoints(sharedContextBuffer.getId()); spamLogger.debug("shared context buffer"); } // Render the square