From 3b5728692d18601c584aa4dabc813338bec621c0 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Thu, 5 Mar 2026 17:32:43 -0600 Subject: [PATCH] fix leak in LOD renderer and start separating uniforms --- .../AbstractUniformBufferWrapper.java | 83 +++++++ .../LodContainerUniformBufferWrapper.java | 63 ++++++ .../common/renderTest/McApplyRenderer.java | 66 +++--- .../common/renderTest/McLodRenderer.java | 209 +++++++++++------- .../common/renderTest/UniformHandler.java | 1 + .../common/wrappers/WrapperFactory.java | 20 +- coreSubProjects | 2 +- 7 files changed, 319 insertions(+), 125 deletions(-) create mode 100644 common/src/main/java/com/seibel/distanthorizons/common/renderTest/AbstractUniformBufferWrapper.java create mode 100644 common/src/main/java/com/seibel/distanthorizons/common/renderTest/LodContainerUniformBufferWrapper.java diff --git a/common/src/main/java/com/seibel/distanthorizons/common/renderTest/AbstractUniformBufferWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/renderTest/AbstractUniformBufferWrapper.java new file mode 100644 index 000000000..2845b394b --- /dev/null +++ b/common/src/main/java/com/seibel/distanthorizons/common/renderTest/AbstractUniformBufferWrapper.java @@ -0,0 +1,83 @@ +package com.seibel.distanthorizons.common.renderTest; + +import com.mojang.blaze3d.buffers.GpuBuffer; +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.core.wrapperInterfaces.render.IUniformBufferWrapper; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.function.Supplier; + +public abstract class AbstractUniformBufferWrapper implements IUniformBufferWrapper +{ + private final String name; + + private ByteBuffer buffer = null; + public GpuBuffer gpuBuffer = null; + + + + //========// + // render // + //========// + //region + + public AbstractUniformBufferWrapper() { this.name = this.getClass().getSimpleName(); } + public AbstractUniformBufferWrapper(String name) { this.name = name; } + + protected ByteBuffer getOrCreateBuffer(int size) + { + GpuDevice gpuDevice = RenderSystem.getDevice(); + + if (this.buffer == null + || this.buffer.capacity() != size) + { + this.buffer = ByteBuffer.allocateDirect(size); + this.buffer.order(ByteOrder.LITTLE_ENDIAN); + + // GpuBuffer.USAGE_UNIFORM = 128 + // GpuBuffer.USAGE_INDEX = 64 + int usage = 8 | 32 | 128; // is this just using OpenGL VBO flags?, if so I can't find it, supposedly GlDevice on Mojang's side + int byteSize = (this.buffer.limit() - this.buffer.position()); + this.gpuBuffer = gpuDevice.createBuffer(this::getName, usage, byteSize); + } + + return this.buffer; + } + + @Override + public void upload() throws IllegalStateException + { + if (this.buffer == null) + { + throw new IllegalStateException("Upload called before buffer was created"); + } + + + + GpuDevice gpuDevice = RenderSystem.getDevice(); + CommandEncoder commandEncoder = gpuDevice.createCommandEncoder(); + + int byteSize = (this.buffer.limit() - this.buffer.position()); + GpuBufferSlice bufferSlice = new GpuBufferSlice(this.gpuBuffer, /*offset*/0, byteSize); + commandEncoder.writeToBuffer(bufferSlice, this.buffer); + } + private String getName() { return this.name; } + + @Override + public void close() + { + if (this.gpuBuffer != null) + { + this.gpuBuffer.close(); + } + } + + + + //endregion + +} diff --git a/common/src/main/java/com/seibel/distanthorizons/common/renderTest/LodContainerUniformBufferWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/renderTest/LodContainerUniformBufferWrapper.java new file mode 100644 index 000000000..e6794ceae --- /dev/null +++ b/common/src/main/java/com/seibel/distanthorizons/common/renderTest/LodContainerUniformBufferWrapper.java @@ -0,0 +1,63 @@ +package com.seibel.distanthorizons.common.renderTest; + +import com.mojang.blaze3d.buffers.GpuBuffer; +import com.mojang.blaze3d.buffers.GpuBufferSlice; +import com.mojang.blaze3d.buffers.Std140Builder; +import com.mojang.blaze3d.buffers.Std140SizeCalculator; +import com.mojang.blaze3d.systems.CommandEncoder; +import com.mojang.blaze3d.systems.GpuDevice; +import com.mojang.blaze3d.systems.RenderSystem; +import com.seibel.distanthorizons.core.config.Config; +import com.seibel.distanthorizons.core.dataObjects.render.bufferBuilding.LodBufferContainer; +import com.seibel.distanthorizons.core.pos.DhSectionPos; +import com.seibel.distanthorizons.core.render.renderer.RenderParams; +import com.seibel.distanthorizons.core.util.math.Mat4f; +import com.seibel.distanthorizons.core.util.math.Vec3d; +import com.seibel.distanthorizons.core.util.math.Vec3f; +import com.seibel.distanthorizons.core.wrapperInterfaces.render.ILodContainerUniformBufferWrapper; +import com.seibel.distanthorizons.core.wrapperInterfaces.render.IUniformBufferWrapper; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.function.Supplier; + +public class LodContainerUniformBufferWrapper extends AbstractUniformBufferWrapper implements ILodContainerUniformBufferWrapper +{ + + + + + //========// + // ??? // + //========// + //region + + public void createBufferData(RenderParams renderEventParam, 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); + + + // upload data // + + int uniformBufferSize = new Std140SizeCalculator() + .putVec3() // uModelOffset + .get(); + + ByteBuffer buffer = this.getOrCreateBuffer(uniformBufferSize); + Std140Builder.intoBuffer(buffer) + .putVec3(modelOffset.x, modelOffset.y, modelOffset.z) // uModelOffset + .get(); + + } + + //endregion + +} diff --git a/common/src/main/java/com/seibel/distanthorizons/common/renderTest/McApplyRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/renderTest/McApplyRenderer.java index 77dc8defe..eb86fd343 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/renderTest/McApplyRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/renderTest/McApplyRenderer.java @@ -24,7 +24,6 @@ import com.mojang.blaze3d.buffers.GpuBufferSlice; import com.mojang.blaze3d.pipeline.RenderPipeline; import com.mojang.blaze3d.platform.DepthTestFunction; import com.mojang.blaze3d.platform.PolygonMode; -import com.mojang.blaze3d.shaders.UniformType; import com.mojang.blaze3d.systems.CommandEncoder; import com.mojang.blaze3d.systems.GpuDevice; import com.mojang.blaze3d.systems.RenderPass; @@ -36,7 +35,6 @@ import com.seibel.distanthorizons.core.logging.DhLogger; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftGLWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper; -import com.seibel.distanthorizons.core.wrapperInterfaces.render.IMcTestRenderer; import net.minecraft.client.Minecraft; import net.minecraft.resources.Identifier; @@ -64,6 +62,14 @@ public class McApplyRenderer private GpuBuffer vboGpuBuffer; + private GpuTextureView dhColorTextureView; + private GpuSampler dhColorTextureSampler; + + private GpuTextureView dhDepthTextureView; + private GpuSampler dhDepthTextureSampler; + + private GpuTextureView mcColorTextureView; + //=============// // constructor // @@ -179,18 +185,45 @@ public class McApplyRenderer CommandEncoder commandEncoder = gpuDevice.createCommandEncoder(); + { + GpuTexture mcColorTexture = Minecraft.getInstance().getMainRenderTarget().getColorTexture(); + if (this.mcColorTextureView == null + || this.mcColorTextureView.texture() != mcColorTexture) + { + this.mcColorTextureView = gpuDevice.createTextureView(mcColorTexture); + } + + + if (this.dhColorTextureSampler == null) + { + this.dhColorTextureSampler = gpuDevice.createSampler( + AddressMode.CLAMP_TO_EDGE, AddressMode.CLAMP_TO_EDGE, // U,V + FilterMode.NEAREST, FilterMode.NEAREST, // minFilter, magFilter + 1, // maxAnisotropy + OptionalDouble.empty() // maxLod + ); + + this.dhDepthTextureSampler = gpuDevice.createSampler( + AddressMode.CLAMP_TO_EDGE, AddressMode.CLAMP_TO_EDGE, // U,V + FilterMode.NEAREST, FilterMode.NEAREST, // minFilter, magFilter + 1, // maxAnisotropy + OptionalDouble.empty() // maxLod + ); + } + + } + // create a render pass { Supplier debugLabelSupplier = () -> "distantHorizons:McApplyRenderer"; - GpuTextureView colorTexture = gpuDevice.createTextureView(Minecraft.getInstance().getMainRenderTarget().getColorTexture()); OptionalInt optionalClearColorAsInt = OptionalInt.empty(); GpuTextureView depthTexture = null; OptionalDouble optionalDepthValueAsDouble = OptionalDouble.empty(); try (RenderPass renderPass = commandEncoder.createRenderPass( debugLabelSupplier, - colorTexture, + this.mcColorTextureView, optionalClearColorAsInt, depthTexture, optionalDepthValueAsDouble)) { @@ -200,29 +233,8 @@ public class McApplyRenderer // render pass setup { - // bind color texture - { - GpuTextureView textureView = gpuDevice.createTextureView(McLodRenderer.INSTANCE.dhColorTexture); - GpuSampler gpuSampler = gpuDevice.createSampler( - AddressMode.CLAMP_TO_EDGE, AddressMode.CLAMP_TO_EDGE, // U,V - FilterMode.NEAREST, FilterMode.NEAREST, // minFilter, magFilter - 1, // maxAnisotropy - OptionalDouble.empty() // maxLod - ); - renderPass.bindTexture("uDhColorTexture", textureView, gpuSampler); - } - - // bind depth texture - { - GpuTextureView textureView = gpuDevice.createTextureView(McLodRenderer.INSTANCE.dhDepthTexture); - GpuSampler gpuSampler = gpuDevice.createSampler( - AddressMode.CLAMP_TO_EDGE, AddressMode.CLAMP_TO_EDGE, // U,V - FilterMode.NEAREST, FilterMode.NEAREST, // minFilter, magFilter - 1, // maxAnisotropy - OptionalDouble.empty() // maxLod - ); - renderPass.bindTexture("uDhDepthTexture", textureView, gpuSampler); - } + renderPass.bindTexture("uDhDepthTexture", McLodRenderer.INSTANCE.dhDepthTextureView, this.dhColorTextureSampler); + renderPass.bindTexture("uDhColorTexture", McLodRenderer.INSTANCE.dhColorTextureView, this.dhDepthTextureSampler); // bind VBO renderPass.setVertexBuffer(0, this.vboGpuBuffer); // vertex buffer can only be "0" lol diff --git a/common/src/main/java/com/seibel/distanthorizons/common/renderTest/McLodRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/renderTest/McLodRenderer.java index bd0f40e8f..921a957db 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/renderTest/McLodRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/renderTest/McLodRenderer.java @@ -16,19 +16,20 @@ import com.mojang.blaze3d.systems.RenderPass; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.textures.*; import com.mojang.blaze3d.vertex.VertexFormat; -import com.seibel.distanthorizons.api.objects.math.DhApiVec3f; import com.seibel.distanthorizons.common.wrappers.misc.LightMapWrapper; import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.dataObjects.render.bufferBuilding.LodBufferContainer; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.logging.DhLogger; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; +import com.seibel.distanthorizons.core.pos.DhSectionPos; import com.seibel.distanthorizons.core.render.glObject.GLEnums; import com.seibel.distanthorizons.core.render.glObject.buffer.QuadElementBuffer; import com.seibel.distanthorizons.core.render.renderer.RenderParams; import com.seibel.distanthorizons.core.util.ColorUtil; import com.seibel.distanthorizons.core.util.RenderUtil; import com.seibel.distanthorizons.core.util.math.Mat4f; +import com.seibel.distanthorizons.core.util.objects.SortedArraySet; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftGLWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IProfilerWrapper; @@ -64,10 +65,17 @@ public class McLodRenderer implements IMcLodRenderer private GpuBuffer indexBuffer; private GpuBuffer fragUniformBuffer; - private GpuBuffer vertUniformBuffer; + private GpuBuffer vertSharedUniformBuffer; public GpuTexture dhDepthTexture; + public GpuTextureView dhDepthTextureView; + public GpuTexture dhColorTexture; + public GpuTextureView dhColorTextureView; + + private GpuTexture mcLightTexture; + private GpuTextureView mcLightTextureView; + private GpuSampler mcLightGpuSampler; @@ -117,7 +125,8 @@ public class McLodRenderer implements IMcLodRenderer pipelineBuilder.withSampler("uLightMap"); - pipelineBuilder.withUniform("vertUniformBlock", UniformType.UNIFORM_BUFFER); + pipelineBuilder.withUniform("vertUniqueUniformBlock", UniformType.UNIFORM_BUFFER); + pipelineBuilder.withUniform("vertSharedUniformBlock", UniformType.UNIFORM_BUFFER); pipelineBuilder.withUniform("fragUniformBlock", UniformType.UNIFORM_BUFFER); pipelineBuilder.withVertexFormat(this.vertexFormat, VertexFormat.Mode.TRIANGLES); @@ -134,9 +143,6 @@ public class McLodRenderer implements IMcLodRenderer pipelineBuilder.withBlend(BlendFunction.TRANSLUCENT); this.transparentPipeline = pipelineBuilder.build(); } - - - } //endregion @@ -155,8 +161,7 @@ public class McLodRenderer implements IMcLodRenderer public void render( RenderParams renderEventParam, boolean opaquePass, - DhApiVec3f modelOffset, - IVertexBufferWrapper[] bufferList, + SortedArraySet bufferContainers, IProfilerWrapper profiler) { this.tryInit(); @@ -168,10 +173,20 @@ public class McLodRenderer implements IMcLodRenderer - profiler.push("set vert uniforms"); + profiler.push("vert unique uniforms"); { // create data // + for (int lodIndex = 0; lodIndex < bufferContainers.size(); lodIndex++) + { + LodBufferContainer bufferContainer = bufferContainers.get(lodIndex); + bufferContainer.uniforms.createBufferData(renderEventParam, bufferContainer); + bufferContainer.uniforms.upload(); + } + } + + profiler.popPush("vert share uniforms"); + { Mat4f combinedMatrix = new Mat4f(renderEventParam.dhProjectionMatrix); combinedMatrix.multiply(renderEventParam.dhModelViewMatrix); @@ -196,33 +211,27 @@ public class McLodRenderer implements IMcLodRenderer .putFloat() // uMircoOffset .putFloat() // uEarthRadius - .putVec3() // uModelOffset - .putMat4f() // uCombinedMatrix .get(); ByteBuffer buffer = ByteBuffer.allocateDirect(uniformBufferSize); buffer.order(ByteOrder.LITTLE_ENDIAN); - buffer = Std140Builder.intoBuffer(buffer) + Std140Builder.intoBuffer(buffer) .putInt(0) // uIsWhiteWorld - .putFloat((float)renderEventParam.worldYOffset) // uWorldYOffset + .putFloat((float) renderEventParam.worldYOffset) // uWorldYOffset .putFloat(0.01f) // uMircoOffset // 0.01 block offset .putFloat(earthCurveRatio) // uEarthRadius - .putVec3(modelOffset.x, modelOffset.y, modelOffset.z) // uModelOffset - .putMat4f(combinedMatrix.createJomlMatrix()) // uCombinedMatrix .get(); - this.vertUniformBuffer = UniformHandler.createBuffer("vertUniformBlock", uniformBufferSize, this.vertUniformBuffer); - GpuBufferSlice bufferSlice = new GpuBufferSlice(this.vertUniformBuffer, 0, uniformBufferSize); + this.vertSharedUniformBuffer = UniformHandler.createBuffer("vertSharedUniformBlock", uniformBufferSize, this.vertSharedUniformBuffer); + GpuBufferSlice bufferSlice = new GpuBufferSlice(this.vertSharedUniformBuffer, 0, uniformBufferSize); commandEncoder.writeToBuffer(bufferSlice, buffer); - } - profiler.popPush("set frag uniforms"); { int uniformBufferSize = new Std140SizeCalculator() @@ -297,7 +306,10 @@ public class McLodRenderer implements IMcLodRenderer if (this.dhDepthTexture != null) { this.dhDepthTexture.close(); + this.dhDepthTextureView.close(); + this.dhColorTexture.close(); + this.dhDepthTextureView.close(); } // TODO USAGE_TEXTURE_BINDING = 4 @@ -308,97 +320,124 @@ public class McLodRenderer implements IMcLodRenderer MC_RENDER.getTargetFramebufferViewportWidth(), MC_RENDER.getTargetFramebufferViewportHeight(), 1, 1 ); + this.dhDepthTextureView = gpuDevice.createTextureView(this.dhDepthTexture); + this.dhColorTexture = gpuDevice.createTexture("DhColorTexture", usage, TextureFormat.RGBA8, MC_RENDER.getTargetFramebufferViewportWidth(), MC_RENDER.getTargetFramebufferViewportHeight(), 1, 1 ); + this.dhColorTextureView = gpuDevice.createTextureView(this.dhColorTexture); } - profiler.popPush("create render pass"); - - // create a render pass - Supplier debugLabelSupplier = () -> "distantHorizons:McLodRenderer"; - OptionalInt optionalClearColorAsInt = OptionalInt.empty(); - OptionalDouble optionalDepthValueAsDouble = OptionalDouble.empty(); - - try ( - GpuTextureView colorTextureView = gpuDevice.createTextureView(this.dhColorTexture); - GpuTextureView depthTextureView = gpuDevice.createTextureView(this.dhDepthTexture); - RenderPass renderPass = commandEncoder.createRenderPass( - debugLabelSupplier, - colorTextureView, - optionalClearColorAsInt, - depthTextureView, optionalDepthValueAsDouble)) + LightMapWrapper lightMapWrapper = (LightMapWrapper) renderEventParam.lightmap; + if (this.mcLightTexture != lightMapWrapper.gpuTexture) { - //renderPass.pushDebugGroup(); - //renderPass.popDebugGroup(); - - - // bind MC Lightmap + this.mcLightTexture = lightMapWrapper.gpuTexture; + if (this.mcLightTextureView != null) { - LightMapWrapper lightMapWrapper = (LightMapWrapper) renderEventParam.lightmap; - - GpuTextureView textureView = gpuDevice.createTextureView(lightMapWrapper.gpuTexture); - GpuSampler gpuSampler = gpuDevice.createSampler( - AddressMode.CLAMP_TO_EDGE, AddressMode.CLAMP_TO_EDGE, // U,V - FilterMode.NEAREST, FilterMode.NEAREST, // minFilter, magFilter - 1, // maxAnisotropy - OptionalDouble.empty() // maxLod - ); - renderPass.bindTexture("uLightMap", textureView, gpuSampler); + this.mcLightTextureView.close(); } - renderPass.setUniform("vertUniformBlock", this.vertUniformBuffer); - renderPass.setUniform("fragUniformBlock", this.fragUniformBuffer); + this.mcLightTextureView = gpuDevice.createTextureView(this.mcLightTexture); + this.mcLightGpuSampler = gpuDevice.createSampler( + AddressMode.CLAMP_TO_EDGE, AddressMode.CLAMP_TO_EDGE, // U,V + FilterMode.NEAREST, FilterMode.NEAREST, // minFilter, magFilter + 1, // maxAnisotropy + OptionalDouble.empty() // maxLod + ); + } + + + { + profiler.popPush("setup"); + // create a render pass + Supplier debugLabelSupplier = () -> "distantHorizons:McLodRenderer"; + OptionalInt optionalClearColorAsInt = OptionalInt.empty(); + OptionalDouble optionalDepthValueAsDouble = OptionalDouble.empty(); - - profiler.popPush("set pipeline"); - - renderPass.setPipeline(opaquePass ? this.opaquePipeline : this.transparentPipeline); - renderPass.setIndexBuffer(this.indexBuffer, VertexFormat.IndexType.INT); - - // render pass setup - for (int i = 0; i < bufferList.length; i++) + try(RenderPass renderPass = commandEncoder.createRenderPass( + debugLabelSupplier, + this.dhColorTextureView, + optionalClearColorAsInt, + this.dhDepthTextureView, optionalDepthValueAsDouble) + ) { - VertexBufferWrapper bufferWrapper = (VertexBufferWrapper)bufferList[i]; - if (!bufferWrapper.uploaded - || bufferWrapper.vertexCount == 0) + //renderPass.pushDebugGroup(); + //renderPass.popDebugGroup(); + + // bind MC Lightmap + renderPass.bindTexture("uLightMap", this.mcLightTextureView, this.mcLightGpuSampler); + + // set pipeline + renderPass.setPipeline(opaquePass ? this.opaquePipeline : this.transparentPipeline); + renderPass.setIndexBuffer(this.indexBuffer, VertexFormat.IndexType.INT); + + // shared uniforms + renderPass.setUniform("fragUniformBlock", this.fragUniformBuffer); + renderPass.setUniform("vertSharedUniformBlock", this.vertSharedUniformBuffer); + + + + + for (int lodIndex = 0; lodIndex < bufferContainers.size(); lodIndex++) { - continue; - } - - profiler.popPush("set VBO"); - - renderPass.setVertexBuffer(0, bufferWrapper.vboGpuBuffer); // vertex buffer can only be "0" lol - - profiler.popPush("render"); - - try - { - renderPass.drawIndexed( - /*indexStart*/ 0, - /*firstIndex*/0, - /*indexCount*/bufferWrapper.indexCount, - /*instanceCount*/1); - } - catch (IllegalStateException e) - { - if (!e.getMessage().contains("Vertex buffer at slot 0 has been closed")) + profiler.popPush("binding"); + + LodBufferContainer bufferContainer = bufferContainers.get(lodIndex); + LodContainerUniformBufferWrapper uniformWrapper = (LodContainerUniformBufferWrapper)bufferContainer.uniforms; + + boolean columnBuilderDebugEnabled = Config.Client.Advanced.Debugging.ColumnBuilderDebugging.columnBuilderDebugEnable.get(); + if (columnBuilderDebugEnabled) { - throw new RuntimeException(e); + if (DhSectionPos.getDetailLevel(bufferContainer.pos) == Config.Client.Advanced.Debugging.ColumnBuilderDebugging.columnBuilderDebugDetailLevel.get() + && DhSectionPos.getX(bufferContainer.pos) == Config.Client.Advanced.Debugging.ColumnBuilderDebugging.columnBuilderDebugXPos.get() + && DhSectionPos.getZ(bufferContainer.pos) == Config.Client.Advanced.Debugging.ColumnBuilderDebugging.columnBuilderDebugZPos.get()) + { + int breakpoint = 0; + } + else + { + continue; + } + } + + renderPass.setUniform("vertUniqueUniformBlock", uniformWrapper.gpuBuffer); + + + + profiler.popPush("rendering"); + + // render each buffer + IVertexBufferWrapper[] bufferWrapperList = opaquePass ? bufferContainer.vbos : bufferContainer.vbosTransparent; + for (int i = 0; i < bufferWrapperList.length; i++) + { + VertexBufferWrapper bufferWrapper = (VertexBufferWrapper) bufferWrapperList[i]; + if (!bufferWrapper.uploaded + || bufferWrapper.vertexCount == 0) + { + continue; + } + + //ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeBufferRenderEvent.class, new DhApiBeforeBufferRenderEvent.EventParam(renderEventParam, modelPos)); + + renderPass.setVertexBuffer(0, bufferWrapper.vboGpuBuffer); // vertex buffer can only be "0" lol + + renderPass.drawIndexed( + /*indexStart*/ 0, + /*firstIndex*/0, + /*indexCount*/bufferWrapper.indexCount, + /*instanceCount*/1); } } } } - - profiler.pop(); } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/renderTest/UniformHandler.java b/common/src/main/java/com/seibel/distanthorizons/common/renderTest/UniformHandler.java index dd4c73a00..acf0b0f65 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/renderTest/UniformHandler.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/renderTest/UniformHandler.java @@ -4,6 +4,7 @@ import com.mojang.blaze3d.buffers.GpuBuffer; import com.mojang.blaze3d.systems.GpuDevice; import com.mojang.blaze3d.systems.RenderSystem; +@Deprecated // TODO use Uniform Wrapper instead public class UniformHandler { diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/WrapperFactory.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/WrapperFactory.java index 9ec50b096..82e2aa46a 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/WrapperFactory.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/WrapperFactory.java @@ -24,6 +24,7 @@ import com.seibel.distanthorizons.api.interfaces.block.IDhApiBlockStateWrapper; import com.seibel.distanthorizons.api.interfaces.override.worldGenerator.IDhApiWorldGenerator; import com.seibel.distanthorizons.api.interfaces.world.IDhApiLevelWrapper; import com.seibel.distanthorizons.api.interfaces.factories.IDhApiWrapperFactory; +import com.seibel.distanthorizons.common.renderTest.LodContainerUniformBufferWrapper; import com.seibel.distanthorizons.common.renderTest.McGenericObjectRenderer; import com.seibel.distanthorizons.common.renderTest.McInstancedVboContainer; import com.seibel.distanthorizons.common.renderTest.VertexBufferWrapper; @@ -40,7 +41,9 @@ import com.seibel.distanthorizons.core.util.LodUtil; import com.seibel.distanthorizons.core.wrapperInterfaces.IWrapperFactory; import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper; +import com.seibel.distanthorizons.core.wrapperInterfaces.render.ILodContainerUniformBufferWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.render.IMcGenericRenderer; +import com.seibel.distanthorizons.core.wrapperInterfaces.render.IUniformBufferWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.render.IVertexBufferWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IBiomeWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; @@ -363,22 +366,15 @@ public class WrapperFactory implements IWrapperFactory @Override - public IVertexBufferWrapper createVboWrapper() - { - return new VertexBufferWrapper(); - } + public IVertexBufferWrapper createVboWrapper() { return new VertexBufferWrapper(); } + @Override + public ILodContainerUniformBufferWrapper createLodContainerUniformWrapper() { return new LodContainerUniformBufferWrapper(); } @Override - public IInstancedVboContainer createInstancedVboContainer() - { - return new McInstancedVboContainer(); - } + public IInstancedVboContainer createInstancedVboContainer() { return new McInstancedVboContainer(); } @Override - public IMcGenericRenderer createGenericRenderer() - { - return new McGenericObjectRenderer(); - } + public IMcGenericRenderer createGenericRenderer() { return new McGenericObjectRenderer(); } diff --git a/coreSubProjects b/coreSubProjects index 2a554395f..0f539f3a6 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 2a554395f78b5872646d6ace51b22992bca233a3 +Subproject commit 0f539f3a6f9ca370dab13c51115e6708211f7fc9