From 3f16d6774655dfe46b97c6c7e9c704328f2a2864 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Wed, 8 Apr 2026 07:39:36 -0500 Subject: [PATCH] fix blaze3d rendering --- .../blaze/BlazeDebugWireframeRenderer.java | 34 ++++---- .../blaze/BlazeDhGenericObjectRenderer.java | 45 +++++----- .../render/blaze/BlazeDhTerrainRenderer.java | 63 ++++++++------ .../blaze/apply/BlazeDhApplyRenderer.java | 73 ++++++++-------- .../blaze/apply/BlazeDhCopyRenderer.java | 46 +++++----- .../BlazeGenericObjectVertexContainer.java | 5 ++ .../BlazeDhFarFadeRenderer.java | 41 +++++---- .../postProcessing/BlazeDhFogRenderer.java | 38 ++++---- .../postProcessing/BlazeDhSsaoRenderer.java | 37 ++++---- .../BlazeVanillaFadeRenderer.java | 34 +++++--- .../test/BlazeDhTestTriangleRenderer.java | 2 +- .../blaze/util/BlazeDhVertexFormatUtil.java | 2 +- .../render/blaze/util/BlazeUniformUtil.java | 10 ++- .../RenderPipelineBuilderWrapper.java | 21 ++++- .../buffer/BlazeVertexBufferWrapper.java | 22 +++++ .../client/MixinChunkSectionsToRender.java | 50 +++++++++++ .../mixins/client/MixinLevelRenderer.java | 86 +++++++++++++++++-- .../mixins/client/MixinLevelRenderer.java | 72 ++++++++++++++++ 18 files changed, 479 insertions(+), 202 deletions(-) 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 e76d489e9..70334a045 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 @@ -38,6 +38,7 @@ 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.RenderPipelineBuilderWrapper; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.logging.DhLogger; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; @@ -138,26 +139,27 @@ public class BlazeDebugWireframeRenderer extends AbstractDebugWireframeRenderer } private void createPipelines() { - VertexFormat vertexFormat = VertexFormat.builder() - //.add("vPosition", BlazeDhVertexFormatUtil.FLOAT_XYZ_POS) - .build(); - - RenderPipeline.Builder pipelineBuilder = RenderPipeline.builder(); + RenderPipelineBuilderWrapper pipelineBuilder = new RenderPipelineBuilderWrapper(); { - pipelineBuilder.withCull(false); - //pipelineBuilder.withDepthWrite(true); - //pipelineBuilder.withDepthTestFunction(DepthTestFunction.LESS_DEPTH_TEST); - //pipelineBuilder.withColorWrite(true); - //pipelineBuilder.withoutBlend(); - pipelineBuilder.withPolygonMode(PolygonMode.WIREFRAME); - pipelineBuilder.withLocation(Identifier.parse("distanthorizons:debug_wireframe_renderer")); + pipelineBuilder.withFaceCulling(false); + pipelineBuilder.withDepthWrite(true); + pipelineBuilder.withDepthTest(RenderPipelineBuilderWrapper.EDhDepthTest.LESS); + pipelineBuilder.withColorWrite(true); + pipelineBuilder.withoutBlend(); + pipelineBuilder.withPolygonMode(RenderPipelineBuilderWrapper.EDhPolygonMode.WIREFRAME); + pipelineBuilder.withName("debug_wireframe_renderer"); - pipelineBuilder.withVertexShader(Identifier.fromNamespaceAndPath("distanthorizons", "debug/blaze/vert")); - pipelineBuilder.withFragmentShader(Identifier.fromNamespaceAndPath("distanthorizons", "debug/blaze/frag")); + pipelineBuilder.withVertexShader("debug/blaze/vert"); + pipelineBuilder.withFragmentShader("debug/blaze/frag"); - pipelineBuilder.withUniform("uniformBlock", UniformType.UNIFORM_BUFFER); + pipelineBuilder.withUniformBuffer("uniformBlock"); - pipelineBuilder.withVertexFormat(vertexFormat, VertexFormat.Mode.DEBUG_LINES); + + VertexFormat vertexFormat = VertexFormat.builder() + .add("vPosition", BlazeDhVertexFormatUtil.FLOAT_XYZ_POS) + .build(); + pipelineBuilder.withVertexFormat(vertexFormat); + pipelineBuilder.withVertexMode(RenderPipelineBuilderWrapper.EDhVertexMode.LINES); } this.pipeline = pipelineBuilder.build(); 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 abb61caac..238176f2e 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 @@ -48,6 +48,7 @@ import com.seibel.distanthorizons.api.objects.render.DhApiRenderableBox; import com.seibel.distanthorizons.api.objects.render.DhApiRenderableBoxGroupShading; import com.seibel.distanthorizons.common.render.blaze.objects.BlazeGenericObjectVertexContainer; import com.seibel.distanthorizons.common.render.blaze.util.BlazeDhVertexFormatUtil; +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.wrappers.misc.LightMapWrapper; @@ -107,8 +108,6 @@ public class BlazeDhGenericObjectRenderer implements IDhGenericRenderer // rendering setup private boolean init = false; - private VertexFormat vertexFormat; - private RenderPipeline pipeline; private GpuBuffer vertUniformBuffer; @@ -130,12 +129,6 @@ public class BlazeDhGenericObjectRenderer implements IDhGenericRenderer } this.init = true; - this.vertexFormat = VertexFormat.builder() - //.add("vPosition", BlazeDhVertexFormatUtil.FLOAT_XYZ_POS) - //.add("aColor", BlazeDhVertexFormatUtil.RGBA_UBYTE_COLOR) - //.add("aMaterial", BlazeDhVertexFormatUtil.IRIS_MATERIAL) - .build(); - this.createPipelines(); if (RENDER_DEBUG_OBJECTS) @@ -145,26 +138,36 @@ public class BlazeDhGenericObjectRenderer implements IDhGenericRenderer } private void createPipelines() { - RenderPipeline.Builder pipelineBuilder = RenderPipeline.builder(); + RenderPipelineBuilderWrapper pipelineBuilder = new RenderPipelineBuilderWrapper(); { - pipelineBuilder.withCull(true); - //pipelineBuilder.withDepthWrite(true); - //pipelineBuilder.withDepthTestFunction(DepthTestFunction.LESS_DEPTH_TEST); - //pipelineBuilder.withBlend(BlendFunction.TRANSLUCENT); - //pipelineBuilder.withColorWrite(true); - pipelineBuilder.withPolygonMode(PolygonMode.FILL); - pipelineBuilder.withLocation(Identifier.parse("distanthorizons:generic")); + pipelineBuilder.withFaceCulling(true); + pipelineBuilder.withDepthWrite(true); + pipelineBuilder.withDepthTest(RenderPipelineBuilderWrapper.EDhDepthTest.LESS); + pipelineBuilder.withBlend(BlendFunction.TRANSLUCENT); // TRANSLUCENT = new BlendFunction(SourceFactor.SRC_ALPHA, DestFactor.ONE_MINUS_SRC_ALPHA, SourceFactor.ONE, DestFactor.ONE_MINUS_SRC_ALPHA); + pipelineBuilder.withColorWrite(true); + pipelineBuilder.withPolygonMode(RenderPipelineBuilderWrapper.EDhPolygonMode.FILL); + pipelineBuilder.withName("generic_objects"); - pipelineBuilder.withVertexShader(Identifier.fromNamespaceAndPath("distanthorizons", "generic/blaze/vert")); - pipelineBuilder.withFragmentShader(Identifier.fromNamespaceAndPath("distanthorizons", "generic/blaze/frag")); + pipelineBuilder.withVertexShader("generic/blaze/vert"); + pipelineBuilder.withFragmentShader("generic/blaze/frag"); pipelineBuilder.withSampler("uLightMap"); - pipelineBuilder.withUniform("vertUniformBlock", UniformType.UNIFORM_BUFFER); + pipelineBuilder.withUniformBuffer("vertUniformBlock"); - pipelineBuilder.withVertexFormat(this.vertexFormat, VertexFormat.Mode.TRIANGLES); - this.pipeline = pipelineBuilder.build(); + VertexFormat vertexFormat = VertexFormat.builder() + .add("vPosition", BlazeDhVertexFormatUtil.FLOAT_XYZ_POS) + .add("aColor", BlazeDhVertexFormatUtil.RGBA_UBYTE_COLOR) + .add("aMaterial", BlazeDhVertexFormatUtil.IRIS_MATERIAL) + + .add("paddingOne", BlazeDhVertexFormatUtil.BYTE_PAD) + .add("paddingTwo", BlazeDhVertexFormatUtil.BYTE_PAD) + .add("paddingThree", BlazeDhVertexFormatUtil.BYTE_PAD) + .build(); + pipelineBuilder.withVertexFormat(vertexFormat); + pipelineBuilder.withVertexMode(RenderPipelineBuilderWrapper.EDhVertexMode.TRIANGLES); } + this.pipeline = pipelineBuilder.build(); } private void addGenericDebugObjects() { 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 72a3ea985..ba081ac71 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 @@ -21,6 +21,7 @@ import com.mojang.blaze3d.vertex.VertexFormat; import com.seibel.distanthorizons.api.methods.events.abstractEvents.DhApiBeforeBufferRenderEvent; 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.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; @@ -41,6 +42,7 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.render.renderPass.IDhTe 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; @@ -83,46 +85,48 @@ public class BlazeDhTerrainRenderer implements IDhTerrainRenderer - VertexFormat vertexFormat = VertexFormat.builder() - //.add("vPosition", BlazeDhVertexFormatUtil.SHORT_XYZ_POS) - //.add("meta", BlazeDhVertexFormatUtil.META) - //.add("vColor", BlazeDhVertexFormatUtil.RGBA_UBYTE_COLOR) - //.add("irisMaterial", BlazeDhVertexFormatUtil.IRIS_MATERIAL) - //.add("irisNormal", BlazeDhVertexFormatUtil.IRIS_NORMAL) - //.add("paddingTwo", BlazeDhVertexFormatUtil.BYTE_PAD) - //.add("paddingThree", BlazeDhVertexFormatUtil.BYTE_PAD) // padding is to make sure the format is a multiple of 4 - .build(); - - RenderPipeline.Builder pipelineBuilder = RenderPipeline.builder(); + RenderPipelineBuilderWrapper pipelineBuilder = new RenderPipelineBuilderWrapper(); { - pipelineBuilder.withCull(true); - //pipelineBuilder.withDepthWrite(true); - //pipelineBuilder.withDepthTestFunction(DepthTestFunction.LESS_DEPTH_TEST); - //pipelineBuilder.withColorWrite(true); - pipelineBuilder.withPolygonMode(PolygonMode.FILL); - pipelineBuilder.withLocation(Identifier.parse("distanthorizons:lod_render")); - - pipelineBuilder.withVertexShader(Identifier.fromNamespaceAndPath("distanthorizons", "lod/blaze/vert")); - pipelineBuilder.withFragmentShader(Identifier.fromNamespaceAndPath("distanthorizons", "lod/blaze/frag")); + pipelineBuilder.withFaceCulling(true); + pipelineBuilder.withDepthWrite(true); + pipelineBuilder.withDepthTest(RenderPipelineBuilderWrapper.EDhDepthTest.LESS); + pipelineBuilder.withColorWrite(true); + pipelineBuilder.withPolygonMode(RenderPipelineBuilderWrapper.EDhPolygonMode.FILL); + pipelineBuilder.withName("terrain"); pipelineBuilder.withSampler("uLightMap"); - pipelineBuilder.withUniform("vertUniqueUniformBlock", UniformType.UNIFORM_BUFFER); - pipelineBuilder.withUniform("vertSharedUniformBlock", UniformType.UNIFORM_BUFFER); - pipelineBuilder.withUniform("fragUniformBlock", UniformType.UNIFORM_BUFFER); + pipelineBuilder.withVertexShader("lod/blaze/vert"); + pipelineBuilder.withFragmentShader("lod/blaze/frag"); - pipelineBuilder.withVertexFormat(vertexFormat, VertexFormat.Mode.TRIANGLES); + pipelineBuilder.withUniformBuffer("vertUniqueUniformBlock"); + pipelineBuilder.withUniformBuffer("vertSharedUniformBlock"); + pipelineBuilder.withUniformBuffer("fragUniformBlock"); + + VertexFormat vertexFormat = VertexFormat.builder() + .add("vPosition", BlazeDhVertexFormatUtil.SHORT_XYZ_POS) + .add("meta", BlazeDhVertexFormatUtil.META) + .add("vColor", BlazeDhVertexFormatUtil.RGBA_UBYTE_COLOR) + .add("irisMaterial", BlazeDhVertexFormatUtil.IRIS_MATERIAL) + .add("irisNormal", BlazeDhVertexFormatUtil.IRIS_NORMAL) + .add("paddingTwo", BlazeDhVertexFormatUtil.BYTE_PAD) + .add("paddingThree", BlazeDhVertexFormatUtil.BYTE_PAD) // padding is to make sure the format is a multiple of 4 + .build(); + pipelineBuilder.withVertexFormat(vertexFormat); + + pipelineBuilder.withVertexMode(RenderPipelineBuilderWrapper.EDhVertexMode.TRIANGLES); } // opaque { - //pipelineBuilder.withoutBlend(); + pipelineBuilder.withoutBlend(); this.opaquePipeline = pipelineBuilder.build(); } // transparent { - //pipelineBuilder.withBlend(BlendFunction.TRANSLUCENT); + // TRANSLUCENT = new BlendFunction(SourceFactor.SRC_ALPHA, DestFactor.ONE_MINUS_SRC_ALPHA, SourceFactor.ONE, DestFactor.ONE_MINUS_SRC_ALPHA); + pipelineBuilder.withBlend(BlendFunction.TRANSLUCENT); this.transparentPipeline = pipelineBuilder.build(); } @@ -189,7 +193,7 @@ public class BlazeDhTerrainRenderer implements IDhTerrainRenderer .putMat4f() // uCombinedMatrix .get(); - ByteBuffer buffer = ByteBuffer.allocateDirect(uniformBufferSize); + ByteBuffer buffer = MemoryUtil.memAlloc(uniformBufferSize); buffer.order(ByteOrder.nativeOrder()); Std140Builder.intoBuffer(buffer) .putInt(0) // uIsWhiteWorld @@ -209,6 +213,8 @@ public class BlazeDhTerrainRenderer implements IDhTerrainRenderer GpuBufferSlice bufferSlice = new GpuBufferSlice(this.vertSharedUniformBuffer, 0, uniformBufferSize); COMMAND_ENCODER.writeToBuffer(bufferSlice, buffer); + + MemoryUtil.memFree(buffer); } profiler.popPush("set frag uniforms"); @@ -235,7 +241,7 @@ public class BlazeDhTerrainRenderer implements IDhTerrainRenderer // upload data // - ByteBuffer buffer = ByteBuffer.allocateDirect(uniformBufferSize); + ByteBuffer buffer = MemoryUtil.memAlloc(uniformBufferSize); buffer.order(ByteOrder.nativeOrder()); buffer = Std140Builder.intoBuffer(buffer) .putFloat(dhNearClipDistance) // uClipDistance @@ -251,6 +257,7 @@ public class BlazeDhTerrainRenderer implements IDhTerrainRenderer GpuBufferSlice bufferSlice = new GpuBufferSlice(this.fragUniformBuffer, 0, uniformBufferSize); COMMAND_ENCODER.writeToBuffer(bufferSlice, buffer); + MemoryUtil.memFree(buffer); } 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 a26aea2cc..239cb2ac7 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 @@ -27,8 +27,6 @@ public class BlazeDhApplyRenderer {} import com.mojang.blaze3d.buffers.GpuBuffer; 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; @@ -36,12 +34,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.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.core.logging.DhLogger; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.coreapi.ModInfo; -import net.minecraft.resources.Identifier; import org.jetbrains.annotations.Nullable; import java.util.Arrays; @@ -80,6 +79,10 @@ public class BlazeDhApplyRenderer private final BlazeTextureViewWrapper sourceDepthTextureViewWrapper = new BlazeTextureViewWrapper(); private final BlazeTextureViewWrapper destinationColorTextureViewWrapper = new BlazeTextureViewWrapper(); + /** We don't want to actually write any depth data, but blaze3D complains if we don't bind a depth texture. */ + private final BlazeTextureWrapper dummyDepthTextureWrapper = BlazeTextureWrapper.createDepth("apply_dummy_depth"); + + /** * Can be set for special application shaders that need @@ -133,8 +136,12 @@ public class BlazeDhApplyRenderer GpuTexture sourceDepthTexture, GpuTexture destinationColorTexture) { - this.createPipeline(); - this.vboGpuBuffer = BlazePostProcessUtil.createAndUploadScreenVertexData(this.name); + // one-time setup + if (this.pipeline == null) + { + this.createPipeline(); + this.vboGpuBuffer = BlazePostProcessUtil.createAndUploadScreenVertexData(this.name); + } this.sourceColorTextureViewWrapper.tryWrap(sourceColorTexture); this.sourceDepthTextureViewWrapper.tryWrap(sourceDepthTexture); @@ -144,48 +151,42 @@ public class BlazeDhApplyRenderer } private void createPipeline() { - if (this.pipeline != null) + RenderPipelineBuilderWrapper pipelineBuilder = new RenderPipelineBuilderWrapper(); { - return; - } - - VertexFormat vertexFormat = VertexFormat.builder() - //.add("vPosition", BlazeDhVertexFormatUtil.SCREEN_POS) - .build(); - - RenderPipeline.Builder pipelineBuilder = RenderPipeline.builder(); - { - pipelineBuilder.withCull(false); - //pipelineBuilder.withDepthWrite(false); - //pipelineBuilder.withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST); - //pipelineBuilder.withColorWrite(true); + pipelineBuilder.withFaceCulling(false); + pipelineBuilder.withDepthWrite(false); + pipelineBuilder.withDepthTest(RenderPipelineBuilderWrapper.EDhDepthTest.NONE); + pipelineBuilder.withColorWrite(true); - //if (this.blendFunction != null) - //{ - // pipelineBuilder.withBlend(this.blendFunction); - //} - //else - //{ - // pipelineBuilder.withoutBlend(); - //} + if (this.blendFunction != null) + { + pipelineBuilder.withBlend(this.blendFunction); + } + else + { + pipelineBuilder.withoutBlend(); + } - pipelineBuilder.withPolygonMode(PolygonMode.FILL); - pipelineBuilder.withLocation(Identifier.parse(this.identifierName)); // TODO will complain if capital letters are included + pipelineBuilder.withPolygonMode(RenderPipelineBuilderWrapper.EDhPolygonMode.FILL); + pipelineBuilder.withName(this.name); - // TODO manually validate paths to confirm they exist and end with ".fsh" or ".vsh", MC silently fails if the files are missing/improperly named - pipelineBuilder.withVertexShader(Identifier.fromNamespaceAndPath("distanthorizons", this.vertexShaderPath)); - pipelineBuilder.withFragmentShader(Identifier.fromNamespaceAndPath("distanthorizons", this.fragmentShaderPath)); + pipelineBuilder.withVertexShader(this.vertexShaderPath); + pipelineBuilder.withFragmentShader(this.fragmentShaderPath); for (int i = 0; i < this.uniformNames.length; i++) { String uniformName = this.uniformNames[i]; - pipelineBuilder.withUniform(uniformName, UniformType.UNIFORM_BUFFER); + pipelineBuilder.withUniformBuffer(uniformName); } pipelineBuilder.withSampler("uSourceColorTexture"); pipelineBuilder.withSampler("uSourceDepthTexture"); - pipelineBuilder.withVertexFormat(vertexFormat, VertexFormat.Mode.TRIANGLE_FAN); + VertexFormat vertexFormat = VertexFormat.builder() + .add("vPosition", BlazeDhVertexFormatUtil.SCREEN_POS) + .build(); + pipelineBuilder.withVertexFormat(vertexFormat); + pipelineBuilder.withVertexMode(RenderPipelineBuilderWrapper.EDhVertexMode.TRIANGLE_FAN); } this.pipeline = pipelineBuilder.build(); } @@ -222,11 +223,13 @@ public class BlazeDhApplyRenderer { this.tryInit(sourceColorTexture, sourceDepthTexture, destinationColorTexture); + this.dummyDepthTextureWrapper.tryCreateOrResize(); + try (RenderPass renderPass = COMMAND_ENCODER.createRenderPass( this::getIdentifierName, this.destinationColorTextureViewWrapper.textureView, /*optionalClearColorAsInt*/ OptionalInt.empty(), - /*depthTexture*/ null, + this.dummyDepthTextureWrapper.textureView, /*optionalDepthValueAsDouble*/ OptionalDouble.empty())) { renderPass.bindTexture("uSourceColorTexture", this.sourceColorTextureViewWrapper.textureView, this.sourceColorTextureViewWrapper.textureSampler); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/apply/BlazeDhCopyRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/apply/BlazeDhCopyRenderer.java index f6df0734b..5f9469902 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/apply/BlazeDhCopyRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/apply/BlazeDhCopyRenderer.java @@ -26,19 +26,17 @@ public class BlazeDhCopyRenderer {} import com.mojang.blaze3d.buffers.GpuBuffer; import com.mojang.blaze3d.pipeline.RenderPipeline; -import com.mojang.blaze3d.platform.PolygonMode; 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.textures.*; -import com.mojang.blaze3d.vertex.VertexFormat; +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.util.BlazePostProcessUtil; import com.seibel.distanthorizons.core.logging.DhLogger; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; -import net.minecraft.resources.Identifier; import java.util.OptionalDouble; import java.util.OptionalInt; @@ -62,6 +60,8 @@ public class BlazeDhCopyRenderer private GpuBuffer vboGpuBuffer; + private BlazeTextureWrapper dummyDepthTextureWrapper; + //=============// @@ -80,23 +80,25 @@ public class BlazeDhCopyRenderer this.init = true; + this.dummyDepthTextureWrapper = BlazeTextureWrapper.createDepth("dh_copy_depth_texture"); - RenderPipeline.Builder pipelineBuilder = RenderPipeline.builder(); + RenderPipelineBuilderWrapper pipelineBuilder = new RenderPipelineBuilderWrapper(); { - pipelineBuilder.withCull(false); - //pipelineBuilder.withDepthWrite(false); - //pipelineBuilder.withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST); - //pipelineBuilder.withColorWrite(true); - //pipelineBuilder.withoutBlend(); - pipelineBuilder.withPolygonMode(PolygonMode.FILL); - pipelineBuilder.withLocation(Identifier.parse("distanthorizons:copy_render")); + pipelineBuilder.withFaceCulling(false); + pipelineBuilder.withDepthWrite(false); + pipelineBuilder.withDepthTest(RenderPipelineBuilderWrapper.EDhDepthTest.NONE); + pipelineBuilder.withColorWrite(true); + pipelineBuilder.withoutBlend(); + pipelineBuilder.withPolygonMode(RenderPipelineBuilderWrapper.EDhPolygonMode.FILL); + pipelineBuilder.withName("copy"); - pipelineBuilder.withVertexShader(Identifier.fromNamespaceAndPath("distanthorizons", "copy/blaze/vert")); - pipelineBuilder.withFragmentShader(Identifier.fromNamespaceAndPath("distanthorizons", "copy/blaze/frag")); + pipelineBuilder.withVertexShader("copy/blaze/vert"); + pipelineBuilder.withFragmentShader("copy/blaze/frag"); pipelineBuilder.withSampler("uCopyTexture"); - pipelineBuilder.withVertexFormat(BlazePostProcessUtil.createVertexFormat(), VertexFormat.Mode.TRIANGLE_FAN); + pipelineBuilder.withVertexFormat(BlazePostProcessUtil.createVertexFormat()); + pipelineBuilder.withVertexMode(RenderPipelineBuilderWrapper.EDhVertexMode.TRIANGLE_FAN); } this.pipeline = pipelineBuilder.build(); @@ -118,17 +120,17 @@ public class BlazeDhCopyRenderer BlazeTextureWrapper sourceColorTextureWrapper, BlazeTextureViewWrapper destinationColorTextureWrapper) { - //this.render( - // sourceColorTextureWrapper.textureView, sourceColorTextureWrapper.textureSampler, - // destinationColorTextureWrapper.textureView); + this.render( + sourceColorTextureWrapper.textureView, sourceColorTextureWrapper.textureSampler, + destinationColorTextureWrapper.textureView); } public void render( BlazeTextureWrapper sourceColorTextureWrapper, BlazeTextureWrapper destinationColorTextureWrapper) { - //this.render( - // sourceColorTextureWrapper.textureView, sourceColorTextureWrapper.textureSampler, - // destinationColorTextureWrapper.textureView); + this.render( + sourceColorTextureWrapper.textureView, sourceColorTextureWrapper.textureSampler, + destinationColorTextureWrapper.textureView); } private void render( @@ -138,11 +140,13 @@ public class BlazeDhCopyRenderer { this.tryInit(); + this.dummyDepthTextureWrapper.tryCreateOrResize(); + try (RenderPass renderPass = COMMAND_ENCODER.createRenderPass( this::getRenderPassName, destinationTextureView, /*optionalClearColorAsInt*/ OptionalInt.empty(), - /*depthTexture*/ null, + this.dummyDepthTextureWrapper.textureView, /*optionalDepthValueAsDouble*/ OptionalDouble.empty())) { renderPass.bindTexture("uCopyTexture", sourceTextureView, sourceTextureSampler); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/objects/BlazeGenericObjectVertexContainer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/objects/BlazeGenericObjectVertexContainer.java index 58954ced6..c90414f6e 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/objects/BlazeGenericObjectVertexContainer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/objects/BlazeGenericObjectVertexContainer.java @@ -179,6 +179,11 @@ public class BlazeGenericObjectVertexContainer implements IDhGenericObjectVertex this.vertexBuffer.put(a); this.vertexBuffer.put(box.material); + + // padding so the vertex format's byte count is a multiple of 4 + this.vertexBuffer.put((byte)0); + this.vertexBuffer.put((byte)0); + this.vertexBuffer.put((byte)0); } } this.vertexBuffer.flip(); 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 6faa8a1fe..5839e9800 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 @@ -29,17 +29,15 @@ 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.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.core.logging.DhLogger; @@ -49,7 +47,6 @@ import com.seibel.distanthorizons.core.util.RenderUtil; import com.seibel.distanthorizons.core.util.math.Mat4f; import com.seibel.distanthorizons.core.wrapperInterfaces.render.renderPass.IDhFarFadeRenderer; import net.minecraft.client.Minecraft; -import net.minecraft.resources.Identifier; import java.nio.ByteBuffer; import java.nio.ByteOrder; @@ -75,8 +72,11 @@ public class BlazeDhFarFadeRenderer implements IDhFarFadeRenderer private GpuBuffer vboGpuBuffer; - public final BlazeTextureWrapper dhFadeColorTextureWrapper = BlazeTextureWrapper.createColor("DhFadeColorTexture"); - public final BlazeTextureViewWrapper mcColorTextureViewWrapper = new BlazeTextureViewWrapper(); + private final BlazeTextureWrapper dhFadeColorTextureWrapper = BlazeTextureWrapper.createColor("dh_far_fade_color_texture"); + /** We don't want to actually write any depth data, but blaze3D complains if we don't bind a depth texture. */ + private final BlazeTextureWrapper dhFadeDepthTextureWrapper = BlazeTextureWrapper.createDepth("dh_far_fade_depth_texture"); + + private final BlazeTextureViewWrapper mcColorTextureViewWrapper = new BlazeTextureViewWrapper(); @@ -97,27 +97,28 @@ public class BlazeDhFarFadeRenderer implements IDhFarFadeRenderer - RenderPipeline.Builder pipelineBuilder = RenderPipeline.builder(); + RenderPipelineBuilderWrapper pipelineBuilder = new RenderPipelineBuilderWrapper(); { - pipelineBuilder.withCull(false); - //pipelineBuilder.withDepthWrite(false); - //pipelineBuilder.withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST); - //pipelineBuilder.withColorWrite(true); - //pipelineBuilder.withoutBlend(); - pipelineBuilder.withPolygonMode(PolygonMode.FILL); - pipelineBuilder.withLocation(Identifier.parse("distanthorizons:far_fade")); + pipelineBuilder.withFaceCulling(false); + pipelineBuilder.withDepthWrite(false); + pipelineBuilder.withDepthTest(RenderPipelineBuilderWrapper.EDhDepthTest.NONE); + pipelineBuilder.withColorWrite(true); + pipelineBuilder.withoutBlend(); + pipelineBuilder.withPolygonMode(RenderPipelineBuilderWrapper.EDhPolygonMode.FILL); + pipelineBuilder.withName("far_fade"); - pipelineBuilder.withVertexShader(Identifier.fromNamespaceAndPath("distanthorizons", "fade/blaze/vert")); - pipelineBuilder.withFragmentShader(Identifier.fromNamespaceAndPath("distanthorizons", "fade/blaze/dh_fade")); + pipelineBuilder.withVertexShader("fade/blaze/vert"); + pipelineBuilder.withFragmentShader("fade/blaze/dh_fade"); pipelineBuilder.withSampler("uMcColorTexture"); pipelineBuilder.withSampler("uDhDepthTexture"); pipelineBuilder.withSampler("uDhColorTexture"); - pipelineBuilder.withUniform("fragUniformBlock", UniformType.UNIFORM_BUFFER); + pipelineBuilder.withUniformBuffer("fragUniformBlock"); - pipelineBuilder.withVertexFormat(BlazePostProcessUtil.createVertexFormat(), VertexFormat.Mode.TRIANGLE_FAN); + pipelineBuilder.withVertexFormat(BlazePostProcessUtil.createVertexFormat()); + pipelineBuilder.withVertexMode(RenderPipelineBuilderWrapper.EDhVertexMode.TRIANGLE_FAN); } this.pipeline = pipelineBuilder.build(); @@ -152,6 +153,8 @@ public class BlazeDhFarFadeRenderer implements IDhFarFadeRenderer this.dhFadeColorTextureWrapper.tryCreateOrResize(); this.mcColorTextureViewWrapper.tryWrap(Minecraft.getInstance().getMainRenderTarget().getColorTexture()); + this.dhFadeDepthTextureWrapper.tryCreateOrResize(); + { int uniformBufferSize = new Std140SizeCalculator() .putFloat() // uStartFadeBlockDistance @@ -205,7 +208,7 @@ public class BlazeDhFarFadeRenderer implements IDhFarFadeRenderer this::getRenderPassName, this.dhFadeColorTextureWrapper.textureView, /*optionalClearColorAsInt*/ OptionalInt.empty(), - /*depthTexture*/ null, + this.dhFadeDepthTextureWrapper.textureView, /*optionalDepthValueAsDouble*/ OptionalDouble.empty())) { // MC texture 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 1157a2801..a91025ae2 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 @@ -31,19 +31,17 @@ import com.mojang.blaze3d.buffers.Std140SizeCalculator; import com.mojang.blaze3d.pipeline.BlendFunction; import com.mojang.blaze3d.pipeline.RenderPipeline; import com.mojang.blaze3d.platform.DestFactor; -import com.mojang.blaze3d.platform.PolygonMode; import com.mojang.blaze3d.platform.SourceFactor; -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.EDhApiFogColorMode; import com.seibel.distanthorizons.api.enums.rendering.EDhApiHeightFogDirection; import com.seibel.distanthorizons.api.enums.rendering.EDhApiHeightFogMixMode; import com.seibel.distanthorizons.common.render.blaze.BlazeDhMetaRenderer; import com.seibel.distanthorizons.common.render.blaze.apply.BlazeDhApplyRenderer; +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; @@ -57,7 +55,6 @@ import com.seibel.distanthorizons.core.util.math.Mat4f; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.render.renderPass.IDhFogRenderer; -import net.minecraft.resources.Identifier; import java.awt.*; import java.nio.ByteBuffer; @@ -90,7 +87,9 @@ public class BlazeDhFogRenderer implements IDhFogRenderer private GpuBuffer vboGpuBuffer; - public BlazeTextureWrapper fogColorTextureWrapper = BlazeTextureWrapper.createColor("DhFogColorTexture"); + private final BlazeTextureWrapper fogColorTextureWrapper = BlazeTextureWrapper.createColor("dh_fog_color_texture"); + /** We don't want to actually write any depth data, but blaze3D complains if we don't bind a depth texture. */ + private final BlazeTextureWrapper fogDepthTextureWrapper = BlazeTextureWrapper.createDepth("dh_fog_depth_texture"); @@ -118,24 +117,25 @@ public class BlazeDhFogRenderer implements IDhFogRenderer "apply/blaze/vert", "apply/blaze/frag" ); - RenderPipeline.Builder pipelineBuilder = RenderPipeline.builder(); + RenderPipelineBuilderWrapper pipelineBuilder = new RenderPipelineBuilderWrapper(); { - pipelineBuilder.withCull(false); - //pipelineBuilder.withDepthWrite(false); - //pipelineBuilder.withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST); - //pipelineBuilder.withColorWrite(true); - //pipelineBuilder.withoutBlend(); - pipelineBuilder.withPolygonMode(PolygonMode.FILL); - pipelineBuilder.withLocation(Identifier.parse("distanthorizons:fog_render")); + pipelineBuilder.withFaceCulling(false); + pipelineBuilder.withDepthWrite(false); + pipelineBuilder.withDepthTest(RenderPipelineBuilderWrapper.EDhDepthTest.NONE); + pipelineBuilder.withColorWrite(true); + pipelineBuilder.withoutBlend(); + pipelineBuilder.withPolygonMode(RenderPipelineBuilderWrapper.EDhPolygonMode.FILL); + pipelineBuilder.withName("fog_render"); - pipelineBuilder.withVertexShader(Identifier.fromNamespaceAndPath("distanthorizons", "fog/blaze/vert")); - pipelineBuilder.withFragmentShader(Identifier.fromNamespaceAndPath("distanthorizons", "fog/blaze/frag")); + pipelineBuilder.withVertexShader("fog/blaze/vert"); + pipelineBuilder.withFragmentShader("fog/blaze/frag"); pipelineBuilder.withSampler("uDhDepthTexture"); - pipelineBuilder.withUniform("fragUniformBlock", UniformType.UNIFORM_BUFFER); + pipelineBuilder.withUniformBuffer("fragUniformBlock"); - pipelineBuilder.withVertexFormat(BlazePostProcessUtil.createVertexFormat(), VertexFormat.Mode.TRIANGLE_FAN); + pipelineBuilder.withVertexFormat(BlazePostProcessUtil.createVertexFormat()); + pipelineBuilder.withVertexMode(RenderPipelineBuilderWrapper.EDhVertexMode.TRIANGLE_FAN); } this.pipeline = pipelineBuilder.build(); @@ -167,7 +167,7 @@ public class BlazeDhFogRenderer implements IDhFogRenderer this.fogColorTextureWrapper.tryCreateOrResize(); - + this.fogDepthTextureWrapper.tryCreateOrResize(); { int uniformBufferSize = new Std140SizeCalculator() @@ -338,7 +338,7 @@ public class BlazeDhFogRenderer implements IDhFogRenderer this::getRenderPassName, this.fogColorTextureWrapper.textureView, /*optionalClearColorAsInt*/ OptionalInt.empty(), - /*depthTexture*/ null, + this.fogDepthTextureWrapper.textureView, /*optionalDepthValueAsDouble*/ OptionalDouble.empty())) { renderPass.bindTexture("uDhDepthTexture", BlazeDhMetaRenderer.INSTANCE.dhDepthTextureWrapper.textureView, BlazeDhMetaRenderer.INSTANCE.dhDepthTextureWrapper.textureSampler); 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 5ad2286e0..b7b80ee0d 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 @@ -31,16 +31,14 @@ import com.mojang.blaze3d.buffers.Std140SizeCalculator; import com.mojang.blaze3d.pipeline.BlendFunction; import com.mojang.blaze3d.pipeline.RenderPipeline; import com.mojang.blaze3d.platform.DestFactor; -import com.mojang.blaze3d.platform.PolygonMode; import com.mojang.blaze3d.platform.SourceFactor; -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.BlazeDhApplyRenderer; +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; @@ -52,7 +50,6 @@ import com.seibel.distanthorizons.core.util.RenderUtil; import com.seibel.distanthorizons.core.util.math.Mat4f; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.render.renderPass.IDhSsaoRenderer; -import net.minecraft.resources.Identifier; import java.nio.ByteBuffer; import java.nio.ByteOrder; @@ -82,7 +79,9 @@ public class BlazeDhSsaoRenderer implements IDhSsaoRenderer private GpuBuffer vboGpuBuffer; - public BlazeTextureWrapper ssaoColorTextureWrapper = BlazeTextureWrapper.createColor("DhSsaoTexture"); + private final BlazeTextureWrapper ssaoColorTextureWrapper = BlazeTextureWrapper.createColor("dh_ssao_color_texture"); + /** We don't want to actually write any depth data, but blaze3D complains if we don't bind a depth texture. */ + private final BlazeTextureWrapper ssaoDepthTextureWrapper = BlazeTextureWrapper.createDepth("dh_ssao_depth_texture"); @@ -109,24 +108,25 @@ public class BlazeDhSsaoRenderer implements IDhSsaoRenderer /*uniforms*/ new String[] { "applyFragUniformBlock" } ); - RenderPipeline.Builder pipelineBuilder = RenderPipeline.builder(); + RenderPipelineBuilderWrapper pipelineBuilder = new RenderPipelineBuilderWrapper(); { - pipelineBuilder.withCull(false); - //pipelineBuilder.withDepthWrite(false); - //pipelineBuilder.withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST); - //pipelineBuilder.withColorWrite(true); - //pipelineBuilder.withoutBlend(); - pipelineBuilder.withPolygonMode(PolygonMode.FILL); - pipelineBuilder.withLocation(Identifier.parse("distanthorizons:ssao_render")); + pipelineBuilder.withFaceCulling(false); + pipelineBuilder.withDepthWrite(false); + pipelineBuilder.withDepthTest(RenderPipelineBuilderWrapper.EDhDepthTest.NONE); + pipelineBuilder.withColorWrite(true); + pipelineBuilder.withoutBlend(); + pipelineBuilder.withPolygonMode(RenderPipelineBuilderWrapper.EDhPolygonMode.FILL); + pipelineBuilder.withName("ssao_render"); - pipelineBuilder.withVertexShader(Identifier.fromNamespaceAndPath("distanthorizons", "ssao/blaze/vert")); - pipelineBuilder.withFragmentShader(Identifier.fromNamespaceAndPath("distanthorizons", "ssao/blaze/frag")); + pipelineBuilder.withVertexShader("ssao/blaze/vert"); + pipelineBuilder.withFragmentShader("ssao/blaze/frag"); pipelineBuilder.withSampler("uDhDepthTexture"); - pipelineBuilder.withUniform("fragUniformBlock", UniformType.UNIFORM_BUFFER); + pipelineBuilder.withUniformBuffer("fragUniformBlock"); - pipelineBuilder.withVertexFormat(BlazePostProcessUtil.createVertexFormat(), VertexFormat.Mode.TRIANGLE_FAN); + pipelineBuilder.withVertexFormat(BlazePostProcessUtil.createVertexFormat()); + pipelineBuilder.withVertexMode(RenderPipelineBuilderWrapper.EDhVertexMode.TRIANGLE_FAN); } this.pipeline = pipelineBuilder.build(); @@ -159,6 +159,7 @@ public class BlazeDhSsaoRenderer implements IDhSsaoRenderer // textures this.ssaoColorTextureWrapper.tryCreateOrResize(); + this.ssaoDepthTextureWrapper.tryCreateOrResize(); // frag uniforms { @@ -258,7 +259,7 @@ public class BlazeDhSsaoRenderer implements IDhSsaoRenderer this::getRenderPassName, this.ssaoColorTextureWrapper.textureView, /*optionalClearColorAsInt*/ OptionalInt.empty(), - /*depthTexture*/ null, + this.ssaoDepthTextureWrapper.textureView, /*optionalDepthValueAsDouble*/ OptionalDouble.empty())) { renderPass.bindTexture("uDhDepthTexture", BlazeDhMetaRenderer.INSTANCE.dhDepthTextureWrapper.textureView, BlazeDhMetaRenderer.INSTANCE.dhDepthTextureWrapper.textureSampler); 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 e5dfd13d3..73b3d4aa7 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 @@ -40,6 +40,7 @@ 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.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.core.config.Config; @@ -81,7 +82,10 @@ public class BlazeVanillaFadeRenderer implements IDhVanillaFadeRenderer private GpuBuffer vboGpuBuffer; - public final BlazeTextureWrapper fadeColorTextureWrapper = BlazeTextureWrapper.createColor("DhVanillaFadeTexture"); + public final BlazeTextureWrapper fadeColorTextureWrapper = BlazeTextureWrapper.createColor("DhVanillaFadeColorTexture"); + /** We don't want to actually write any depth data, but blaze3D complains if we don't bind a depth texture. */ + private final BlazeTextureWrapper fadeDepthTextureWrapper = BlazeTextureWrapper.createDepth("DhVanillaFadeDepthTexture"); + public final BlazeTextureViewWrapper mcDepthTextureWrapper = new BlazeTextureViewWrapper(); public final BlazeTextureViewWrapper mcColorTextureWrapper = new BlazeTextureViewWrapper(); @@ -105,18 +109,18 @@ public class BlazeVanillaFadeRenderer implements IDhVanillaFadeRenderer - RenderPipeline.Builder pipelineBuilder = RenderPipeline.builder(); + RenderPipelineBuilderWrapper pipelineBuilder = new RenderPipelineBuilderWrapper(); { - pipelineBuilder.withCull(false); - //pipelineBuilder.withDepthWrite(false); - //pipelineBuilder.withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST); - //pipelineBuilder.withColorWrite(true); - //pipelineBuilder.withoutBlend(); - pipelineBuilder.withPolygonMode(PolygonMode.FILL); - pipelineBuilder.withLocation(Identifier.parse("distanthorizons:mc_vanilla_fade_render")); + pipelineBuilder.withFaceCulling(false); + pipelineBuilder.withDepthWrite(false); + pipelineBuilder.withDepthTest(RenderPipelineBuilderWrapper.EDhDepthTest.NONE); + pipelineBuilder.withColorWrite(true); + pipelineBuilder.withoutBlend(); + pipelineBuilder.withPolygonMode(RenderPipelineBuilderWrapper.EDhPolygonMode.FILL); + pipelineBuilder.withName("vanilla_fade"); - pipelineBuilder.withVertexShader(Identifier.fromNamespaceAndPath("distanthorizons", "fade/blaze/vert")); - pipelineBuilder.withFragmentShader(Identifier.fromNamespaceAndPath("distanthorizons", "fade/blaze/vanilla_fade")); + pipelineBuilder.withVertexShader("fade/blaze/vert"); + pipelineBuilder.withFragmentShader("fade/blaze/vanilla_fade"); pipelineBuilder.withSampler("uMcDepthTexture"); pipelineBuilder.withSampler("uCombinedMcDhColorTexture"); @@ -124,9 +128,10 @@ public class BlazeVanillaFadeRenderer implements IDhVanillaFadeRenderer pipelineBuilder.withSampler("uDhDepthTexture"); pipelineBuilder.withSampler("uDhColorTexture"); - pipelineBuilder.withUniform("fragUniformBlock", UniformType.UNIFORM_BUFFER); + pipelineBuilder.withUniformBuffer("fragUniformBlock"); - pipelineBuilder.withVertexFormat(BlazePostProcessUtil.createVertexFormat(), VertexFormat.Mode.TRIANGLE_FAN); + pipelineBuilder.withVertexFormat(BlazePostProcessUtil.createVertexFormat()); + pipelineBuilder.withVertexMode(RenderPipelineBuilderWrapper.EDhVertexMode.TRIANGLE_FAN); } this.pipeline = pipelineBuilder.build(); @@ -157,6 +162,7 @@ public class BlazeVanillaFadeRenderer implements IDhVanillaFadeRenderer // textures this.fadeColorTextureWrapper.tryCreateOrResize(); + this.fadeDepthTextureWrapper.tryCreateOrResize(); this.mcDepthTextureWrapper.tryWrap(Minecraft.getInstance().getMainRenderTarget().getDepthTexture()); this.mcColorTextureWrapper.tryWrap(Minecraft.getInstance().getMainRenderTarget().getColorTexture()); @@ -234,7 +240,7 @@ public class BlazeVanillaFadeRenderer implements IDhVanillaFadeRenderer this::getRenderPassName, this.fadeColorTextureWrapper.textureView, /*optionalClearColorAsInt*/ OptionalInt.empty(), - /*depthTexture*/ null, + this.fadeDepthTextureWrapper.textureView, /*optionalDepthValueAsDouble*/ OptionalDouble.empty())) { renderPass.bindTexture("uMcDepthTexture", this.mcDepthTextureWrapper.textureView, this.mcDepthTextureWrapper.textureSampler); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/test/BlazeDhTestTriangleRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/test/BlazeDhTestTriangleRenderer.java index 0c22c1132..4d86c4def 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/test/BlazeDhTestTriangleRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/test/BlazeDhTestTriangleRenderer.java @@ -101,7 +101,7 @@ public class BlazeDhTestTriangleRenderer implements IDhTestTriangleRenderer pipelineBuilder.withDepthTest(RenderPipelineBuilderWrapper.EDhDepthTest.NONE); pipelineBuilder.withColorWrite(true); pipelineBuilder.withoutBlend(); - pipelineBuilder.withName("triangle_test_render"); + pipelineBuilder.withName("triangle_test"); pipelineBuilder.withVertexShader("test/blaze/vert"); pipelineBuilder.withFragmentShader("test/blaze/frag"); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/util/BlazeDhVertexFormatUtil.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/util/BlazeDhVertexFormatUtil.java index 8e8aa5302..d36a5305d 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/util/BlazeDhVertexFormatUtil.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/util/BlazeDhVertexFormatUtil.java @@ -78,7 +78,7 @@ public class BlazeDhVertexFormatUtil BYTE_PAD = VertexFormatElement.register(/*id*/25, /*index*/0, VertexFormatElement.Type.BYTE, false, /*count*/ 1); META = VertexFormatElement.register(/*id*/26, /*index*/0, VertexFormatElement.Type.USHORT, false, /*count*/ 1); - RGBA_UBYTE_COLOR = VertexFormatElement.register(/*id*/27, /*index*/0, VertexFormatElement.Type.UBYTE, false, /*count*/ 4); + RGBA_UBYTE_COLOR = VertexFormatElement.register(/*id*/27, /*index*/0, VertexFormatElement.Type.UBYTE, true, /*count*/ 4); IRIS_MATERIAL = VertexFormatElement.register(/*id*/28, /*index*/0, VertexFormatElement.Type.BYTE, false, /*count*/ 1); IRIS_NORMAL = VertexFormatElement.register(/*id*/29, /*index*/0, VertexFormatElement.Type.BYTE, false, /*count*/ 1); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/util/BlazeUniformUtil.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/util/BlazeUniformUtil.java index 6b40aaa11..8968ab014 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/util/BlazeUniformUtil.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/util/BlazeUniformUtil.java @@ -9,9 +9,13 @@ import com.mojang.blaze3d.buffers.GpuBuffer; import com.mojang.blaze3d.systems.CommandEncoder; import com.mojang.blaze3d.systems.GpuDevice; import com.mojang.blaze3d.systems.RenderSystem; +import com.seibel.distanthorizons.core.logging.DhLogger; +import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; public class BlazeUniformUtil { + private static final DhLogger LOGGER = new DhLoggerBuilder().build(); + private static final GpuDevice GPU_DEVICE = RenderSystem.getDevice(); private static final CommandEncoder COMMAND_ENCODER = GPU_DEVICE.createCommandEncoder(); @@ -22,7 +26,11 @@ public class BlazeUniformUtil if (vboGpuBuffer == null || vboGpuBuffer.size() < size) { - // GpuBuffer.USAGE_UNIFORM = 128 + if (vboGpuBuffer != null) + { + vboGpuBuffer.close(); + } + int usage = GpuBuffer.USAGE_COPY_DST | GpuBuffer.USAGE_VERTEX | GpuBuffer.USAGE_UNIFORM; diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/RenderPipelineBuilderWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/RenderPipelineBuilderWrapper.java index c4ae29d71..af57a9aba 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/RenderPipelineBuilderWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/RenderPipelineBuilderWrapper.java @@ -6,6 +6,7 @@ import com.mojang.blaze3d.pipeline.DepthStencilState; import com.mojang.blaze3d.pipeline.RenderPipeline; import com.mojang.blaze3d.platform.CompareOp; import com.mojang.blaze3d.platform.PolygonMode; +import com.mojang.blaze3d.shaders.UniformType; import com.mojang.blaze3d.vertex.VertexFormat; import net.minecraft.resources.Identifier; @@ -62,7 +63,7 @@ public class RenderPipelineBuilderWrapper } private BlendFunction blendFunction = null; - public RenderPipelineBuilderWrapper withBlendFunction(BlendFunction blendFunction) + public RenderPipelineBuilderWrapper withBlend(BlendFunction blendFunction) { this.blendFunction = blendFunction; return this; @@ -118,6 +119,18 @@ public class RenderPipelineBuilderWrapper return this; } + public RenderPipelineBuilderWrapper withSampler(String name) throws IllegalArgumentException + { + this.blazePipelineBuilder.withSampler(name); + return this; + } + + public RenderPipelineBuilderWrapper withUniformBuffer(String name) throws IllegalArgumentException + { + this.blazePipelineBuilder.withUniform(name, UniformType.UNIFORM_BUFFER); + return this; + } + private VertexFormat vertexFormat = null; public RenderPipelineBuilderWrapper withVertexFormat(VertexFormat vertexFormat) { @@ -201,7 +214,7 @@ public class RenderPipelineBuilderWrapper case LESS: break; } - this.blazePipelineBuilder.withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST); + this.blazepipelineBuilder.withDepthTest(RenderPipelineBuilderWrapper.EDhDepthTest.NONE); #else @@ -239,6 +252,9 @@ public class RenderPipelineBuilderWrapper case TRIANGLES: blazeVertexMode = VertexFormat.Mode.TRIANGLES; break; + case TRIANGLE_FAN: + blazeVertexMode = VertexFormat.Mode.TRIANGLE_FAN; + break; case LINES: blazeVertexMode = VertexFormat.Mode.DEBUG_LINES; break; @@ -303,6 +319,7 @@ public class RenderPipelineBuilderWrapper public enum EDhVertexMode { TRIANGLES, + TRIANGLE_FAN, LINES; } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/buffer/BlazeVertexBufferWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/buffer/BlazeVertexBufferWrapper.java index f98f975db..20475ab49 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/buffer/BlazeVertexBufferWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/buffer/BlazeVertexBufferWrapper.java @@ -13,20 +13,27 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.seibel.distanthorizons.core.dataObjects.render.bufferBuilding.IndexBufferBuilder; import com.seibel.distanthorizons.core.dataObjects.render.bufferBuilding.LodQuadBuilder; 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.render.RenderThreadTaskHandler; import com.seibel.distanthorizons.core.wrapperInterfaces.render.AbstractDhRenderApiDefinition; import com.seibel.distanthorizons.core.wrapperInterfaces.render.objects.IVertexBufferWrapper; import org.lwjgl.system.MemoryUtil; import java.nio.ByteBuffer; +import java.util.concurrent.atomic.AtomicInteger; public class BlazeVertexBufferWrapper implements IVertexBufferWrapper { + private static final DhLogger LOGGER = new DhLoggerBuilder().build(); + private static final AbstractDhRenderApiDefinition RENDER_DEF = SingletonInjector.INSTANCE.get(AbstractDhRenderApiDefinition.class); private static final GpuDevice GPU_DEVICE = RenderSystem.getDevice(); private static final CommandEncoder COMMAND_ENCODER = GPU_DEVICE.createCommandEncoder(); + private static final AtomicInteger BUFFER_COUNT_REF = new AtomicInteger(0); + public final String name; public String getName() { return this.name; } @@ -111,6 +118,12 @@ public class BlazeVertexBufferWrapper implements IVertexBufferWrapper // due to a bug on Mac where it will attempt to render anything allocated in the buffer || oldVertexCount != vertexCount) { + if (this.vertexGpuBuffer == null) + { + BUFFER_COUNT_REF.incrementAndGet(); + //LOGGER.info("Create, count: ["+BUFFER_COUNT_REF.get()+"]"); + } + if (this.vertexGpuBuffer != null) { this.vertexGpuBuffer.close(); @@ -146,6 +159,11 @@ public class BlazeVertexBufferWrapper implements IVertexBufferWrapper if (this.indexGpuBuffer == null || oldIndexCount != this.indexCount) { + if (this.indexGpuBuffer == null) + { + BUFFER_COUNT_REF.incrementAndGet(); + } + if (this.indexGpuBuffer != null) { this.indexGpuBuffer.close(); @@ -180,13 +198,17 @@ public class BlazeVertexBufferWrapper implements IVertexBufferWrapper { if (this.vertexGpuBuffer != null) { + BUFFER_COUNT_REF.decrementAndGet(); this.vertexGpuBuffer.close(); } if (this.indexGpuBuffer != null) { + BUFFER_COUNT_REF.decrementAndGet(); this.indexGpuBuffer.close(); } + + //LOGGER.info("Close, count: ["+BUFFER_COUNT_REF.get()+"]"); } //endregion diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinChunkSectionsToRender.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinChunkSectionsToRender.java index 2581b5322..723b94f81 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinChunkSectionsToRender.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinChunkSectionsToRender.java @@ -47,6 +47,11 @@ import com.mojang.blaze3d.textures.GpuSampler; public class MixinChunkSectionsToRender { + //===========// + // Pre MC 26 // + //===========// + //regino + #if MC_VER <= MC_1_21_11 #if MC_VER <= MC_1_21_10 // needs to fire at HEAD with a lower than normal order (less than 1000) @@ -74,6 +79,51 @@ public class MixinChunkSectionsToRender } } + //endregion + #else + + + + //============// + // post MC 26 // + //============// + //region + + // needs to fire at HEAD with a lower than normal order (less than 1000) + // otherwise it will be canceled by Sodium + @Inject(at = @At("HEAD"), method = "renderGroup", order = 800) + private void renderDeferredLayerHead(ChunkSectionLayerGroup chunkSectionLayerGroup, GpuSampler gpuSampler, CallbackInfo ci) + { + ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, Minecraft.getInstance().levelRenderer.level); + + + ClientApi.RENDER_STATE.canRenderOrThrow(); + + if (chunkSectionLayerGroup == ChunkSectionLayerGroup.TRANSLUCENT) + { + ClientApi.INSTANCE.renderDeferredLodsForShaders(); + } + else if (chunkSectionLayerGroup == ChunkSectionLayerGroup.OPAQUE) + { + ClientApi.INSTANCE.renderFadeTransparent(); + ClientApi.INSTANCE.renderLods(); + } + } + + @Inject(at = @At("RETURN"), method = "renderGroup", order = 800) + private void renderDeferredLayerReturn(ChunkSectionLayerGroup chunkSectionLayerGroup, GpuSampler gpuSampler, CallbackInfo ci) + { + ClientApi.RENDER_STATE.canRenderOrThrow(); + + if (chunkSectionLayerGroup == ChunkSectionLayerGroup.TRANSLUCENT) + { + ClientApi.INSTANCE.renderFadeOpaque(); + } + } + + //endregion + #endif + } diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLevelRenderer.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLevelRenderer.java index d84e5b61d..748b8c331 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLevelRenderer.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLevelRenderer.java @@ -47,30 +47,39 @@ import org.joml.Matrix4fc; import org.joml.Vector4f; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -#else +#elif MC_VER <= MC_1_21_11 import com.mojang.blaze3d.buffers.GpuBufferSlice; import com.mojang.blaze3d.resource.GraphicsResourceAllocator; import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftRenderWrapper; -import net.minecraft.client.Camera; import net.minecraft.client.DeltaTracker; import net.minecraft.client.renderer.chunk.ChunkSectionsToRender; -import org.joml.Matrix4f; import org.joml.Matrix4fc; import org.joml.Vector4f; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +#else +import com.mojang.blaze3d.buffers.GpuBufferSlice; +import com.mojang.blaze3d.resource.GraphicsResourceAllocator; +import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftRenderWrapper; +import net.minecraft.client.DeltaTracker; +import net.minecraft.client.renderer.chunk.ChunkSectionsToRender; +import org.joml.Matrix4fc; +import org.joml.Vector4f; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import net.minecraft.client.renderer.state.level.CameraRenderState; #endif import com.seibel.distanthorizons.common.wrappers.McObjectConverter; import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper; -import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftRenderWrapper; import com.seibel.distanthorizons.core.api.internal.ClientApi; import com.seibel.distanthorizons.coreapi.ModInfo; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; -import net.minecraft.client.Minecraft; + import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.LevelRenderer; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -91,6 +100,13 @@ public class MixinLevelRenderer private static final DhLogger LOGGER = new DhLoggerBuilder().build(); + + //===========// + // Pre MC 26 // + //===========// + //region + #if MC_VER <= MC_1_21_11 + #if MC_VER < MC_1_17_1 @Inject(at = @At("HEAD"), method = "renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDD)V", @@ -128,7 +144,7 @@ public class MixinLevelRenderer Vector4f skyColor, boolean thinFog, CallbackInfo callback) #endif { - #if MC_VER == MC_1_16_5 + #if MC_VER <= MC_1_16_5 // get the matrices from the OpenGL fixed pipeline float[] mcProjMatrixRaw = new float[16]; GL32.glGetFloatv(GL32.GL_PROJECTION_MATRIX, mcProjMatrixRaw); @@ -190,6 +206,64 @@ public class MixinLevelRenderer } #endif + #endif + //endregion + + + + //============// + // post MC 26 // + //============// + //region + + #if MC_VER <= MC_1_21_11 + #else + + @Inject(at = @At("HEAD"), method = "prepareChunkRenders") + private void prepareChunkRenders(final Matrix4fc modelViewMatrix, CallbackInfoReturnable callback) + { + ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, this.level); + } + + @Inject(at = @At("HEAD"), method = "renderLevel") + public void renderLevel( + final GraphicsResourceAllocator resourceAllocator, final DeltaTracker deltaTracker, + final boolean renderBlockOutline, final CameraRenderState camera, + final Matrix4fc modelViewMatrix, final GpuBufferSlice terrainFog, + final Vector4f fogColor, final boolean shouldRenderSky, + final ChunkSectionsToRender chunkSectionsToRender, + CallbackInfo callback) + { + ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrix); + ClientApi.RENDER_STATE.mcProjectionMatrix = McObjectConverter.Convert(camera.projectionMatrix); + + ClientApi.RENDER_STATE.partialTickTime = MinecraftRenderWrapper.INSTANCE.getPartialTickTime(); + + } + + @Inject( + method = "addMainPass(Lcom/mojang/blaze3d/framegraph/FrameGraphBuilder;Lnet/minecraft/client/renderer/culling/Frustum;Lorg/joml/Matrix4fc;Lcom/mojang/blaze3d/buffers/GpuBufferSlice;ZLnet/minecraft/client/renderer/state/level/LevelRenderState;Lnet/minecraft/client/DeltaTracker;Lnet/minecraft/util/profiling/ProfilerFiller;Lnet/minecraft/client/renderer/chunk/ChunkSectionsToRender;)V", + at = @At( + value = "RETURN", + target = "Lcom/mojang/blaze3d/framegraph/FramePass;executes(Ljava/lang/Runnable;)V", + remap = false + ) + ) + public void addMainPass( + CallbackInfo ci) + { + // only crash during development + if (ModInfo.IS_DEV_BUILD) + { + ClientApi.RENDER_STATE.canRenderOrThrow(); + } + + ClientApi.INSTANCE.renderLods(); + + } + + #endif + //endregion diff --git a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinLevelRenderer.java b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinLevelRenderer.java index 091468719..169dd9659 100644 --- a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinLevelRenderer.java +++ b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinLevelRenderer.java @@ -35,6 +35,7 @@ import net.minecraft.client.DeltaTracker; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.state.level.CameraRenderState; import org.joml.Matrix4f; import org.joml.Matrix4fc; import org.joml.Vector4f; @@ -77,6 +78,12 @@ public class MixinLevelRenderer + //===========// + // Pre MC 26 // + //===========// + //region + #if MC_VER <= MC_1_21_11 + #if MC_VER < MC_1_21_6 @Inject(at = @At("HEAD"), method = "renderSectionLayer") private void renderChunkLayer(RenderType renderType, double x, double y, double z, Matrix4f modelViewMatrix, Matrix4f projectionMatrix, CallbackInfo callback) @@ -165,6 +172,71 @@ public class MixinLevelRenderer } #endif + #endif + //endregion + + + + //============// + // post MC 26 // + //============// + //region + + #if MC_VER <= MC_1_21_11 + #else + + @Inject(at = @At("HEAD"), method = "prepareChunkRenders") + private void prepareChunkRenders(final Matrix4fc modelViewMatrix, CallbackInfoReturnable callback) + { + ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, this.level); + } + + @Inject(at = @At("HEAD"), method = "renderLevel") + public void renderLevel( + final GraphicsResourceAllocator resourceAllocator, final DeltaTracker deltaTracker, + final boolean renderBlockOutline, final CameraRenderState camera, + final Matrix4fc modelViewMatrix, final GpuBufferSlice terrainFog, + final Vector4f fogColor, final boolean shouldRenderSky, + final ChunkSectionsToRender chunkSectionsToRender, + CallbackInfo callback) + { + ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrix); + ClientApi.RENDER_STATE.mcProjectionMatrix = McObjectConverter.Convert(camera.projectionMatrix); + + ClientApi.RENDER_STATE.partialTickTime = MinecraftRenderWrapper.INSTANCE.getPartialTickTime(); + + } + + @Inject( + method = "addMainPass(Lcom/mojang/blaze3d/framegraph/FrameGraphBuilder;Lnet/minecraft/client/renderer/culling/Frustum;Lorg/joml/Matrix4fc;Lcom/mojang/blaze3d/buffers/GpuBufferSlice;ZLnet/minecraft/client/renderer/state/level/LevelRenderState;Lnet/minecraft/client/DeltaTracker;Lnet/minecraft/util/profiling/ProfilerFiller;Lnet/minecraft/client/renderer/chunk/ChunkSectionsToRender;)V", + at = @At( + value = "RETURN", + target = "Lcom/mojang/blaze3d/framegraph/FramePass;executes(Ljava/lang/Runnable;)V", + remap = false + ) + ) + public void addMainPass( + CallbackInfo ci) + { + // only crash during development + if (ModInfo.IS_DEV_BUILD) + { + try + { + ClientApi.RENDER_STATE.canRenderOrThrow(); + } + catch (IllegalStateException e) + { + return; + } + } + + ClientApi.INSTANCE.renderLods(); + + } + + #endif + //endregion