diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/McLodRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/McLodRenderer.java index 28ef2d342..eedda4dd5 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/McLodRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/McLodRenderer.java @@ -180,8 +180,7 @@ public class McLodRenderer implements IMcLodRenderer for (int lodIndex = 0; lodIndex < bufferContainers.size(); lodIndex++) { LodBufferContainer bufferContainer = bufferContainers.get(lodIndex); - bufferContainer.uniforms.createBufferData(renderEventParam, bufferContainer); - bufferContainer.uniforms.upload(); + bufferContainer.uniformContainer.tryUpload(); } } @@ -211,6 +210,7 @@ public class McLodRenderer implements IMcLodRenderer .putFloat() // uMircoOffset .putFloat() // uEarthRadius + .putVec3() // uCameraPos .putMat4f() // uCombinedMatrix .get(); @@ -223,6 +223,10 @@ public class McLodRenderer implements IMcLodRenderer .putFloat(0.01f) // uMircoOffset // 0.01 block offset .putFloat(earthCurveRatio) // uEarthRadius + .putVec3( + (float)renderEventParam.exactCameraPosition.x, + (float)renderEventParam.exactCameraPosition.y, + (float)renderEventParam.exactCameraPosition.z) // uCameraPos .putMat4f(combinedMatrix.createJomlMatrix()) // uCombinedMatrix .get(); @@ -337,7 +341,7 @@ public class McLodRenderer implements IMcLodRenderer profiler.popPush("binding"); LodBufferContainer bufferContainer = bufferContainers.get(lodIndex); - LodUniformBufferWrapper uniformWrapper = (LodUniformBufferWrapper)bufferContainer.uniforms; + LodUniformBufferWrapper uniformWrapper = (LodUniformBufferWrapper)bufferContainer.uniformContainer; boolean columnBuilderDebugEnabled = Config.Client.Advanced.Debugging.ColumnBuilderDebugging.columnBuilderDebugEnable.get(); if (columnBuilderDebugEnabled) diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/uniform/LodUniformBufferWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/uniform/LodUniformBufferWrapper.java index f0677a1c2..ea7017619 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/uniform/LodUniformBufferWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/uniform/LodUniformBufferWrapper.java @@ -14,9 +14,21 @@ import java.nio.ByteBuffer; /** * TODO ?? */ -public class LodUniformBufferWrapper extends AbstractUniformBufferWrapper implements ILodContainerUniformBufferWrapper +public class LodUniformBufferWrapper extends UniformBufferWrapper implements ILodContainerUniformBufferWrapper { + private boolean uploaded = false; + + + + //=============// + // constructor // + //=============// + //region + + public LodUniformBufferWrapper() { super(LodUniformBufferWrapper.class.getName()); } + + //endregion @@ -25,18 +37,13 @@ public class LodUniformBufferWrapper extends AbstractUniformBufferWrapper implem //========// //region - public void createBufferData(RenderParams renderEventParam, LodBufferContainer bufferContainer) + @Override + public void createUniformData(LodBufferContainer bufferContainer) { - Vec3d camPos = renderEventParam.exactCameraPosition; Vec3f modelOffset = new Vec3f( - (float) (bufferContainer.minCornerBlockPos.getX() - camPos.x), - (float) (bufferContainer.minCornerBlockPos.getY() - camPos.y), - (float) (bufferContainer.minCornerBlockPos.getZ() - camPos.z)); - - - Mat4f combinedMatrix = new Mat4f(renderEventParam.dhProjectionMatrix); - combinedMatrix.multiply(renderEventParam.dhModelViewMatrix); - + (float) (bufferContainer.minCornerBlockPos.getX()), + (float) (bufferContainer.minCornerBlockPos.getY()), + (float) (bufferContainer.minCornerBlockPos.getZ())); // upload data // @@ -51,6 +58,19 @@ public class LodUniformBufferWrapper extends AbstractUniformBufferWrapper implem } + @Override + public void tryUpload() + { + if (this.uploaded) + { + return; + } + + this.upload(); + + this.uploaded = true; + } + //endregion } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/uniform/AbstractUniformBufferWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/uniform/UniformBufferWrapper.java similarity index 64% rename from common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/uniform/AbstractUniformBufferWrapper.java rename to common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/uniform/UniformBufferWrapper.java index f342dcf54..37b6388c1 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/uniform/AbstractUniformBufferWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/uniform/UniformBufferWrapper.java @@ -5,6 +5,7 @@ import com.mojang.blaze3d.buffers.GpuBufferSlice; import com.mojang.blaze3d.systems.CommandEncoder; import com.mojang.blaze3d.systems.GpuDevice; import com.mojang.blaze3d.systems.RenderSystem; +import com.seibel.distanthorizons.common.render.blaze.wrappers.buffer.VertexBufferWrapper; import com.seibel.distanthorizons.core.logging.DhLogger; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.wrapperInterfaces.render.IUniformBufferWrapper; @@ -12,7 +13,7 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.render.IUniformBufferWr import java.nio.ByteBuffer; import java.nio.ByteOrder; -public abstract class AbstractUniformBufferWrapper implements IUniformBufferWrapper +public class UniformBufferWrapper implements IUniformBufferWrapper { private static final DhLogger LOGGER = new DhLoggerBuilder().build(); @@ -22,7 +23,10 @@ public abstract class AbstractUniformBufferWrapper implements IUniformBufferWrap private final String name; - private ByteBuffer buffer = null; + private int cpuBufferSize = 0; + private int gpuBufferSize = 0; + + private ByteBuffer cpuBuffer = null; public GpuBuffer gpuBuffer = null; @@ -32,7 +36,7 @@ public abstract class AbstractUniformBufferWrapper implements IUniformBufferWrap //=============// //region - public AbstractUniformBufferWrapper() { this.name = this.getClass().getSimpleName(); } + public UniformBufferWrapper(String name) { this.name = name; } //endregion @@ -45,37 +49,49 @@ public abstract class AbstractUniformBufferWrapper implements IUniformBufferWrap protected ByteBuffer getOrCreateBuffer(int size) { - if (this.buffer == null - || this.buffer.capacity() != size) + if (this.cpuBuffer == null + || this.cpuBufferSize != size) { - this.buffer = ByteBuffer.allocateDirect(size); - this.buffer.order(ByteOrder.nativeOrder()); + this.cpuBuffer = ByteBuffer.allocateDirect(size); + this.cpuBuffer.order(ByteOrder.nativeOrder()); - int usage = GpuBuffer.USAGE_COPY_DST - | GpuBuffer.USAGE_VERTEX - | GpuBuffer.USAGE_UNIFORM; - int byteSize = (this.buffer.limit() - this.buffer.position()); - this.gpuBuffer = GPU_DEVICE.createBuffer(this::getBufferName, usage, byteSize); + this.cpuBufferSize = size; } - return this.buffer; + return this.cpuBuffer; } @Override public void upload() throws IllegalStateException { - if (this.buffer == null) + if (this.cpuBuffer == null) { throw new IllegalStateException("Upload called before buffer was created"); } + if (this.gpuBuffer == null + || this.gpuBufferSize != this.cpuBufferSize) + { + if (this.gpuBuffer != null) + { + this.gpuBuffer.close(); + } + + int usage = GpuBuffer.USAGE_COPY_DST + | GpuBuffer.USAGE_VERTEX + | GpuBuffer.USAGE_UNIFORM; + this.gpuBuffer = GPU_DEVICE.createBuffer(this::getBufferName, usage, this.cpuBufferSize); + + this.gpuBufferSize = this.cpuBufferSize; + } - int byteSize = (this.buffer.limit() - this.buffer.position()); + + int byteSize = (this.cpuBuffer.limit() - this.cpuBuffer.position()); GpuBufferSlice bufferSlice = new GpuBufferSlice(this.gpuBuffer, /*offset*/0, byteSize); if (!bufferSlice.buffer().isClosed()) { - COMMAND_ENCODER.writeToBuffer(bufferSlice, this.buffer); + COMMAND_ENCODER.writeToBuffer(bufferSlice, this.cpuBuffer); } else { diff --git a/coreSubProjects b/coreSubProjects index 39dd1c850..e1a932cf3 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 39dd1c8509c23facf77ef9cafc5364a0908dd71f +Subproject commit e1a932cf38e5f8f016a20fe946f5a792884333a3