diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/TexturedButtonWidget.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/TexturedButtonWidget.java index 91d10970e..88157d7f7 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/TexturedButtonWidget.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/TexturedButtonWidget.java @@ -39,12 +39,14 @@ import net.minecraft.client.renderer.GameRenderer; #elif MC_VER < MC_1_20_2 import net.minecraft.client.gui.components.ImageButton; import net.minecraft.client.gui.GuiGraphics; +#elif MC_VER < MC_1_21_6 +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.renderer.RenderType; #else import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.RenderType; -#endif - import net.minecraft.client.renderer.RenderPipelines; +#endif /** * Creates a button with a texture on it (and a background) that works with all mc versions diff --git a/coreSubProjects b/coreSubProjects index e93d5b90f..317319593 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit e93d5b90f1690acdce5ae93ea2c511b47f00b421 +Subproject commit 317319593e258fa67907de557a539efe358b248e diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java index 441c1b737..48c3f745a 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java @@ -91,6 +91,44 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy HashSet previouslyPressKeyCodes = new HashSet<>(); + public static NeoRenderState neoRenderState = new NeoRenderState(); + + + public static class NeoRenderState + { + public Mat4f mcModelViewMatrix = null; + public Mat4f mcProjectionMatrix = null; + public float frameTime = -1; + + + public void canRenderOrThrow() throws IllegalStateException + { + String errorReasons = ""; + + if (this.mcModelViewMatrix == null) + { + errorReasons += "no MVM Matrix, "; + } + + if (this.mcProjectionMatrix == null) + { + errorReasons += "no Projection Matrix, "; + } + + if (this.frameTime == -1) + { + errorReasons += "no Frame Time, "; + } + + + if (!errorReasons.isEmpty()) + { + throw new IllegalStateException(errorReasons); + } + + } + } + /** @@ -228,6 +266,14 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy modelViewMatrix = McObjectConverter.Convert(renderContext.positionMatrix()); #endif + + //LOGGER.info("\n\n" + + // "Level Render\n" + + // "Mc MVM: \n" + modelViewMatrix.toString() + "\n" + + // "Mc Proj: \n" + projectionMatrix.toString() + //); + + this.clientApi.renderLods(ClientLevelWrapper.getWrapper(renderContext.world()), modelViewMatrix, projectionMatrix, 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 f4bfc0fb7..1836244fc 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 @@ -19,31 +19,43 @@ package com.seibel.distanthorizons.fabric.mixins.client; -import com.mojang.blaze3d.vertex.PoseStack; #if MC_VER < MC_1_19_4 import com.mojang.math.Matrix4f; import org.lwjgl.opengl.GL32; -#else +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +#elif MC_VER < MC_1_21_6 +import net.minecraft.client.renderer.RenderType; import org.joml.Matrix4f; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +#else +import com.mojang.blaze3d.vertex.PoseStack; +import com.seibel.distanthorizons.coreapi.ModInfo; +import com.seibel.distanthorizons.fabric.FabricClientProxy; +import net.minecraft.client.Camera; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.chunk.ChunkSectionsToRender; +import org.joml.Matrix4fc; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; #endif -import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper; + + import com.seibel.distanthorizons.common.wrappers.McObjectConverter; import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper; import com.seibel.distanthorizons.core.api.internal.ClientApi; import com.seibel.distanthorizons.core.util.math.Mat4f; -import net.minecraft.client.Camera; +import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.GameRenderer; -import net.minecraft.client.renderer.LightTexture; import com.seibel.distanthorizons.core.config.Config; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.LevelRenderer; -import net.minecraft.client.renderer.RenderType; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import org.apache.logging.log4j.Logger; /** * This class is used to mix in my rendering code @@ -52,8 +64,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; * render last event, the LODs would render on top * of the normal terrain. * - * This is also the mixin for rendering the clouds - * * @author coolGi * @author James Seibel * @version 12-31-2021 @@ -63,7 +73,11 @@ public class MixinLevelRenderer { @Shadow private ClientLevel level; - + + @Unique + private static final Logger LOGGER = DhLoggerBuilder.getLogger(); + + #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", @@ -84,51 +98,63 @@ public class MixinLevelRenderer method = "Lnet/minecraft/client/renderer/LevelRenderer;renderSectionLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V", cancellable = true) private void renderChunkLayer(RenderType renderType, PoseStack modelViewMatrixStack, double camX, double camY, double camZ, Matrix4f projectionMatrix, CallbackInfo callback) - #else + #elif MC_VER < MC_1_21_6 @Inject(at = @At("HEAD"), method = "Lnet/minecraft/client/renderer/LevelRenderer;renderSectionLayer(Lnet/minecraft/client/renderer/RenderType;DDDLorg/joml/Matrix4f;Lorg/joml/Matrix4f;)V", cancellable = true) private void renderChunkLayer(RenderType renderType, double x, double y, double z, Matrix4f projectionMatrix, Matrix4f frustumMatrix, CallbackInfo callback) + #else + @Inject(at = @At("HEAD"), method = "prepareChunkRenders", cancellable = true) + private void renderChunkLayer(Matrix4fc projectionMatrix, double d, double e, double f, CallbackInfoReturnable callback) #endif { #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); - Mat4f mcProjectionMatrix = new Mat4f(mcProjMatrixRaw); - mcProjectionMatrix.transpose(); + FabricClientProxy.neoRenderState.mcProjectionMatrix = new Mat4f(mcProjMatrixRaw); + FabricClientProxy.neoRenderState.mcProjectionMatrix.transpose(); - Mat4f mcModelViewMatrix = McObjectConverter.Convert(matrixStackIn.last().pose()); + FabricClientProxy.neoRenderState.mcModelViewMatrix = McObjectConverter.Convert(matrixStackIn.last().pose()); #elif MC_VER <= MC_1_20_4 // get the matrices directly from MC - Mat4f mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrixStack.last().pose()); - Mat4f mcProjectionMatrix = McObjectConverter.Convert(projectionMatrix); + FabricClientProxy.neoRenderState.mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrixStack.last().pose()); + FabricClientProxy.neoRenderState.mcProjectionMatrix = McObjectConverter.Convert(projectionMatrix); #else // MC combined the model view and projection matricies - Mat4f mcModelViewMatrix = McObjectConverter.Convert(projectionMatrix); - Mat4f mcProjectionMatrix = new Mat4f(); - mcProjectionMatrix.setIdentity(); + FabricClientProxy.neoRenderState.mcModelViewMatrix = McObjectConverter.Convert(projectionMatrix); + FabricClientProxy.neoRenderState.mcProjectionMatrix = new Mat4f(); + FabricClientProxy.neoRenderState.mcProjectionMatrix.setIdentity(); #endif // TODO move this into a common place - float frameTime; #if MC_VER < MC_1_21_1 - frameTime = Minecraft.getInstance().getFrameTime(); + FabricClientProxy.neoRenderState.frameTime = Minecraft.getInstance().getFrameTime(); #elif MC_VER < MC_1_21_3 - frameTime = Minecraft.getInstance().getTimer().getRealtimeDeltaTicks(); + FabricClientProxy.neoRenderState.frameTime = Minecraft.getInstance().getTimer().getRealtimeDeltaTicks(); #else - frameTime = Minecraft.getInstance().deltaTracker.getRealtimeDeltaTicks(); + FabricClientProxy.neoRenderState.frameTime = Minecraft.getInstance().deltaTracker.getRealtimeDeltaTicks(); #endif + + //LOGGER.info("\n\n" + + // "Level Mixin\n" + + // "Mc MVM: \n" + mcModelViewMatrix.toString() + "\n" + + // "Mc Proj: \n" + mcProjectionMatrix.toString() + //); + + + #if MC_VER < MC_1_21_6 if (renderType.equals(RenderType.translucent())) { - ClientApi.INSTANCE.renderDeferredLods(ClientLevelWrapper.getWrapper(this.level), + ClientApi.INSTANCE.renderDeferredLodsForShaders(ClientLevelWrapper.getWrapper(this.level), mcModelViewMatrix, mcProjectionMatrix, frameTime ); } + #endif // FIXME completely disables rendering when sodium is installed if (Config.Client.Advanced.Debugging.lodOnlyMode.get()) @@ -137,4 +163,30 @@ public class MixinLevelRenderer } } + + + #if MC_VER < MC_1_21_6 + + // formerly handled in renderChunkLayer() + + #else + @Inject(at = @At("HEAD"), method = "renderBlockDestroyAnimation", cancellable = true) + private void renderBlockDestroyAnimation(PoseStack poseStack, Camera camera, MultiBufferSource.BufferSource bufferSource, CallbackInfo callback) + { + // only crash during development + if (ModInfo.IS_DEV_BUILD) + { + FabricClientProxy.neoRenderState.canRenderOrThrow(); + } + + ClientApi.INSTANCE.renderDeferredLodsForShaders(ClientLevelWrapper.getWrapper(this.level), + FabricClientProxy.neoRenderState.mcModelViewMatrix, + FabricClientProxy.neoRenderState.mcProjectionMatrix, + FabricClientProxy.neoRenderState.frameTime + ); + } + #endif + + + } diff --git a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeClientProxy.java b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeClientProxy.java index 504605f69..124381ec3 100644 --- a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeClientProxy.java +++ b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeClientProxy.java @@ -78,11 +78,9 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy private static final IMinecraftClientWrapper MC = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class); private static final Logger LOGGER = DhLoggerBuilder.getLogger(); -// private static SimpleChannel multiversePluginChannel; - // Not the cleanest way of passing this to the LOD renderer, but it'll have to do for now - public static Mat4f currentModelViewMatrix = new Mat4f(); - public static Mat4f currentProjectionMatrix = new Mat4f(); + public static NeoRenderState neoRenderState = new NeoRenderState(); + @@ -244,16 +242,6 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy // rendering // //===========// - @SubscribeEvent - public void beforeLevelRenderEvent(RenderLevelStageEvent event) - { - if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_SKY) - { - currentModelViewMatrix = McObjectConverter.Convert(event.getModelViewMatrix()); - currentProjectionMatrix = McObjectConverter.Convert(event.getProjectionMatrix()); - } - } - @SubscribeEvent public void afterLevelRenderEvent(RenderLevelStageEvent event) { @@ -282,4 +270,45 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy private static LevelAccessor GetEventLevel(LevelEvent e) { return e.getLevel(); } + + //================// + // helper classes // + //================// + + public static class NeoRenderState + { + public Mat4f mcModelViewMatrix = null; + public Mat4f mcProjectionMatrix = null; + public float frameTime = -1; + + + public void canRenderOrThrow() throws IllegalStateException + { + String errorReasons = ""; + + if (this.mcModelViewMatrix == null) + { + errorReasons += "no MVM Matrix, "; + } + + if (this.mcProjectionMatrix == null) + { + errorReasons += "no Projection Matrix, "; + } + + if (this.frameTime == -1) + { + errorReasons += "no Frame Time, "; + } + + + if (!errorReasons.isEmpty()) + { + throw new IllegalStateException(errorReasons); + } + + } + } + + } 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 6d64a8c61..ff3581fbf 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 @@ -19,39 +19,53 @@ package com.seibel.distanthorizons.neoforge.mixins.client; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; -#if MC_VER < MC_1_19_4 -import com.mojang.math.Matrix4f; -#else -import com.seibel.distanthorizons.core.util.math.Mat4f; -import com.seibel.distanthorizons.neoforge.NeoforgeClientProxy; -import net.minecraft.client.Camera; +#if MC_VER < MC_1_21_6 import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.GameRenderer; -import net.minecraft.client.renderer.LightTexture; -import org.joml.Matrix4f; -#endif -import com.seibel.distanthorizons.common.wrappers.McObjectConverter; -import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper; -import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper; -import com.seibel.distanthorizons.core.config.Config; -import com.seibel.distanthorizons.core.api.internal.ClientApi; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.RenderType; +import net.neoforged.neoforge.client.event.RenderLevelStageEvent; +import org.joml.Matrix4f; +#else +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.chunk.ChunkSectionsToRender; +import net.minecraft.client.Camera; +import net.minecraft.client.DeltaTracker; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.renderer.LevelRenderer; + +import org.joml.Matrix4f; +import org.joml.Matrix4fc; +import org.joml.Vector4f; + +import com.mojang.blaze3d.buffers.GpuBufferSlice; +import com.mojang.blaze3d.resource.GraphicsResourceAllocator; + +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +#endif + + + +import org.apache.logging.log4j.Logger; + +import com.seibel.distanthorizons.neoforge.NeoforgeClientProxy; +import com.seibel.distanthorizons.common.wrappers.McObjectConverter; +import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper; +import com.seibel.distanthorizons.core.api.internal.ClientApi; +import com.seibel.distanthorizons.core.config.Config; +import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; +import com.seibel.distanthorizons.core.util.math.Mat4f; +import com.seibel.distanthorizons.coreapi.ModInfo; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -#if MC_VER < MC_1_17_1 -import org.lwjgl.opengl.GL15; -#endif - - /** * This class is used to mix in DH's rendering code * before Minecraft starts rendering blocks. @@ -70,73 +84,66 @@ public class MixinLevelRenderer #endif private ClientLevel level; + @Unique + private static final Logger LOGGER = DhLoggerBuilder.getLogger(); - #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", - cancellable = true) - private void renderChunkLayer(RenderType renderType, PoseStack matrixStackIn, double xIn, double yIn, double zIn, CallbackInfo callback) - #elif MC_VER < MC_1_19_4 - @Inject(at = @At("HEAD"), - method = "renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLcom/mojang/math/Matrix4f;)V", - cancellable = true) - private void renderChunkLayer(RenderType renderType, PoseStack modelViewMatrixStack, double cameraXBlockPos, double cameraYBlockPos, double cameraZBlockPos, Matrix4f projectionMatrix, CallbackInfo callback) - #elif MC_VER < MC_1_20_2 - @Inject(at = @At("HEAD"), - method = "renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V", - cancellable = true) - private void renderChunkLayer(RenderType renderType, PoseStack modelViewMatrixStack, double cameraXBlockPos, double cameraYBlockPos, double cameraZBlockPos, Matrix4f projectionMatrix, CallbackInfo callback) - #elif MC_VER < MC_1_20_6 - @Inject(at = @At("HEAD"), - method = "Lnet/minecraft/client/renderer/LevelRenderer;renderSectionLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V", - cancellable = true) - private void renderChunkLayer(RenderType renderType, PoseStack modelViewMatrixStack, double camX, double camY, double camZ, Matrix4f projectionMatrix, CallbackInfo callback) + + + #if MC_VER < MC_1_21_6 + @Inject(at = @At("HEAD"), method = "renderSectionLayer", cancellable = true) + private void renderChunkLayer(RenderType renderType, double x, double y, double z, Matrix4f modelViewMatrix, Matrix4f projectionMatrix, CallbackInfo callback) #else - @Inject(at = @At("HEAD"), - method = "Lnet/minecraft/client/renderer/LevelRenderer;renderSectionLayer(Lnet/minecraft/client/renderer/RenderType;DDDLorg/joml/Matrix4f;Lorg/joml/Matrix4f;)V", - cancellable = true) - private void renderChunkLayer(RenderType renderType, double x, double y, double z, Matrix4f projectionMatrix, Matrix4f frustumMatrix, CallbackInfo callback) - #endif + @Inject(at = @At("HEAD"), method = "renderLevel", cancellable = true) + private void onRenderLevel(GraphicsResourceAllocator resourceAllocator, DeltaTracker deltaTracker, boolean renderBlockOutline, Camera camera, Matrix4f positionMatrix, Matrix4f projectionMatrix, GpuBufferSlice gpuBufferSlice, Vector4f skyColor, boolean thinFog, CallbackInfo callback) + #endif { - #if MC_VER == MC_1_16_5 - // get the matrices from the OpenGL fixed pipeline - float[] mcProjMatrixRaw = new float[16]; - GL15.glGetFloatv(GL15.GL_PROJECTION_MATRIX, mcProjMatrixRaw); - Mat4f mcProjectionMatrix = new Mat4f(mcProjMatrixRaw); - mcProjectionMatrix.transpose(); - - Mat4f mcModelViewMatrix = McObjectConverter.Convert(matrixStackIn.last().pose()); - - #elif MC_VER <= MC_1_20_4 - // get the matrices directly from MC - Mat4f mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrixStack.last().pose()); - Mat4f mcProjectionMatrix = McObjectConverter.Convert(projectionMatrix); + #if MC_VER < MC_1_21_6 + // MC combined the model view and projection matricies + NeoforgeClientProxy.neoRenderState.mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrix); + NeoforgeClientProxy.neoRenderState.mcProjectionMatrix = McObjectConverter.Convert(projectionMatrix); #else - // get the matrices from neoForge's render event. - // We can't call the renderer there because we don't have access to the level that's being rendered - Mat4f mcModelViewMatrix = NeoforgeClientProxy.currentModelViewMatrix; - Mat4f mcProjectionMatrix = NeoforgeClientProxy.currentProjectionMatrix; + NeoforgeClientProxy.neoRenderState.mcProjectionMatrix = McObjectConverter.Convert(projectionMatrix); #endif + + //LOGGER.info("\n\n" + + // "Level Mixin\n" + + // "Mc MVM: \n" + NeoforgeClientProxy.neoRenderState.mcModelViewMatrix.toString() + "\n" + + // "Mc Proj: \n" + NeoforgeClientProxy.neoRenderState.mcProjectionMatrix.toString() + //); + - float frameTime; #if MC_VER < MC_1_21_1 - frameTime = Minecraft.getInstance().getFrameTime(); + NeoforgeClientProxy.neoRenderState.frameTime = Minecraft.getInstance().getFrameTime(); #elif MC_VER < MC_1_21_3 - frameTime = Minecraft.getInstance().getTimer().getRealtimeDeltaTicks(); + NeoforgeClientProxy.neoRenderState.frameTime = Minecraft.getInstance().getTimer().getRealtimeDeltaTicks(); #else - frameTime = Minecraft.getInstance().deltaTracker.getRealtimeDeltaTicks(); + NeoforgeClientProxy.neoRenderState.frameTime = Minecraft.getInstance().deltaTracker.getRealtimeDeltaTicks(); #endif + #if MC_VER < MC_1_21_6 + + // only crash during development + if (ModInfo.IS_DEV_BUILD) + { + NeoforgeClientProxy.neoRenderState.canRenderOrThrow(); + } + // render LODs if (renderType.equals(RenderType.solid())) { - ClientApi.INSTANCE.renderLods(ClientLevelWrapper.getWrapper(this.level), mcModelViewMatrix, mcProjectionMatrix, frameTime); + ClientApi.INSTANCE.renderLods(ClientLevelWrapper.getWrapper(this.level), + NeoforgeClientProxy.neoRenderState.mcModelViewMatrix, + NeoforgeClientProxy.neoRenderState.mcProjectionMatrix, + NeoforgeClientProxy.neoRenderState.frameTime); } else if (renderType.equals(RenderType.translucent())) { - ClientApi.INSTANCE.renderDeferredLods(ClientLevelWrapper.getWrapper(this.level), mcModelViewMatrix, mcProjectionMatrix, frameTime); + ClientApi.INSTANCE.renderDeferredLodsForShaders(ClientLevelWrapper.getWrapper(this.level), + NeoforgeClientProxy.neoRenderState.mcModelViewMatrix, + NeoforgeClientProxy.neoRenderState.mcProjectionMatrix, + NeoforgeClientProxy.neoRenderState.frameTime); } // render fade @@ -146,21 +153,22 @@ public class MixinLevelRenderer if (renderType.equals(RenderType.cutout())) { ClientApi.INSTANCE.renderFadeOpaque( - mcModelViewMatrix, - mcProjectionMatrix, - frameTime, + NeoforgeClientProxy.neoRenderState.mcModelViewMatrix, + NeoforgeClientProxy.neoRenderState.mcProjectionMatrix, + NeoforgeClientProxy.neoRenderState.frameTime, ClientLevelWrapper.getWrapper(this.level) ); } else if (renderType.equals(RenderType.tripwire())) { ClientApi.INSTANCE.renderFade( - mcModelViewMatrix, - mcProjectionMatrix, - frameTime, + NeoforgeClientProxy.neoRenderState.mcModelViewMatrix, + NeoforgeClientProxy.neoRenderState.mcProjectionMatrix, + NeoforgeClientProxy.neoRenderState.frameTime, ClientLevelWrapper.getWrapper(this.level) ); } + #endif if (Config.Client.Advanced.Debugging.lodOnlyMode.get()) { @@ -169,4 +177,47 @@ public class MixinLevelRenderer } + #if MC_VER < MC_1_21_6 + + // formerly handled in renderChunkLayer() + + #else + @Inject(at = @At("HEAD"), method = "prepareChunkRenders", cancellable = true) + private void renderChunkLayer(Matrix4fc modelViewMatrix, double d, double e, double f, CallbackInfoReturnable callback) + { + NeoforgeClientProxy.neoRenderState.mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrix); + + // only crash during development + if (ModInfo.IS_DEV_BUILD) + { + NeoforgeClientProxy.neoRenderState.canRenderOrThrow(); + } + + ClientApi.INSTANCE.renderLods(ClientLevelWrapper.getWrapper(this.level), + NeoforgeClientProxy.neoRenderState.mcModelViewMatrix, + NeoforgeClientProxy.neoRenderState.mcProjectionMatrix, + NeoforgeClientProxy.neoRenderState.frameTime); + } + + + @Inject(at = @At("HEAD"), method = "renderBlockDestroyAnimation", cancellable = true) + private void renderBlockDestroyAnimation(PoseStack poseStack, Camera camera, MultiBufferSource.BufferSource bufferSource, CallbackInfo callback) + { + // only crash during development + if (ModInfo.IS_DEV_BUILD) + { + NeoforgeClientProxy.neoRenderState.canRenderOrThrow(); + } + + ClientApi.INSTANCE.renderDeferredLodsForShaders(ClientLevelWrapper.getWrapper(this.level), + NeoforgeClientProxy.neoRenderState.mcModelViewMatrix, + NeoforgeClientProxy.neoRenderState.mcProjectionMatrix, + NeoforgeClientProxy.neoRenderState.frameTime + ); + } + + #endif + + + }