diff --git a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnRenderBuffer.java b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnRenderBuffer.java index e041efb21..1432c7fc7 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnRenderBuffer.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnRenderBuffer.java @@ -26,7 +26,6 @@ import com.seibel.distanthorizons.core.enums.EGLProxyContext; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.pos.DhBlockPos; import com.seibel.distanthorizons.core.pos.DhSectionPos; -import com.seibel.distanthorizons.core.render.AbstractRenderBuffer; import com.seibel.distanthorizons.core.render.glObject.GLProxy; import com.seibel.distanthorizons.core.render.glObject.buffer.GLVertexBuffer; import com.seibel.distanthorizons.core.render.renderer.LodRenderer; @@ -46,13 +45,19 @@ import java.util.concurrent.*; * * @see ColumnRenderBufferBuilder */ -public class ColumnRenderBuffer extends AbstractRenderBuffer +public class ColumnRenderBuffer implements AutoCloseable { private static final Logger LOGGER = DhLoggerBuilder.getLogger(); private static final IMinecraftClientWrapper minecraftClient = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class); private static final long MAX_BUFFER_UPLOAD_TIMEOUT_NANOSECONDS = 1_000_000; + public static final int QUADS_BYTE_SIZE = LodUtil.LOD_VERTEX_FORMAT.getByteSize() * 4; // TODO what does the 4 represent + public static final int MAX_QUADS_PER_BUFFER = (1024 * 1024 * 1) / QUADS_BYTE_SIZE; // TODO what do these multiples represent? + public static final int FULL_SIZED_BUFFER = MAX_QUADS_PER_BUFFER * QUADS_BYTE_SIZE; + + + public final DhBlockPos pos; @@ -275,7 +280,7 @@ public class ColumnRenderBuffer extends AbstractRenderBuffer // render // //========// - @Override + /** @return true if something was rendered, false otherwise */ public boolean renderOpaque(LodRenderer renderContext, DhApiRenderParam renderEventParam) { boolean hasRendered = false; @@ -299,7 +304,7 @@ public class ColumnRenderBuffer extends AbstractRenderBuffer return hasRendered; } - @Override + /** @return true if something was rendered, false otherwise */ public boolean renderTransparent(LodRenderer renderContext, DhApiRenderParam renderEventParam) { boolean hasRendered = false; @@ -354,7 +359,6 @@ public class ColumnRenderBuffer extends AbstractRenderBuffer return false; } - @Override public void debugDumpStats(StatsMap statsMap) { statsMap.incStat("RenderBuffers"); @@ -378,6 +382,12 @@ public class ColumnRenderBuffer extends AbstractRenderBuffer } } + /** + * This method is called when object is no longer in use. + * Called either after uploadBuffers() returned false (On buffer Upload + * thread), or by others when the object is not being used. (not in build, + * upload, or render state). + */ @Override public void close() { diff --git a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/LodQuadBuilder.java b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/LodQuadBuilder.java index 1e4932de1..29acdd418 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/LodQuadBuilder.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/LodQuadBuilder.java @@ -25,7 +25,6 @@ import java.util.*; import com.seibel.distanthorizons.core.enums.EDhDirection; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; -import com.seibel.distanthorizons.core.render.AbstractRenderBuffer; import com.seibel.distanthorizons.core.render.glObject.buffer.GLVertexBuffer; import com.seibel.distanthorizons.core.util.ColorUtil; import com.seibel.distanthorizons.api.enums.config.EGpuUploadMethod; @@ -386,7 +385,7 @@ public class LodQuadBuilder { return new Iterator() { - final ByteBuffer bb = ByteBuffer.allocateDirect(AbstractRenderBuffer.FULL_SIZED_BUFFER) + final ByteBuffer bb = ByteBuffer.allocateDirect(ColumnRenderBuffer.FULL_SIZED_BUFFER) .order(ByteOrder.nativeOrder()); int dir = skipEmpty(0); int quad = 0; @@ -414,7 +413,7 @@ public class LodQuadBuilder return null; } bb.clear(); - bb.limit(AbstractRenderBuffer.FULL_SIZED_BUFFER); + bb.limit(ColumnRenderBuffer.FULL_SIZED_BUFFER); while (bb.hasRemaining() && dir < 6) { writeData(); @@ -454,7 +453,7 @@ public class LodQuadBuilder { return new Iterator() { - final ByteBuffer bb = ByteBuffer.allocateDirect(AbstractRenderBuffer.FULL_SIZED_BUFFER) + final ByteBuffer bb = ByteBuffer.allocateDirect(ColumnRenderBuffer.FULL_SIZED_BUFFER) .order(ByteOrder.nativeOrder()); int directionIndex = this.skipEmptyDirectionIndices(0); int quad = 0; @@ -483,7 +482,7 @@ public class LodQuadBuilder } this.bb.clear(); - this.bb.limit(AbstractRenderBuffer.FULL_SIZED_BUFFER); + this.bb.limit(ColumnRenderBuffer.FULL_SIZED_BUFFER); while (this.bb.hasRemaining() && this.directionIndex < 6) { this.writeData(); @@ -541,19 +540,19 @@ public class LodQuadBuilder } int numOfQuads = _countRemainingQuads(); - if (numOfQuads > AbstractRenderBuffer.MAX_QUADS_PER_BUFFER) - numOfQuads = AbstractRenderBuffer.MAX_QUADS_PER_BUFFER; + if (numOfQuads > ColumnRenderBuffer.MAX_QUADS_PER_BUFFER) + numOfQuads = ColumnRenderBuffer.MAX_QUADS_PER_BUFFER; if (numOfQuads == 0) { vbo.setVertexCount(0); return false; } - ByteBuffer bb = vbo.mapBuffer(numOfQuads * AbstractRenderBuffer.QUADS_BYTE_SIZE, method, - AbstractRenderBuffer.FULL_SIZED_BUFFER); + ByteBuffer bb = vbo.mapBuffer(numOfQuads * ColumnRenderBuffer.QUADS_BYTE_SIZE, method, + ColumnRenderBuffer.FULL_SIZED_BUFFER); if (bb == null) throw new NullPointerException("mapBuffer returned null"); bb.clear(); - bb.limit(numOfQuads * AbstractRenderBuffer.QUADS_BYTE_SIZE); + bb.limit(numOfQuads * ColumnRenderBuffer.QUADS_BYTE_SIZE); while (bb.hasRemaining() && dir < 6) { writeData(bb); @@ -621,19 +620,19 @@ public class LodQuadBuilder } int numOfQuads = _countRemainingQuads(); - if (numOfQuads > AbstractRenderBuffer.MAX_QUADS_PER_BUFFER) - numOfQuads = AbstractRenderBuffer.MAX_QUADS_PER_BUFFER; + if (numOfQuads > ColumnRenderBuffer.MAX_QUADS_PER_BUFFER) + numOfQuads = ColumnRenderBuffer.MAX_QUADS_PER_BUFFER; if (numOfQuads == 0) { vbo.setVertexCount(0); return false; } - ByteBuffer bb = vbo.mapBuffer(numOfQuads * AbstractRenderBuffer.QUADS_BYTE_SIZE, method, - AbstractRenderBuffer.FULL_SIZED_BUFFER); + ByteBuffer bb = vbo.mapBuffer(numOfQuads * ColumnRenderBuffer.QUADS_BYTE_SIZE, method, + ColumnRenderBuffer.FULL_SIZED_BUFFER); if (bb == null) throw new NullPointerException("mapBuffer returned null"); bb.clear(); - bb.limit(numOfQuads * AbstractRenderBuffer.QUADS_BYTE_SIZE); + bb.limit(numOfQuads * ColumnRenderBuffer.QUADS_BYTE_SIZE); while (bb.hasRemaining() && dir < 6) { writeData(bb); @@ -718,7 +717,7 @@ public class LodQuadBuilder } /** Returns how many GpuBuffers will be needed to render opaque quads in this builder. */ - public int getCurrentNeededOpaqueVertexBufferCount() { return MathUtil.ceilDiv(this.getCurrentOpaqueQuadsCount(), AbstractRenderBuffer.MAX_QUADS_PER_BUFFER); } + public int getCurrentNeededOpaqueVertexBufferCount() { return MathUtil.ceilDiv(this.getCurrentOpaqueQuadsCount(), ColumnRenderBuffer.MAX_QUADS_PER_BUFFER); } /** Returns how many GpuBuffers will be needed to render transparent quads in this builder. */ public int getCurrentNeededTransparentVertexBufferCount() { @@ -727,7 +726,7 @@ public class LodQuadBuilder return 0; } - return MathUtil.ceilDiv(this.getCurrentTransparentQuadsCount(), AbstractRenderBuffer.MAX_QUADS_PER_BUFFER); + return MathUtil.ceilDiv(this.getCurrentTransparentQuadsCount(), ColumnRenderBuffer.MAX_QUADS_PER_BUFFER); } } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/AbstractRenderBuffer.java b/core/src/main/java/com/seibel/distanthorizons/core/render/AbstractRenderBuffer.java deleted file mode 100644 index 29e303fbb..000000000 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/AbstractRenderBuffer.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * This file is part of the Distant Horizons mod - * licensed under the GNU LGPL v3 License. - * - * Copyright (C) 2020-2023 James Seibel - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package com.seibel.distanthorizons.core.render; - -import com.seibel.distanthorizons.api.methods.events.sharedParameterObjects.DhApiRenderParam; -import com.seibel.distanthorizons.core.util.LodUtil; -import com.seibel.distanthorizons.core.util.objects.StatsMap; -import com.seibel.distanthorizons.core.render.renderer.LodRenderer; - -public abstract class AbstractRenderBuffer implements AutoCloseable -{ - // ====================================================================== - // ====================== Methods for implementations =================== - // ====================================================================== - - // ========== Called by render thread ========== - /** @return true if something was rendered, false otherwise */ - public abstract boolean renderOpaque(LodRenderer renderContext, DhApiRenderParam renderEventParam); - /** @return true if something was rendered, false otherwise */ - public abstract boolean renderTransparent(LodRenderer renderContext, DhApiRenderParam renderEventParam); - - // ========== Called by any thread. (thread safe) ========== - - /* Called by anyone. This method is allowed to throw exceptions, but - * are never allowed to modify any values. This should behave the same - * to other methods as if the method have never been called. - * Note: This method is PURELY for debug or stats logging ONLY! */ - public abstract void debugDumpStats(StatsMap statsMap); - - // ========= Called only when 1 thread is using it ======= - /* This method is called when object is no longer in use. - * Called either after uploadBuffers() returned false (On buffer Upload - * thread), or by others when the object is not being used. (not in build, - * upload, or render state). */ - public abstract void close(); - - - - public static final int QUADS_BYTE_SIZE = LodUtil.LOD_VERTEX_FORMAT.getByteSize() * 4; // TODO what does the 4 represent - public static final int MAX_QUADS_PER_BUFFER = (1024 * 1024 * 1) / QUADS_BYTE_SIZE; // TODO what do these multiples represent? - public static final int FULL_SIZED_BUFFER = MAX_QUADS_PER_BUFFER * QUADS_BYTE_SIZE; - - -} diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/RenderBufferHandler.java b/core/src/main/java/com/seibel/distanthorizons/core/render/RenderBufferHandler.java index a66d3c028..9e7e7931f 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/RenderBufferHandler.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/RenderBufferHandler.java @@ -24,6 +24,7 @@ import com.seibel.distanthorizons.api.interfaces.override.rendering.IDhApiCullin import com.seibel.distanthorizons.api.interfaces.override.rendering.IDhApiShadowCullingFrustum; import com.seibel.distanthorizons.api.methods.events.sharedParameterObjects.DhApiRenderParam; import com.seibel.distanthorizons.core.config.Config; +import com.seibel.distanthorizons.core.dataObjects.render.bufferBuilding.ColumnRenderBuffer; import com.seibel.distanthorizons.core.dependencyInjection.ModAccessorInjector; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.enums.EDhDirection; @@ -349,7 +350,7 @@ public class RenderBufferHandler implements AutoCloseable continue; } - AbstractRenderBuffer buffer = renderSection.activeRenderBufferRef.get(); + ColumnRenderBuffer buffer = renderSection.activeRenderBufferRef.get(); if (buffer == null) { continue; @@ -435,10 +436,10 @@ public class RenderBufferHandler implements AutoCloseable private static class LoadedRenderBuffer { - public final AbstractRenderBuffer buffer; + public final ColumnRenderBuffer buffer; public final DhSectionPos pos; - LoadedRenderBuffer(AbstractRenderBuffer buffer, DhSectionPos pos) + LoadedRenderBuffer(ColumnRenderBuffer buffer, DhSectionPos pos) { this.buffer = buffer; this.pos = pos; diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderer.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderer.java index 40986bd19..6b8d983e8 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderer.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderer.java @@ -31,7 +31,6 @@ import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.logging.ConfigBasedLogger; import com.seibel.distanthorizons.core.logging.ConfigBasedSpamLogger; import com.seibel.distanthorizons.core.pos.DhBlockPos; -import com.seibel.distanthorizons.core.render.AbstractRenderBuffer; import com.seibel.distanthorizons.core.render.DhApiRenderProxy; import com.seibel.distanthorizons.core.render.RenderBufferHandler; import com.seibel.distanthorizons.core.render.glObject.GLProxy; @@ -700,7 +699,7 @@ public class LodRenderer if (ENABLE_IBO) { this.quadIBO = new QuadElementBuffer(); - this.quadIBO.reserve(AbstractRenderBuffer.MAX_QUADS_PER_BUFFER); + this.quadIBO.reserve(ColumnRenderBuffer.MAX_QUADS_PER_BUFFER); }