diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDebugWireframeRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDebugWireframeRenderer.java index dbde2f379..ca8f4472d 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDebugWireframeRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDebugWireframeRenderer.java @@ -26,21 +26,16 @@ public class BlazeDebugWireframeRenderer {} 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.pipeline.RenderPipeline; -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; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.VertexFormat; -import com.seibel.distanthorizons.common.render.blaze.util.BlazeUniformUtil; import com.seibel.distanthorizons.common.render.blaze.util.BlazeDhVertexFormatUtil; import com.seibel.distanthorizons.common.render.blaze.wrappers.BlazeVertexFormatBuilder; import com.seibel.distanthorizons.common.render.blaze.wrappers.RenderPassWrapper; import com.seibel.distanthorizons.common.render.blaze.wrappers.RenderPipelineBuilderWrapper; +import com.seibel.distanthorizons.common.render.blaze.wrappers.uniform.BlazeUniformBufferWrapper; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.logging.DhLogger; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; @@ -51,13 +46,10 @@ import com.seibel.distanthorizons.core.util.math.Vec3d; import com.seibel.distanthorizons.core.util.math.Vec3f; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.render.AbstractDhRenderApiDefinition; -import net.minecraft.resources.Identifier; import org.lwjgl.system.MemoryUtil; import java.nio.ByteBuffer; import java.nio.ByteOrder; -import java.util.OptionalDouble; -import java.util.OptionalInt; /** * Handles rendering the wireframe particles @@ -119,7 +111,7 @@ public class BlazeDebugWireframeRenderer extends AbstractDebugWireframeRenderer private GpuBuffer boxVertexBuffer; private GpuBuffer boxIndexBuffer; - private GpuBuffer uniformBuffer; + private final BlazeUniformBufferWrapper uniformBufferWrapper = new BlazeUniformBufferWrapper("debugWireframeUniformBlock"); @@ -263,14 +255,7 @@ public class BlazeDebugWireframeRenderer extends AbstractDebugWireframeRenderer // uniforms { - int uniformBufferSize = new Std140SizeCalculator() - .putMat4f() // uTransform - .putVec4() // uColor - .get(); - - // create data // - Vec3d camPos = MC_RENDER.getCameraExactPosition(); Vec3f camPosFloatThisFrame = new Vec3f((float) camPos.x, (float) camPos.y, (float) camPos.z); @@ -288,23 +273,15 @@ public class BlazeDebugWireframeRenderer extends AbstractDebugWireframeRenderer // upload data // - - ByteBuffer buffer = ByteBuffer.allocateDirect(uniformBufferSize); - buffer.order(ByteOrder.nativeOrder()); - buffer = Std140Builder.intoBuffer(buffer) - .putMat4f(transformMatrix.createJomlMatrix()) // uTransform - .putVec4( + this.uniformBufferWrapper + .putMat4f(transformMatrix) // uTransform + .putVec4f( box.color.getRed() / 255.0f, box.color.getGreen() / 255.0f, box.color.getBlue() / 255.0f, box.color.getAlpha() / 255.0f) // uColor - .get() + .finishAndUpload() ; - - this.uniformBuffer = BlazeUniformUtil.createBuffer("uniformBlock", uniformBufferSize, this.uniformBuffer); - GpuBufferSlice bufferSlice = new GpuBufferSlice(this.uniformBuffer, 0, uniformBufferSize); - - commandEncoder.writeToBuffer(bufferSlice, buffer); } @@ -317,7 +294,7 @@ public class BlazeDebugWireframeRenderer extends AbstractDebugWireframeRenderer BlazeDhMetaRenderer.INSTANCE.dhDepthTextureWrapper)) { // Bind instance data // - renderPassWrapper.setUniform("uniformBlock", this.uniformBuffer); + renderPassWrapper.setUniform("uniformBlock", this.uniformBufferWrapper); renderPassWrapper.setPipeline(this.pipeline); renderPassWrapper.setIndexBuffer(this.boxIndexBuffer); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDhGenericObjectRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDhGenericObjectRenderer.java index 1ac04728a..20b5e3b46 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDhGenericObjectRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDhGenericObjectRenderer.java @@ -24,17 +24,10 @@ public class BlazeDhGenericObjectRenderer {} #else -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.pipeline.BlendFunction; import com.mojang.blaze3d.pipeline.RenderPipeline; -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; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.VertexFormat; import com.seibel.distanthorizons.api.enums.rendering.EDhApiBlockMaterial; @@ -52,7 +45,7 @@ import com.seibel.distanthorizons.common.render.blaze.wrappers.BlazeVertexFormat import com.seibel.distanthorizons.common.render.blaze.wrappers.RenderPassWrapper; import com.seibel.distanthorizons.common.render.blaze.wrappers.RenderPipelineBuilderWrapper; import com.seibel.distanthorizons.common.render.blaze.wrappers.texture.BlazeTextureViewWrapper; -import com.seibel.distanthorizons.common.render.blaze.util.BlazeUniformUtil; +import com.seibel.distanthorizons.common.render.blaze.wrappers.uniform.BlazeUniformBufferWrapper; import com.seibel.distanthorizons.common.wrappers.misc.LightMapWrapper; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.logging.DhLogger; @@ -73,15 +66,10 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IProfilerWrap import com.seibel.distanthorizons.core.wrapperInterfaces.render.renderPass.IDhGenericRenderer; import com.seibel.distanthorizons.coreapi.DependencyInjection.ApiEventInjector; import com.seibel.distanthorizons.coreapi.ModInfo; -import net.minecraft.resources.Identifier; import java.awt.*; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; import java.util.ArrayList; import java.util.Collection; -import java.util.OptionalDouble; -import java.util.OptionalInt; import java.util.concurrent.ConcurrentHashMap; /** @@ -116,7 +104,7 @@ public class BlazeDhGenericObjectRenderer implements IDhGenericRenderer private RenderPipeline pipeline; - private GpuBuffer vertUniformBuffer; + private final BlazeUniformBufferWrapper vertUniformBufferWrapper = new BlazeUniformBufferWrapper("vertUniformBlock"); @@ -427,28 +415,6 @@ public class BlazeDhGenericObjectRenderer implements IDhGenericRenderer // uniforms { - int uniformBufferSize = new Std140SizeCalculator() - .putIVec3() // uOffsetChunk - .putVec3() // uOffsetSubChunk - .putIVec3() // uCameraPosChunk - .putVec3() // uCameraPosSubChunk - - .putVec3() // aTranslateChunk - .putVec3() // aTranslateSubChunk - - .putMat4f() // uProjectionMvm - .putInt() // uSkyLight - .putInt() // uBlockLight - - .putFloat() // uNorthShading - .putFloat() // uSouthShading - .putFloat() // uEastShading - .putFloat() // uWestShading - .putFloat() // uTopShading - .putFloat() // uBottomShading - .get(); - - // create data // Mat4f projectionMvmMatrix = new Mat4f(renderEventParam.dhProjectionMatrix); @@ -457,31 +423,29 @@ public class BlazeDhGenericObjectRenderer implements IDhGenericRenderer // upload data // - ByteBuffer buffer = ByteBuffer.allocateDirect(uniformBufferSize); - buffer.order(ByteOrder.nativeOrder()); - buffer = Std140Builder.intoBuffer(buffer) - .putIVec3( + this.vertUniformBufferWrapper + .putVec3i( LodUtil.getChunkPosFromDouble(boxGroup.getOriginBlockPos().x), LodUtil.getChunkPosFromDouble(boxGroup.getOriginBlockPos().y), LodUtil.getChunkPosFromDouble(boxGroup.getOriginBlockPos().z) ) // uOffsetChunk - .putVec3( + .putVec3f( LodUtil.getSubChunkPosFromDouble(boxGroup.getOriginBlockPos().x), LodUtil.getSubChunkPosFromDouble(boxGroup.getOriginBlockPos().y), LodUtil.getSubChunkPosFromDouble(boxGroup.getOriginBlockPos().z) ) // uOffsetSubChunk - .putIVec3( + .putVec3i( LodUtil.getChunkPosFromDouble(camPos.x), LodUtil.getChunkPosFromDouble(camPos.y), LodUtil.getChunkPosFromDouble(camPos.z) ) // uCameraPosChunk - .putVec3( + .putVec3f( LodUtil.getSubChunkPosFromDouble(camPos.x), LodUtil.getSubChunkPosFromDouble(camPos.y), LodUtil.getSubChunkPosFromDouble(camPos.z) ) // uCameraPosSubChunk - .putMat4f(projectionMvmMatrix.createJomlMatrix()) // uProjectionMvm + .putMat4f(projectionMvmMatrix) // uProjectionMvm .putInt(boxGroup.getSkyLight()) // uSkyLight .putInt(boxGroup.getBlockLight()) // uBlockLight @@ -492,13 +456,8 @@ public class BlazeDhGenericObjectRenderer implements IDhGenericRenderer .putFloat(shading.top) .putFloat(shading.bottom) - .get() + .finishAndUpload() ; - - this.vertUniformBuffer = BlazeUniformUtil.createBuffer("vertUniformBlock", uniformBufferSize, this.vertUniformBuffer); - GpuBufferSlice bufferSlice = new GpuBufferSlice(this.vertUniformBuffer, 0, uniformBufferSize); - - COMMAND_ENCODER.writeToBuffer(bufferSlice, buffer); } @@ -567,7 +526,7 @@ public class BlazeDhGenericObjectRenderer implements IDhGenericRenderer // Bind instance data // - renderPassWrapper.setUniform("vertUniformBlock", this.vertUniformBuffer); + renderPassWrapper.setUniform("vertUniformBlock", this.vertUniformBufferWrapper); // set pipeline renderPassWrapper.setPipeline(this.pipeline); @@ -633,9 +592,9 @@ public class BlazeDhGenericObjectRenderer implements IDhGenericRenderer // close is called outside the render thread and buffer closing must be done on the render thread RenderThreadTaskHandler.INSTANCE.queueRunningOnRenderThread("Generic Obj Cleanup", () -> { - if (this.vertUniformBuffer != null) + if (this.vertUniformBufferWrapper != null) { - this.vertUniformBuffer.close(); + this.vertUniformBufferWrapper.close(); } }); } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDhTerrainRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDhTerrainRenderer.java index 771d1686b..3e5ee9757 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDhTerrainRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDhTerrainRenderer.java @@ -5,29 +5,22 @@ public class BlazeDhTerrainRenderer {} #else -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.pipeline.BlendFunction; import com.mojang.blaze3d.pipeline.RenderPipeline; -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; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.VertexFormat; import com.seibel.distanthorizons.api.methods.events.abstractEvents.DhApiBeforeBufferRenderEvent; import com.seibel.distanthorizons.api.methods.events.abstractEvents.DhApiBeforeRenderPassEvent; import com.seibel.distanthorizons.common.render.blaze.util.BlazeDhVertexFormatUtil; -import com.seibel.distanthorizons.common.render.blaze.util.BlazeUniformUtil; import com.seibel.distanthorizons.common.render.blaze.wrappers.BlazeVertexFormatBuilder; import com.seibel.distanthorizons.common.render.blaze.wrappers.RenderPassWrapper; import com.seibel.distanthorizons.common.render.blaze.wrappers.RenderPipelineBuilderWrapper; import com.seibel.distanthorizons.common.render.blaze.wrappers.texture.BlazeTextureViewWrapper; import com.seibel.distanthorizons.common.render.blaze.wrappers.uniform.BlazeLodUniformBufferWrapper; import com.seibel.distanthorizons.common.render.blaze.wrappers.buffer.BlazeVertexBufferWrapper; +import com.seibel.distanthorizons.common.render.blaze.wrappers.uniform.BlazeUniformBufferWrapper; import com.seibel.distanthorizons.common.wrappers.misc.LightMapWrapper; import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.dataObjects.render.bufferBuilding.LodBufferContainer; @@ -47,13 +40,6 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.render.AbstractDhRender import com.seibel.distanthorizons.core.wrapperInterfaces.render.renderPass.IDhTerrainRenderer; import com.seibel.distanthorizons.core.wrapperInterfaces.render.objects.IVertexBufferWrapper; import com.seibel.distanthorizons.coreapi.DependencyInjection.ApiEventInjector; -import net.minecraft.resources.Identifier; -import org.lwjgl.system.MemoryUtil; - -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.util.OptionalDouble; -import java.util.OptionalInt; /** Renders rendering DH's LOD terrain. */ public class BlazeDhTerrainRenderer implements IDhTerrainRenderer @@ -72,8 +58,8 @@ public class BlazeDhTerrainRenderer implements IDhTerrainRenderer private RenderPipeline transparentPipeline; private boolean init = false; - private GpuBuffer fragUniformBuffer; - private GpuBuffer vertSharedUniformBuffer; + private final BlazeUniformBufferWrapper fragUniformBufferWrapper = new BlazeUniformBufferWrapper("fragUniformBlock"); + private final BlazeUniformBufferWrapper vertSharedUniformBufferWrapper = new BlazeUniformBufferWrapper("vertSharedUniformBlock"); @@ -184,7 +170,7 @@ public class BlazeDhTerrainRenderer implements IDhTerrainRenderer for (int lodIndex = 0; lodIndex < bufferContainers.size(); lodIndex++) { LodBufferContainer bufferContainer = bufferContainers.get(lodIndex); - bufferContainer.uniformContainer.tryUpload(); + bufferContainer.uniformContainer.tryUpload(bufferContainer); } } @@ -207,55 +193,25 @@ public class BlazeDhTerrainRenderer implements IDhTerrainRenderer // upload data // - int uniformBufferSize = new Std140SizeCalculator() - .putInt() // uIsWhiteWorld - - .putFloat() // uWorldYOffset - .putFloat() // uMircoOffset - .putFloat() // uEarthRadius - - .putVec3() // uCameraPos - .putMat4f() // uCombinedMatrix - .get(); - int i = Config.Client.Advanced.Debugging.enableWhiteWorld.get() ? 1 : 0; - ByteBuffer buffer = MemoryUtil.memAlloc(uniformBufferSize); - buffer.order(ByteOrder.nativeOrder()); - Std140Builder.intoBuffer(buffer) + this.vertSharedUniformBufferWrapper .putInt(i) // uIsWhiteWorld .putFloat((float) renderEventParam.worldYOffset) // uWorldYOffset .putFloat(0.01f) // uMircoOffset // 0.01 block offset .putFloat(earthCurveRatio) // uEarthRadius - .putVec3( + .putVec3f( (float) renderEventParam.exactCameraPosition.x, (float) renderEventParam.exactCameraPosition.y, (float) renderEventParam.exactCameraPosition.z) // uCameraPos - .putMat4f(combinedMatrix.createJomlMatrix()) // uCombinedMatrix - .get(); - - this.vertSharedUniformBuffer = BlazeUniformUtil.createBuffer("vertSharedUniformBlock", uniformBufferSize, this.vertSharedUniformBuffer); - GpuBufferSlice bufferSlice = new GpuBufferSlice(this.vertSharedUniformBuffer, 0, uniformBufferSize); - - COMMAND_ENCODER.writeToBuffer(bufferSlice, buffer); - - MemoryUtil.memFree(buffer); + .putMat4f(combinedMatrix) // uCombinedMatrix + .finishAndUpload(); } profiler.popPush("set frag uniforms"); { - int uniformBufferSize = new Std140SizeCalculator() - .putFloat() // uClipDistance - .putFloat() // uNoiseIntensity - .putInt() // uNoiseSteps - .putInt() // uNoiseDropoff - .putInt() // uDitherDhRendering - .putInt() // uNoiseEnabled - .get(); - - // create data // float dhNearClipDistance = RenderUtil.getNearClipPlaneInBlocks(); @@ -267,24 +223,15 @@ public class BlazeDhTerrainRenderer implements IDhTerrainRenderer // upload data // - - ByteBuffer buffer = MemoryUtil.memAlloc(uniformBufferSize); - buffer.order(ByteOrder.nativeOrder()); - buffer = Std140Builder.intoBuffer(buffer) + this.fragUniformBufferWrapper .putFloat(dhNearClipDistance) // uClipDistance .putFloat(Config.Client.Advanced.Graphics.NoiseTexture.noiseIntensity.get()) // uNoiseIntensity .putInt(Config.Client.Advanced.Graphics.NoiseTexture.noiseSteps.get()) // uNoiseSteps .putInt(Config.Client.Advanced.Graphics.NoiseTexture.noiseDropoff.get()) // uNoiseDropoff .putInt(Config.Client.Advanced.Graphics.Quality.ditherDhFade.get() ? 1 : 0) // uDitherDhRendering .putInt(Config.Client.Advanced.Graphics.NoiseTexture.enableNoiseTexture.get() ? 1 : 0) // uNoiseEnabled - .get() + .finishAndUpload() ; - - this.fragUniformBuffer = BlazeUniformUtil.createBuffer("fragUniformBlock", uniformBufferSize, this.fragUniformBuffer); - GpuBufferSlice bufferSlice = new GpuBufferSlice(this.fragUniformBuffer, 0, uniformBufferSize); - - COMMAND_ENCODER.writeToBuffer(bufferSlice, buffer); - MemoryUtil.memFree(buffer); } @@ -310,8 +257,8 @@ public class BlazeDhTerrainRenderer implements IDhTerrainRenderer renderPassWrapper.setPipeline(opaquePass ? this.opaquePipeline : this.transparentPipeline); // shared uniforms - renderPassWrapper.setUniform("fragUniformBlock", this.fragUniformBuffer); - renderPassWrapper.setUniform("vertSharedUniformBlock", this.vertSharedUniformBuffer); + renderPassWrapper.setUniform("fragUniformBlock", this.fragUniformBufferWrapper); + renderPassWrapper.setUniform("vertSharedUniformBlock", this.vertSharedUniformBufferWrapper); @@ -335,7 +282,7 @@ public class BlazeDhTerrainRenderer implements IDhTerrainRenderer } } - renderPassWrapper.setUniform("vertUniqueUniformBlock", uniformWrapper.gpuBuffer); + renderPassWrapper.setUniform("vertUniqueUniformBlock", uniformWrapper); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/apply/BlazeDhApplyRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/apply/BlazeDhApplyRenderer.java index 577949ffd..f38a1ef56 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/apply/BlazeDhApplyRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/apply/BlazeDhApplyRenderer.java @@ -25,9 +25,6 @@ public class BlazeDhApplyRenderer {} #else 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.pipeline.BlendFunction; import com.mojang.blaze3d.pipeline.RenderPipeline; import com.mojang.blaze3d.systems.CommandEncoder; @@ -36,13 +33,13 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.textures.*; import com.mojang.blaze3d.vertex.VertexFormat; import com.seibel.distanthorizons.common.render.blaze.util.BlazeDhVertexFormatUtil; -import com.seibel.distanthorizons.common.render.blaze.util.BlazeUniformUtil; import com.seibel.distanthorizons.common.render.blaze.wrappers.BlazeVertexFormatBuilder; import com.seibel.distanthorizons.common.render.blaze.wrappers.RenderPassWrapper; import com.seibel.distanthorizons.common.render.blaze.wrappers.RenderPipelineBuilderWrapper; import com.seibel.distanthorizons.common.render.blaze.wrappers.texture.BlazeTextureViewWrapper; import com.seibel.distanthorizons.common.render.blaze.util.BlazePostProcessUtil; import com.seibel.distanthorizons.common.render.blaze.wrappers.texture.BlazeTextureWrapper; +import com.seibel.distanthorizons.common.render.blaze.wrappers.uniform.BlazeUniformBufferWrapper; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.logging.DhLogger; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; @@ -51,8 +48,6 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.render.AbstractDhRender import com.seibel.distanthorizons.coreapi.ModInfo; import org.jetbrains.annotations.Nullable; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; import java.util.Arrays; /** @@ -74,7 +69,7 @@ public class BlazeDhApplyRenderer private RenderPipeline pipeline; - private GpuBuffer fragUniformBuffer; + private final BlazeUniformBufferWrapper fragUniformBufferWrapper = new BlazeUniformBufferWrapper("baseFragUniformBlock"); protected GpuBuffer vboGpuBuffer; @@ -104,7 +99,7 @@ public class BlazeDhApplyRenderer */ private final String[] uniformNames; /** will be an empty array if unneeded */ - private final GpuBuffer[] uniformBuffers; + private final BlazeUniformBufferWrapper[] uniformBufferWrappers; @@ -140,7 +135,7 @@ public class BlazeDhApplyRenderer this.fragmentShaderPath = fragmentShaderPath; this.uniformNames = uniformNames; - this.uniformBuffers = new GpuBuffer[this.uniformNames.length]; + this.uniformBufferWrappers = new BlazeUniformBufferWrapper[this.uniformNames.length]; } private void tryInit( @@ -214,7 +209,7 @@ public class BlazeDhApplyRenderer //========// //region - public void setUniform(String uniformName, GpuBuffer uniformBuffer) + public void setUniform(String uniformName, BlazeUniformBufferWrapper uniformBufferWrapper) { // the uniform array should be short enough (less than 10 items) // where a sequential search should be plenty fast @@ -223,7 +218,7 @@ public class BlazeDhApplyRenderer String nameAtIndex = this.uniformNames[i]; if (nameAtIndex.equals(uniformName)) { - this.uniformBuffers[i] = uniformBuffer; + this.uniformBufferWrappers[i] = uniformBufferWrapper; break; } } @@ -239,23 +234,10 @@ public class BlazeDhApplyRenderer this.dummyDepthTextureWrapper.tryCreateOrResize(); - { - int uniformBufferSize = new Std140SizeCalculator() - .putInt() // uIsReverseZDepth - .get(); - - ByteBuffer buffer = ByteBuffer.allocateDirect(uniformBufferSize); - buffer.order(ByteOrder.nativeOrder()); - buffer = Std140Builder.intoBuffer(buffer) - .putInt((RENDER_API_DEF.getRenderDepth() == EDhRenderDepth.REVERSE_Z) ? 1 : 0) // uIsReverseZDepth - .get() - ; - - this.fragUniformBuffer = BlazeUniformUtil.createBuffer("baseFragUniformBlock", uniformBufferSize, this.fragUniformBuffer); - GpuBufferSlice bufferSlice = new GpuBufferSlice(this.fragUniformBuffer, 0, uniformBufferSize); - - COMMAND_ENCODER.writeToBuffer(bufferSlice, buffer); - } + this.fragUniformBufferWrapper + .putInt((RENDER_API_DEF.getRenderDepth() == EDhRenderDepth.REVERSE_Z) ? 1 : 0) // uIsReverseZDepth + .finishAndUpload(); + ; try (RenderPassWrapper renderPassWrapper = new RenderPassWrapper( this::getIdentifierName, @@ -268,7 +250,7 @@ public class BlazeDhApplyRenderer for (int i = 0; i < this.uniformNames.length; i++) { String uniformName = this.uniformNames[i]; - GpuBuffer uniformBuffer = this.uniformBuffers[i]; + BlazeUniformBufferWrapper uniformBuffer = this.uniformBufferWrappers[i]; if (uniformBuffer == null) { throw new IllegalStateException("Missing uniform ["+uniformName+"], please set the uniform before rendering."); @@ -277,7 +259,7 @@ public class BlazeDhApplyRenderer renderPassWrapper.setUniform(uniformName, uniformBuffer); } - renderPassWrapper.setUniform("baseFragUniformBlock", this.fragUniformBuffer); + renderPassWrapper.setUniform("baseFragUniformBlock", this.fragUniformBufferWrapper); renderPassWrapper.setVertexBuffer(this.vboGpuBuffer); renderPassWrapper.setPipeline(this.pipeline); @@ -290,7 +272,7 @@ public class BlazeDhApplyRenderer // so we can check if they're missing during next frame's rendering if (ModInfo.IS_DEV_BUILD) { - Arrays.fill(this.uniformBuffers, null); + Arrays.fill(this.uniformBufferWrappers, null); } } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFarFadeRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFarFadeRenderer.java index 73a976b27..c008b59a3 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFarFadeRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFarFadeRenderer.java @@ -25,22 +25,18 @@ public class BlazeDhFarFadeRenderer {} #else 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.pipeline.RenderPipeline; import com.mojang.blaze3d.systems.CommandEncoder; import com.mojang.blaze3d.systems.GpuDevice; -import com.mojang.blaze3d.systems.RenderPass; import com.mojang.blaze3d.systems.RenderSystem; import com.seibel.distanthorizons.common.render.blaze.BlazeDhMetaRenderer; import com.seibel.distanthorizons.common.render.blaze.apply.BlazeDhCopyRenderer; import com.seibel.distanthorizons.common.render.blaze.util.BlazePostProcessUtil; -import com.seibel.distanthorizons.common.render.blaze.util.BlazeUniformUtil; import com.seibel.distanthorizons.common.render.blaze.wrappers.RenderPassWrapper; import com.seibel.distanthorizons.common.render.blaze.wrappers.RenderPipelineBuilderWrapper; import com.seibel.distanthorizons.common.render.blaze.wrappers.texture.BlazeTextureViewWrapper; import com.seibel.distanthorizons.common.render.blaze.wrappers.texture.BlazeTextureWrapper; +import com.seibel.distanthorizons.common.render.blaze.wrappers.uniform.BlazeUniformBufferWrapper; import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftRenderWrapper; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.logging.DhLogger; @@ -51,12 +47,6 @@ import com.seibel.distanthorizons.core.util.RenderUtil; import com.seibel.distanthorizons.core.util.math.Mat4f; import com.seibel.distanthorizons.core.wrapperInterfaces.render.AbstractDhRenderApiDefinition; import com.seibel.distanthorizons.core.wrapperInterfaces.render.renderPass.IDhFarFadeRenderer; -import net.minecraft.client.Minecraft; - -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.util.OptionalDouble; -import java.util.OptionalInt; /** * Fades out DH's far clip plane @@ -74,7 +64,7 @@ public class BlazeDhFarFadeRenderer implements IDhFarFadeRenderer private RenderPipeline pipeline; private boolean init = false; - private GpuBuffer fragUniformBuffer; + private final BlazeUniformBufferWrapper fragUniformBufferWrapper = new BlazeUniformBufferWrapper("fragUniformBlock"); private GpuBuffer vboGpuBuffer; @@ -162,14 +152,6 @@ public class BlazeDhFarFadeRenderer implements IDhFarFadeRenderer this.dhFadeDepthTextureWrapper.tryCreateOrResize(); { - int uniformBufferSize = new Std140SizeCalculator() - .putFloat() // uStartFadeBlockDistance - .putFloat() // uEndFadeBlockDistance - .putMat4f() // uDhInvMvmProj - .putInt() // uIsReverseZDepth - .get(); - - // create data // float dhFarClipDistance = RenderUtil.getFarClipPlaneDistanceInBlocks(); @@ -187,21 +169,13 @@ public class BlazeDhFarFadeRenderer implements IDhFarFadeRenderer // upload data // - - ByteBuffer buffer = ByteBuffer.allocateDirect(uniformBufferSize); - buffer.order(ByteOrder.nativeOrder()); - buffer = Std140Builder.intoBuffer(buffer) + fragUniformBufferWrapper .putFloat(fadeStartDistance) // uStartFadeBlockDistance .putFloat(fadeEndDistance) // uEndFadeBlockDistance - .putMat4f(inverseDhMvmProjMatrix.createJomlMatrix()) // uDhInvMvmProj + .putMat4f(inverseDhMvmProjMatrix) // uDhInvMvmProj .putInt((RENDER_API_DEF.getRenderDepth() == EDhRenderDepth.REVERSE_Z) ? 1 : 0) // uIsReverseZDepth - .get() + .finishAndUpload() ; - - this.fragUniformBuffer = BlazeUniformUtil.createBuffer("fragUniformBlock", uniformBufferSize, this.fragUniformBuffer); - GpuBufferSlice bufferSlice = new GpuBufferSlice(this.fragUniformBuffer, 0, uniformBufferSize); - - COMMAND_ENCODER.writeToBuffer(bufferSlice, buffer); } @@ -224,7 +198,7 @@ public class BlazeDhFarFadeRenderer implements IDhFarFadeRenderer renderPassWrapper.bindTexture("uDhDepthTexture", BlazeDhMetaRenderer.INSTANCE.dhDepthTextureWrapper); renderPassWrapper.bindTexture("uDhColorTexture", BlazeDhMetaRenderer.INSTANCE.dhColorTextureWrapper); - renderPassWrapper.setUniform("fragUniformBlock", this.fragUniformBuffer); + renderPassWrapper.setUniform("fragUniformBlock", this.fragUniformBufferWrapper); renderPassWrapper.setVertexBuffer(this.vboGpuBuffer); renderPassWrapper.setPipeline(this.pipeline); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFogRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFogRenderer.java index b022c84e1..13b3a9005 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFogRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFogRenderer.java @@ -32,7 +32,7 @@ import com.seibel.distanthorizons.common.render.blaze.wrappers.RenderPassWrapper import com.seibel.distanthorizons.common.render.blaze.wrappers.RenderPipelineBuilderWrapper; import com.seibel.distanthorizons.common.render.blaze.wrappers.texture.BlazeTextureWrapper; import com.seibel.distanthorizons.common.render.blaze.util.BlazePostProcessUtil; -import com.seibel.distanthorizons.common.render.blaze.util.BlazeUniformUtil; +import com.seibel.distanthorizons.common.render.blaze.wrappers.uniform.BlazeUniformBufferWrapper; import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.logging.DhLogger; @@ -47,13 +47,8 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.render.AbstractDhRender import com.seibel.distanthorizons.core.wrapperInterfaces.render.renderPass.IDhFogRenderer; import java.awt.*; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; 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.pipeline.BlendFunction; import com.mojang.blaze3d.pipeline.RenderPipeline; import com.mojang.blaze3d.systems.CommandEncoder; @@ -89,7 +84,7 @@ public class BlazeDhFogRenderer implements IDhFogRenderer private RenderPipeline pipeline; private boolean init = false; - private GpuBuffer fragUniformBuffer; + private final BlazeUniformBufferWrapper fragUniformBufferWrapper = new BlazeUniformBufferWrapper("dh_fog_frag_uniform"); private GpuBuffer vboGpuBuffer; @@ -181,48 +176,6 @@ public class BlazeDhFogRenderer implements IDhFogRenderer this.fogDepthTextureWrapper.tryCreateOrResize(); { - int uniformBufferSize = new Std140SizeCalculator() - - // fog uniforms - .putVec4() // uFogColor - .putFloat() //uFogScale - .putFloat() //uFogVerticalScale - // only used for debugging - .putInt() //uFogDebugMode // 1 = render everything with fog color // 7 = use debug rendering - .putInt() //uFogFalloffType - - // fog config - .putFloat() // uFarFogStart - .putFloat() // uFarFogLength - .putFloat() // uFarFogMin - .putFloat() // uFarFogRange - .putFloat() // uFarFogDensity - - // height fog config - .putFloat() // uHeightFogStart - .putFloat() // uHeightFogLength - .putFloat() // uHeightFogMin - .putFloat() // uHeightFogRange - .putFloat() // uHeightFogDensity - - // ?? - .putInt() // uHeightFogEnabled - .putInt() // uHeightFogFalloffType - .putInt() // uHeightBasedOnCamera - .putFloat() // uHeightFogBaseHeight - .putInt() // uHeightFogAppliesUp - .putInt() // uHeightFogAppliesDown - .putInt() // uUseSphericalFog - .putInt() // uHeightFogMixingMode - .putFloat() // uCameraBlockYPos - - .putMat4f() // uInvMvmProj - - .putInt() // uIsReverseZDepth - - .get(); - - // create data // int lodDrawDistance = Config.Client.Advanced.Graphics.Quality.lodChunkRenderDistanceRadius.get() * LodUtil.CHUNK_WIDTH; @@ -242,12 +195,9 @@ public class BlazeDhFogRenderer implements IDhFogRenderer // upload data // - ByteBuffer buffer = ByteBuffer.allocateDirect(uniformBufferSize); - buffer.order(ByteOrder.nativeOrder()); - buffer = Std140Builder.intoBuffer(buffer) - + this.fragUniformBufferWrapper // fog uniforms - .putVec4( + .putVec4f( fogColor.getRed() / 255.0f, fogColor.getGreen() / 255.0f, fogColor.getBlue() / 255.0f, @@ -282,17 +232,12 @@ public class BlazeDhFogRenderer implements IDhFogRenderer .putInt(heightFogMixingMode.value) // uHeightFogMixingMode .putFloat((float)MC_RENDER.getCameraExactPosition().y) // uCameraBlockYPos - .putMat4f(inverseMvmProjMatrix.createJomlMatrix()) // uInvMvmProj + .putMat4f(inverseMvmProjMatrix) // uInvMvmProj .putInt((RENDER_API_DEF.getRenderDepth() == EDhRenderDepth.REVERSE_Z) ? 1 : 0) // uIsReverseZDepth - .get() + .finishAndUpload() ; - - this.fragUniformBuffer = BlazeUniformUtil.createBuffer("fragUniformBlock", uniformBufferSize, this.fragUniformBuffer); - GpuBufferSlice bufferSlice = new GpuBufferSlice(this.fragUniformBuffer, 0, uniformBufferSize); - - COMMAND_ENCODER.writeToBuffer(bufferSlice, buffer); } @@ -312,7 +257,7 @@ public class BlazeDhFogRenderer implements IDhFogRenderer { renderPassWrapper.bindTexture("uDhDepthTexture", BlazeDhMetaRenderer.INSTANCE.dhDepthTextureWrapper); - renderPassWrapper.setUniform("fragUniformBlock", this.fragUniformBuffer); + renderPassWrapper.setUniform("fragUniformBlock", this.fragUniformBufferWrapper); renderPassWrapper.setVertexBuffer(this.vboGpuBuffer); // vertex buffer can only be "0" lol renderPassWrapper.setPipeline(this.pipeline); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhSsaoRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhSsaoRenderer.java index 490c34f11..d5bec4b84 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhSsaoRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhSsaoRenderer.java @@ -30,7 +30,7 @@ import com.seibel.distanthorizons.common.render.blaze.wrappers.RenderPassWrapper import com.seibel.distanthorizons.common.render.blaze.wrappers.RenderPipelineBuilderWrapper; import com.seibel.distanthorizons.common.render.blaze.wrappers.texture.BlazeTextureWrapper; import com.seibel.distanthorizons.common.render.blaze.util.BlazePostProcessUtil; -import com.seibel.distanthorizons.common.render.blaze.util.BlazeUniformUtil; +import com.seibel.distanthorizons.common.render.blaze.wrappers.uniform.BlazeUniformBufferWrapper; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.logging.DhLogger; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; @@ -42,20 +42,11 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRen import com.seibel.distanthorizons.core.wrapperInterfaces.render.AbstractDhRenderApiDefinition; import com.seibel.distanthorizons.core.wrapperInterfaces.render.renderPass.IDhSsaoRenderer; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.util.OptionalDouble; -import java.util.OptionalInt; - 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.pipeline.BlendFunction; import com.mojang.blaze3d.pipeline.RenderPipeline; import com.mojang.blaze3d.systems.CommandEncoder; import com.mojang.blaze3d.systems.GpuDevice; -import com.mojang.blaze3d.systems.RenderPass; import com.mojang.blaze3d.systems.RenderSystem; #if MC_VER <= MC_26_1_2 @@ -84,8 +75,8 @@ public class BlazeDhSsaoRenderer implements IDhSsaoRenderer private RenderPipeline pipeline; private boolean init = false; - private GpuBuffer fragUniformBuffer; - private GpuBuffer applyFragUniformBuffer; + private final BlazeUniformBufferWrapper fragUniformBufferWrapper = new BlazeUniformBufferWrapper("fragUniformBlock"); + private final BlazeUniformBufferWrapper applyFragUniformBufferWrapper = new BlazeUniformBufferWrapper("applyFragUniformBlock"); private GpuBuffer vboGpuBuffer; @@ -181,34 +172,14 @@ public class BlazeDhSsaoRenderer implements IDhSsaoRenderer // frag uniforms { - int uniformBufferSize = new Std140SizeCalculator() - .putInt() // uSampleCount\ - - .putFloat() // uRadius - .putFloat() // uStrength - .putFloat() // uMinLight - .putFloat() // uBias - .putFloat() // uFadeDistanceInBlocks - - .putMat4f() // uInvProj - .putMat4f() // uProj - - .putInt() // uIsReverseZDepth - .get(); - - // create data // - Mat4f projMatrix = new Mat4f(renderParams.dhProjectionMatrix); Mat4f invertedProjMatrix = new Mat4f(renderParams.dhProjectionMatrix); invertedProjMatrix.invert(); // upload data // - - ByteBuffer buffer = ByteBuffer.allocateDirect(uniformBufferSize); - buffer.order(ByteOrder.nativeOrder()); - buffer = Std140Builder.intoBuffer(buffer) + this.fragUniformBufferWrapper .putInt(6) // uSampleCount .putFloat(4.0f) // uRadius @@ -217,29 +188,16 @@ public class BlazeDhSsaoRenderer implements IDhSsaoRenderer .putFloat(0.02f) // uBias .putFloat(1_600.0f) // uFadeDistanceInBlocks - .putMat4f(invertedProjMatrix.createJomlMatrix()) - .putMat4f(projMatrix.createJomlMatrix()) + .putMat4f(invertedProjMatrix) + .putMat4f(projMatrix) .putInt((RENDER_API_DEF.getRenderDepth() == EDhRenderDepth.REVERSE_Z) ? 1 : 0) // uIsReverseZDepth - .get() + .finishAndUpload() ; - - this.fragUniformBuffer = BlazeUniformUtil.createBuffer("fragUniformBlock", uniformBufferSize, this.fragUniformBuffer); - GpuBufferSlice bufferSlice = new GpuBufferSlice(this.fragUniformBuffer, 0, uniformBufferSize); - - COMMAND_ENCODER.writeToBuffer(bufferSlice, buffer); } // apply frag uniforms { - int uniformBufferSize = new Std140SizeCalculator() - .putVec2() // uViewSize - .putInt() // uBlurRadius - .putFloat() // uNearClipPlane - .putFloat() // uFarClipPlane - .get(); - - // create data // float viewWidth = (float)MC_RENDER.getTargetFramebufferViewportWidth(); @@ -250,27 +208,19 @@ public class BlazeDhSsaoRenderer implements IDhSsaoRenderer // upload data // - - ByteBuffer buffer = ByteBuffer.allocateDirect(uniformBufferSize); - buffer.order(ByteOrder.nativeOrder()); - buffer = Std140Builder.intoBuffer(buffer) - .putVec2(viewWidth, viewHeight) // uViewSize + this.applyFragUniformBufferWrapper + .putVec2f(viewWidth, viewHeight) // uViewSize .putInt(2) // uBlurRadius .putFloat(nearClipPlane) // uNearClipPlane .putFloat(farClipPlane) // uFarClipPlane - .get() + .finishAndUpload() ; - - this.applyFragUniformBuffer = BlazeUniformUtil.createBuffer("applyFragUniformBlock", uniformBufferSize, this.applyFragUniformBuffer); - GpuBufferSlice bufferSlice = new GpuBufferSlice(this.applyFragUniformBuffer, 0, uniformBufferSize); - - COMMAND_ENCODER.writeToBuffer(bufferSlice, buffer); } this.renderSsaoToTexture(); - this.applyRenderer.setUniform("applyFragUniformBlock", this.applyFragUniformBuffer); + this.applyRenderer.setUniform("applyFragUniformBlock", this.applyFragUniformBufferWrapper); this.applyRenderer.render(this.ssaoColorTextureWrapper.texture, BlazeDhMetaRenderer.INSTANCE.dhDepthTextureWrapper.texture, BlazeDhMetaRenderer.INSTANCE.dhColorTextureWrapper.texture); } @@ -284,7 +234,7 @@ public class BlazeDhSsaoRenderer implements IDhSsaoRenderer { renderPassWrapper.bindTexture("uDhDepthTexture", BlazeDhMetaRenderer.INSTANCE.dhDepthTextureWrapper); - renderPassWrapper.setUniform("fragUniformBlock", this.fragUniformBuffer); + renderPassWrapper.setUniform("fragUniformBlock", this.fragUniformBufferWrapper); renderPassWrapper.setVertexBuffer(this.vboGpuBuffer); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeVanillaFadeRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeVanillaFadeRenderer.java index 1d957cfc8..499836e5a 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeVanillaFadeRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeVanillaFadeRenderer.java @@ -25,25 +25,18 @@ public class BlazeVanillaFadeRenderer {} #else 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.pipeline.RenderPipeline; -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; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.VertexFormat; import com.seibel.distanthorizons.common.render.blaze.BlazeDhMetaRenderer; import com.seibel.distanthorizons.common.render.blaze.apply.BlazeDhCopyRenderer; import com.seibel.distanthorizons.common.render.blaze.util.BlazePostProcessUtil; -import com.seibel.distanthorizons.common.render.blaze.util.BlazeUniformUtil; import com.seibel.distanthorizons.common.render.blaze.wrappers.RenderPassWrapper; import com.seibel.distanthorizons.common.render.blaze.wrappers.RenderPipelineBuilderWrapper; import com.seibel.distanthorizons.common.render.blaze.wrappers.texture.BlazeTextureViewWrapper; import com.seibel.distanthorizons.common.render.blaze.wrappers.texture.BlazeTextureWrapper; +import com.seibel.distanthorizons.common.render.blaze.wrappers.uniform.BlazeUniformBufferWrapper; import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftRenderWrapper; import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; @@ -56,13 +49,6 @@ import com.seibel.distanthorizons.core.util.math.Mat4f; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.render.AbstractDhRenderApiDefinition; import com.seibel.distanthorizons.core.wrapperInterfaces.render.renderPass.IDhVanillaFadeRenderer; -import net.minecraft.client.Minecraft; -import net.minecraft.resources.Identifier; - -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.util.OptionalDouble; -import java.util.OptionalInt; /** * Fades the vanilla chunks @@ -84,7 +70,7 @@ public class BlazeVanillaFadeRenderer implements IDhVanillaFadeRenderer private RenderPipeline pipeline; private boolean init = false; - private GpuBuffer fragUniformBuffer; + private final BlazeUniformBufferWrapper fragUniformBufferWrapper = new BlazeUniformBufferWrapper("fragUniformBlock"); private GpuBuffer vboGpuBuffer; @@ -175,17 +161,6 @@ public class BlazeVanillaFadeRenderer implements IDhVanillaFadeRenderer { - int uniformBufferSize = new Std140SizeCalculator() - .putInt() // uOnlyRenderLods - .putFloat() // uStartFadeBlockDistance - .putFloat() // uEndFadeBlockDistance - .putFloat() // uMaxLevelHeight - .putMat4f() // uDhInvMvmProj - .putMat4f() // uMcInvMvmProj - .putInt() // uIsReverseZDepth - .get(); - - // create data // float dhNearClipDistance = RenderUtil.getNearClipPlaneInBlocks(); @@ -213,24 +188,16 @@ public class BlazeVanillaFadeRenderer implements IDhVanillaFadeRenderer // upload data // - - ByteBuffer buffer = ByteBuffer.allocateDirect(uniformBufferSize); - buffer.order(ByteOrder.nativeOrder()); - buffer = Std140Builder.intoBuffer(buffer) + this.fragUniformBufferWrapper .putInt(Config.Client.Advanced.Debugging.lodOnlyMode.get() ? 1 : 0) // uOnlyRenderLods .putFloat(fadeStartDistance) // uStartFadeBlockDistance .putFloat(fadeEndDistance) // uEndFadeBlockDistance .putFloat(renderParams.clientLevelWrapper.getMaxHeight()) // uMaxLevelHeight - .putMat4f(inverseDhMvmProjMatrix.createJomlMatrix()) // uDhInvMvmProj - .putMat4f(inverseMcMvmProjMatrix.createJomlMatrix()) // uMcInvMvmProj + .putMat4f(inverseDhMvmProjMatrix) // uDhInvMvmProj + .putMat4f(inverseMcMvmProjMatrix) // uMcInvMvmProj .putInt((RENDER_API_DEF.getRenderDepth() == EDhRenderDepth.REVERSE_Z) ? 1 : 0) // uIsReverseZDepth - .get() + .finishAndUpload() ; - - this.fragUniformBuffer = BlazeUniformUtil.createBuffer("fragUniformBlock", uniformBufferSize, this.fragUniformBuffer); - GpuBufferSlice bufferSlice = new GpuBufferSlice(this.fragUniformBuffer, 0, uniformBufferSize); - - COMMAND_ENCODER.writeToBuffer(bufferSlice, buffer); } @@ -252,7 +219,7 @@ public class BlazeVanillaFadeRenderer implements IDhVanillaFadeRenderer renderPassWrapper.bindTexture("uDhDepthTexture", BlazeDhMetaRenderer.INSTANCE.dhDepthTextureWrapper); renderPassWrapper.bindTexture("uDhColorTexture", BlazeDhMetaRenderer.INSTANCE.dhColorTextureWrapper); - renderPassWrapper.setUniform("fragUniformBlock", this.fragUniformBuffer); + renderPassWrapper.setUniform("fragUniformBlock", this.fragUniformBufferWrapper); renderPassWrapper.setVertexBuffer(this.vboGpuBuffer); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/RenderPassWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/RenderPassWrapper.java index 2107bebe4..47113a473 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/RenderPassWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/RenderPassWrapper.java @@ -12,10 +12,10 @@ import com.mojang.blaze3d.systems.RenderPass; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.VertexFormat; import com.seibel.distanthorizons.common.render.blaze.wrappers.texture.IDhBlazeTexture; +import com.seibel.distanthorizons.common.render.blaze.wrappers.uniform.BlazeUniformBufferWrapper; import com.seibel.distanthorizons.core.logging.DhLogger; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; -import java.util.Optional; import java.util.OptionalDouble; import java.util.OptionalInt; import java.util.function.Supplier; @@ -101,7 +101,7 @@ public class RenderPassWrapper implements AutoCloseable #endif } - public void setUniform(String uniformName, GpuBuffer uniformBuffer) { this.renderPass.setUniform(uniformName, uniformBuffer); } + public void setUniform(String uniformName, BlazeUniformBufferWrapper uniformBuffer) { this.renderPass.setUniform(uniformName, uniformBuffer.getGpuBuffer()); } public void setPipeline(RenderPipeline pipeline) { this.renderPass.setPipeline(pipeline); } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/uniform/BlazeLodUniformBufferWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/uniform/BlazeLodUniformBufferWrapper.java index 795730556..0747b686d 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/uniform/BlazeLodUniformBufferWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/uniform/BlazeLodUniformBufferWrapper.java @@ -5,14 +5,10 @@ public class BlazeLodUniformBufferWrapper {} #else -import com.mojang.blaze3d.buffers.Std140Builder; -import com.mojang.blaze3d.buffers.Std140SizeCalculator; import com.seibel.distanthorizons.core.dataObjects.render.bufferBuilding.LodBufferContainer; import com.seibel.distanthorizons.core.util.math.Vec3f; import com.seibel.distanthorizons.core.wrapperInterfaces.render.objects.ILodContainerUniformBufferWrapper; -import java.nio.ByteBuffer; - public class BlazeLodUniformBufferWrapper extends BlazeUniformBufferWrapper implements ILodContainerUniformBufferWrapper { @@ -37,35 +33,22 @@ public class BlazeLodUniformBufferWrapper extends BlazeUniformBufferWrapper impl //region @Override - public void createUniformData(LodBufferContainer bufferContainer) - { - Vec3f modelOffset = new Vec3f( - (float) (bufferContainer.minCornerBlockPos.getX()), - (float) (bufferContainer.minCornerBlockPos.getY()), - (float) (bufferContainer.minCornerBlockPos.getZ())); - - // 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(); - - } - - @Override - public void tryUpload() + public void tryUpload(LodBufferContainer bufferContainer) { if (this.uploaded) { return; } - this.upload(); + Vec3f modelOffset = new Vec3f( + (float) (bufferContainer.minCornerBlockPos.getX()), + (float) (bufferContainer.minCornerBlockPos.getY()), + (float) (bufferContainer.minCornerBlockPos.getZ())); + + // upload data // + this + .putVec3f(modelOffset.x, modelOffset.y, modelOffset.z) // uModelOffset + .finishAndUpload(); this.uploaded = true; } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/uniform/BlazeUniformBufferWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/uniform/BlazeUniformBufferWrapper.java index a487b0bde..094bc7329 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/uniform/BlazeUniformBufferWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/uniform/BlazeUniformBufferWrapper.java @@ -1,23 +1,28 @@ package com.seibel.distanthorizons.common.render.blaze.wrappers.uniform; #if MC_VER <= MC_1_21_10 -public class BlazeUniformBufferWrapper {} +public class BlazeNewUniformBufferWrapper {} #else 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.common.render.blaze.util.BlazeUniformUtil; import com.seibel.distanthorizons.core.logging.DhLogger; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; -import com.seibel.distanthorizons.core.wrapperInterfaces.render.objects.IUniformBufferWrapper; +import com.seibel.distanthorizons.core.util.math.Mat4f; +import org.lwjgl.system.MemoryUtil; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.ArrayList; -public class BlazeUniformBufferWrapper implements IUniformBufferWrapper +public class BlazeUniformBufferWrapper implements AutoCloseable { private static final DhLogger LOGGER = new DhLoggerBuilder().build(); @@ -27,11 +32,22 @@ public class BlazeUniformBufferWrapper implements IUniformBufferWrapper private final String name; - private int cpuBufferSize = 0; - private int gpuBufferSize = 0; + /** measured in bytes */ + private int bufferSize = 0; private ByteBuffer cpuBuffer = null; - public GpuBuffer gpuBuffer = null; + + private GpuBuffer gpuBuffer = null; + public GpuBuffer getGpuBuffer() { return this.gpuBuffer; } + private GpuBufferSlice bufferSlice = null; + + /** the element count the current CPU Buffer is sized for */ + private int previousElementCount = 0; + /** how many elements are currently in flight (ie being added to the buffer right now) */ + private int elementCount = 0; + /** used to resize the buffers dur first-time setup */ + private final ArrayList uniformElementTypes = new ArrayList<>(0); + private Std140Builder uniformBufferBuilder = null; @@ -46,63 +62,136 @@ public class BlazeUniformBufferWrapper implements IUniformBufferWrapper - //========// - // render // - //========// + //=================// + // element builder // + //=================// //region - protected ByteBuffer getOrCreateBuffer(int size) + public BlazeUniformBufferWrapper putVec2f(float x, float y) { - if (this.cpuBuffer == null - || this.cpuBufferSize != size) + this.putElement(EUniformElement.VEC2f); + this.uniformBufferBuilder.putVec2(x,y); + return this; + } + public BlazeUniformBufferWrapper putVec3i(int x, int y, int z) + { + this.putElement(EUniformElement.VEC3i); + this.uniformBufferBuilder.putIVec3(x,y,z); + return this; + } + public BlazeUniformBufferWrapper putVec3f(float x, float y, float z) + { + this.putElement(EUniformElement.VEC3f); + this.uniformBufferBuilder.putVec3(x,y,z); + return this; + } + public BlazeUniformBufferWrapper putVec4f(float x, float y, float z, float w) + { + this.putElement(EUniformElement.VEC4f); + this.uniformBufferBuilder.putVec4(x,y,z,w); + return this; + } + public BlazeUniformBufferWrapper putMat4f(Mat4f matrix) + { + this.putElement(EUniformElement.MAT4f); + this.uniformBufferBuilder.putMat4f(matrix.createJomlMatrix()); + return this; + } + public BlazeUniformBufferWrapper putFloat(float f) + { + this.putElement(EUniformElement.FLOAT); + this.uniformBufferBuilder.putFloat(f); + return this; + } + public BlazeUniformBufferWrapper putInt(int i) + { + this.putElement(EUniformElement.INT); + this.uniformBufferBuilder.putInt(i); + return this; + } + private void putElement(EUniformElement elementTypeEnum) + { + this.uniformElementTypes.add(elementTypeEnum); + + boolean createNewBuilder = (this.elementCount == 0); + this.elementCount++; + if (this.elementCount > this.previousElementCount) { - this.cpuBuffer = ByteBuffer.allocateDirect(size); - this.cpuBuffer.order(ByteOrder.nativeOrder()); - - this.cpuBufferSize = size; + this.recreateCpuBuffer(); + createNewBuilder = true; } - return this.cpuBuffer; + if (createNewBuilder) + { + this.uniformBufferBuilder = Std140Builder.intoBuffer(this.cpuBuffer); + } + } + private void recreateCpuBuffer() + { + ByteBuffer oldBuffer = this.cpuBuffer; + + int size = calcBufferSize(this.uniformElementTypes); + this.cpuBuffer = MemoryUtil.memAlloc(size); + this.cpuBuffer.order(ByteOrder.nativeOrder()); + + if (oldBuffer != null) + { + oldBuffer.position(0); + this.cpuBuffer.put(oldBuffer); + MemoryUtil.memFree(oldBuffer); + } + + this.bufferSize = size; + this.previousElementCount = this.elementCount; + } + private static int calcBufferSize(ArrayList uniformElements) + { + Std140SizeCalculator calculator = new Std140SizeCalculator(); + + for (int i = 0; i < uniformElements.size(); i++) + { + EUniformElement element = uniformElements.get(i); + switch (element) + { + case VEC2f -> calculator.putVec2(); + case VEC3i -> calculator.putIVec3(); + case VEC3f -> calculator.putVec3(); + case VEC4f -> calculator.putVec4(); + case MAT4f -> calculator.putMat4f(); + case INT -> calculator.putInt(); + case FLOAT -> calculator.putFloat(); + + default -> throw new UnsupportedOperationException("No definition for element type ["+element.name()+"]"); + } + } + + return calculator.get(); } - @Override - public void upload() throws IllegalStateException + + + public void finishAndUpload() { - if (this.cpuBuffer == null) + // re-create the GPU buffer if needed + GpuBuffer oldGpuBuffer = this.gpuBuffer; + this.gpuBuffer = BlazeUniformUtil.createBuffer(this.name, this.bufferSize, this.gpuBuffer); + + boolean createNewBufferSlice = (this.bufferSlice == null || this.gpuBuffer != oldGpuBuffer); + if (createNewBufferSlice) { - throw new IllegalStateException("Upload called before buffer was created"); + this.bufferSlice = new GpuBufferSlice(this.gpuBuffer, 0, this.bufferSize); } - 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; - } + // upload to GPU + this.cpuBuffer.position(0); + COMMAND_ENCODER.writeToBuffer(this.bufferSlice, this.cpuBuffer); - - 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.cpuBuffer); - } - else - { - LOGGER.warn("Uploading to buffer ["+this.name+"] failed due to already being closed"); - } + // clear the element tracking for next time + this.elementCount = 0; + this.uniformElementTypes.clear(); + this.uniformBufferBuilder = null; } - private String getBufferName() { return this.name; } //endregion @@ -120,11 +209,35 @@ public class BlazeUniformBufferWrapper implements IUniformBufferWrapper { this.gpuBuffer.close(); } + + if (this.cpuBuffer != null) + { + MemoryUtil.memFree(this.cpuBuffer); + } } //endregion + //================// + // helper classes // + //================// + //region + + private enum EUniformElement + { + VEC2f, + VEC3f, + VEC3i, + VEC4f, + MAT4f, + INT, + FLOAT, + } + + //endregion + + } #endif \ No newline at end of file diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/glObject/GlDummyUniformData.java b/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/glObject/GlDummyUniformData.java index 43f0f35c8..68714fef5 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/glObject/GlDummyUniformData.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/glObject/GlDummyUniformData.java @@ -9,9 +9,7 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.render.objects.ILodCont */ public class GlDummyUniformData implements ILodContainerUniformBufferWrapper { - @Override public void createUniformData(LodBufferContainer bufferContainer) { } - @Override public void tryUpload() { } - @Override public void upload() { } + @Override public void tryUpload(LodBufferContainer bufferContainer) { } @Override public void close() { } } diff --git a/coreSubProjects b/coreSubProjects index 7239b5107..8cd926f4a 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 7239b510733e1bf57bb85d7f71bc5079476729e3 +Subproject commit 8cd926f4ac78225465505afdec8d3ba8f4dddf16