From c42f800db5599c3dd1d780f740c50b462eec17ff Mon Sep 17 00:00:00 2001 From: James Seibel Date: Fri, 10 Oct 2025 07:15:27 -0500 Subject: [PATCH] add fabric 1.21.9 support --- .../wrappers/block/AbstractDhTintGetter.java | 1 - .../minecraft/MinecraftRenderWrapper.java | 45 +-------- .../wrappers/world/ClientLevelWrapper.java | 18 ++++ coreSubProjects | 2 +- .../fabric/FabricClientProxy.java | 97 ++++++++----------- .../client/MixinChunkSectionsToRender.java | 71 ++++++++++++++ .../client/MixinDebugScreenOverlay.java | 5 +- .../mixins/client/MixinLevelRenderer.java | 85 +++++++++++++--- .../DistantHorizons.fabric.mixins.json | 1 + .../mixins/client/MixinLevelRenderer.java | 35 +++---- .../neoforge/NeoforgeClientProxy.java | 41 ++------ .../mixins/client/MixinLevelRenderer.java | 57 +++-------- versionProperties/1.21.9.properties | 4 +- 13 files changed, 242 insertions(+), 220 deletions(-) create mode 100644 fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinChunkSectionsToRender.java diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/AbstractDhTintGetter.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/AbstractDhTintGetter.java index 806e21b7a..3e7afa27d 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/AbstractDhTintGetter.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/AbstractDhTintGetter.java @@ -7,7 +7,6 @@ import com.seibel.distanthorizons.core.pos.blockPos.DhBlockPosMutable; import com.seibel.distanthorizons.core.util.ColorUtil; import com.seibel.distanthorizons.core.util.FullDataPointUtil; import net.minecraft.core.BlockPos; -import net.minecraft.core.Holder; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.ColorResolver; import net.minecraft.world.level.biome.Biome; diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftRenderWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftRenderWrapper.java index a1eb31463..16a40130c 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftRenderWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftRenderWrapper.java @@ -25,7 +25,6 @@ import java.util.concurrent.ConcurrentHashMap; import com.mojang.blaze3d.pipeline.RenderTarget; import com.mojang.blaze3d.platform.NativeImage; -import com.seibel.distanthorizons.common.wrappers.WrapperFactory; import com.seibel.distanthorizons.common.wrappers.misc.LightMapWrapper; import com.seibel.distanthorizons.core.dependencyInjection.ModAccessorInjector; @@ -72,7 +71,7 @@ import net.minecraft.world.phys.Vec3; import org.apache.logging.log4j.Logger; import org.joml.Vector4f; -#if MC_VER >= MC_1_21_5 && MC_VER < MC_1_21_9 +#if MC_VER >= MC_1_21_5 import com.mojang.blaze3d.opengl.GlTexture; #else #endif @@ -344,7 +343,7 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper { #if MC_VER < MC_1_21_5 return this.getRenderTarget().getDepthTextureId(); - #elif MC_VER < MC_1_21_9 + #else try { GlTexture glTexture = (GlTexture) this.getRenderTarget().getDepthTexture(); @@ -367,25 +366,6 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper } return 0; } - #else - try - { - throw new UnsupportedOperationException("Fabric get texture ID not implemented yet"); - - //GpuTexture depthTex = this.getRenderTarget().getDepthTexture(); - //int id = ((GlTexture)depthTex.getClass().getMethod("getRealTexture").invoke(depthTex)).glId(); - //return id; - } - catch (Exception e) - { - // only log this error once per session - if (!this.depthTextureCastFailLogged) - { - this.depthTextureCastFailLogged = true; - LOGGER.error("Unable to cast render Target depth texture to GlTexture. MC or a rendering mod may have changed the object type.", e); - } - return 0; - } #endif } @Override @@ -393,7 +373,7 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper { #if MC_VER < MC_1_21_5 return this.getRenderTarget().getColorTextureId(); - #elif MC_VER < MC_1_21_9 + #else try { GlTexture glTexture = (GlTexture) this.getRenderTarget().getColorTexture(); @@ -415,25 +395,6 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper } return 0; } - #else - try - { - throw new UnsupportedOperationException("Fabric get texture ID not implemented yet"); - - //GpuTexture colorTex = this.getRenderTarget().getColorTexture(); - //int id = ((GlTexture)colorTex.getClass().getMethod("getRealTexture").invoke(colorTex)).glId(); - //return id; - } - catch (Exception e) - { - // only log this error once per session - if (!this.colorTextureCastFailLogged) - { - this.colorTextureCastFailLogged = true; - LOGGER.error("Unable to cast render Target color texture to GlTexture. MC or a rendering mod may have changed the object type.", e); - } - return 0; - } #endif } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ClientLevelWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ClientLevelWrapper.java index 0d5e4cca3..5c1736462 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ClientLevelWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ClientLevelWrapper.java @@ -92,6 +92,24 @@ public class ClientLevelWrapper implements IClientLevelWrapper // instance methods // //==================// + /** + * can be used when speed is important and the same level is likely to be passed in, + * IE rendering. + */ + @Nullable + public static IClientLevelWrapper getWrapperIfDifferent(@Nullable IClientLevelWrapper levelWrapper, @NotNull ClientLevel level) + { + ClientLevelWrapper clientLevelWrapper = (ClientLevelWrapper)levelWrapper; + if (clientLevelWrapper == null + || clientLevelWrapper.level != level) + { + return getWrapper(level); + } + + return clientLevelWrapper; + } + + @Nullable public static IClientLevelWrapper getWrapper(@NotNull ClientLevel level) { return getWrapper(level, false); } @Nullable diff --git a/coreSubProjects b/coreSubProjects index 009cfdce9..57aec6092 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 009cfdce93fff97ebdd60f9af6442f79a55f2545 +Subproject commit 57aec6092c163713c6dbd70bdd4305eb3a516850 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 6c10fdbd2..d5fd618c8 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java @@ -104,13 +104,6 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy LOGGER.info("Registering Fabric Client Events"); - #if MC_VER < MC_1_21_9 - // old versions still run like normal - #else - if (true) - throw new UnsupportedOperationException("DH doesn't support 1.21.9 yet because the Fabric Rendering API is missing required events. Please wait for the Fabric team to update their API."); - #endif - //========================// // register mod accessors // @@ -230,91 +223,77 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy #if MC_VER < MC_1_21_9 WorldRenderEvents.AFTER_SETUP.register((renderContext) -> { - Mat4f projectionMatrix = McObjectConverter.Convert(renderContext.projectionMatrix()); + ClientApi.RENDER_STATE.mcProjectionMatrix = McObjectConverter.Convert(renderContext.projectionMatrix()); - Mat4f modelViewMatrix; #if MC_VER < MC_1_20_6 - modelViewMatrix = McObjectConverter.Convert(renderContext.matrixStack().last().pose()); + ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(renderContext.matrixStack().last().pose()); #else - modelViewMatrix = McObjectConverter.Convert(renderContext.positionMatrix()); + ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(renderContext.positionMatrix()); #endif + #if MC_VER < MC_1_21_1 + ClientApi.RENDER_STATE.frameTime = renderContext.tickDelta(); + #else + ClientApi.RENDER_STATE.frameTime = renderContext.tickCounter().getGameTimeDeltaTicks(); + #endif - //LOGGER.info("\n\n" + - // "Level Render\n" + - // "Mc MVM: \n" + modelViewMatrix.toString() + "\n" + - // "Mc Proj: \n" + projectionMatrix.toString() - //); + ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, renderContext.world()); - this.clientApi.renderLods(ClientLevelWrapper.getWrapper(renderContext.world()), - modelViewMatrix, - projectionMatrix, - #if MC_VER < MC_1_21_1 - renderContext.tickDelta() - #else - renderContext.tickCounter().getGameTimeDeltaTicks() - #endif - ); + this.clientApi.renderLods(); }); WorldRenderEvents.AFTER_ENTITIES.register((renderContext) -> { - Mat4f projectionMatrix = McObjectConverter.Convert(renderContext.projectionMatrix()); + ClientApi.RENDER_STATE.mcProjectionMatrix = McObjectConverter.Convert(renderContext.projectionMatrix()); - Mat4f modelViewMatrix; #if MC_VER < MC_1_20_6 - modelViewMatrix = McObjectConverter.Convert(renderContext.matrixStack().last().pose()); + ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(renderContext.matrixStack().last().pose()); #else - modelViewMatrix = McObjectConverter.Convert(renderContext.positionMatrix()); + ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(renderContext.positionMatrix()); #endif - this.clientApi.renderFadeOpaque( - modelViewMatrix, - projectionMatrix, - #if MC_VER < MC_1_21_1 - renderContext.tickDelta(), - #else - renderContext.tickCounter().getGameTimeDeltaTicks(), - #endif - ClientLevelWrapper.getWrapper(renderContext.world()) - ); + #if MC_VER < MC_1_21_1 + ClientApi.RENDER_STATE.frameTime = renderContext.tickDelta(); + #else + ClientApi.RENDER_STATE.frameTime = renderContext.tickCounter().getGameTimeDeltaTicks(); + #endif + + ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, renderContext.world()); + + + this.clientApi.renderFadeOpaque(); }); - // TODO add to forge and neo WorldRenderEvents.AFTER_TRANSLUCENT.register((renderContext) -> { - Mat4f projectionMatrix = McObjectConverter.Convert(renderContext.projectionMatrix()); + ClientApi.RENDER_STATE.mcProjectionMatrix = McObjectConverter.Convert(renderContext.projectionMatrix()); - Mat4f modelViewMatrix; #if MC_VER < MC_1_20_6 - modelViewMatrix = McObjectConverter.Convert(renderContext.matrixStack().last().pose()); + ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(renderContext.matrixStack().last().pose()); #else - modelViewMatrix = McObjectConverter.Convert(renderContext.positionMatrix()); + ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(renderContext.positionMatrix()); #endif + #if MC_VER < MC_1_21_1 + ClientApi.RENDER_STATE.frameTime = renderContext.tickDelta(); + #else + ClientApi.RENDER_STATE.frameTime = renderContext.tickCounter().getGameTimeDeltaTicks(); + #endif + + ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, renderContext.world()); + + + #if MC_VER < MC_1_21_6 // rendered in MixinLevelRenderer #else - ClientApi.INSTANCE.renderDeferredLodsForShaders(ClientLevelWrapper.getWrapper(renderContext.world()), - ClientApi.RENDER_STATE.mcModelViewMatrix, - ClientApi.RENDER_STATE.mcProjectionMatrix, - ClientApi.RENDER_STATE.frameTime - ); + ClientApi.INSTANCE.renderDeferredLodsForShaders(ClientLevelWrapper.getWrapper(); #endif - this.clientApi.renderFade( - modelViewMatrix, - projectionMatrix, - #if MC_VER < MC_1_21_1 - renderContext.tickDelta(), - #else - renderContext.tickCounter().getGameTimeDeltaTicks(), - #endif - ClientLevelWrapper.getWrapper(renderContext.world()) - ); + this.clientApi.renderFade(); }); #endif 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 new file mode 100644 index 000000000..cefa53e84 --- /dev/null +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinChunkSectionsToRender.java @@ -0,0 +1,71 @@ +/* + * This file is part of the Distant Horizons mod + * licensed under the GNU LGPL v3 License. + * + * Copyright (C) 2020 James Seibel + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +package com.seibel.distanthorizons.fabric.mixins.client; + +#if MC_VER < MC_1_21_9 +import net.minecraft.world.entity.Entity; +import org.spongepowered.asm.mixin.Mixin; + +@Mixin(Entity.class) +public class MixinChunkSectionsToRender +{ /* rendering before was handled via Fabric API events */ } +#else + +import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper; +import com.seibel.distanthorizons.core.api.internal.ClientApi; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.chunk.ChunkSectionLayerGroup; +import net.minecraft.client.renderer.chunk.ChunkSectionsToRender; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(ChunkSectionsToRender.class) +public class MixinChunkSectionsToRender +{ + + + // needs to fire at HEAD otherwise it will be canceled by Sodium + @Inject(at = @At("HEAD"), method = "renderGroup") + private void renderGroup(ChunkSectionLayerGroup chunkSectionLayerGroup, CallbackInfo ci) + { + if (!ClientApi.RENDER_STATE.canRender()) // TODO is this needed? + { + return; + } + + ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, Minecraft.getInstance().levelRenderer.level); + + + if (chunkSectionLayerGroup == ChunkSectionLayerGroup.OPAQUE) + { + ClientApi.INSTANCE.renderFadeOpaque(); + } + else if (chunkSectionLayerGroup == ChunkSectionLayerGroup.TRANSLUCENT) + { + ClientApi.INSTANCE.renderDeferredLodsForShaders(); + } + + } +} + +#endif + diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinDebugScreenOverlay.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinDebugScreenOverlay.java index 34b98e69d..8693548e7 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinDebugScreenOverlay.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinDebugScreenOverlay.java @@ -12,12 +12,15 @@ import java.util.List; @Mixin(DebugScreenOverlay.class) public class MixinDebugScreenOverlay { - + #if MC_VER < MC_1_21_9 @Inject(method = "getSystemInformation", at = @At("RETURN")) private void addCustomF3(CallbackInfoReturnable> cir) { List messages = cir.getReturnValue(); F3Screen.addStringToDisplay(messages); } + #else + // handled by DhDebugScreenEntry for MC versions after 1.21.9 + #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 dc392f810..2baad0235 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 @@ -31,8 +31,19 @@ import com.mojang.blaze3d.vertex.PoseStack; import org.joml.Matrix4f; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; #else +import com.mojang.blaze3d.buffers.GpuBufferSlice; +import com.mojang.blaze3d.framegraph.FrameGraphBuilder; +import com.mojang.blaze3d.resource.GraphicsResourceAllocator; +import net.minecraft.client.Camera; +import net.minecraft.client.DeltaTracker; import net.minecraft.client.renderer.chunk.ChunkSectionsToRender; +import net.minecraft.client.renderer.culling.Frustum; +import net.minecraft.client.renderer.state.LevelRenderState; +import net.minecraft.util.profiling.ProfilerFiller; +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; #endif @@ -41,11 +52,9 @@ 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.coreapi.ModInfo; -import com.seibel.distanthorizons.fabric.FabricClientProxy; import com.seibel.distanthorizons.core.util.math.Mat4f; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import net.minecraft.client.Minecraft; -import com.seibel.distanthorizons.core.config.Config; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.LevelRenderer; import org.spongepowered.asm.mixin.Mixin; @@ -57,6 +66,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.apache.logging.log4j.Logger; + @Mixin(LevelRenderer.class) public class MixinLevelRenderer { @@ -92,9 +102,16 @@ public class MixinLevelRenderer 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 + #elif MC_VER < MC_1_21_9 @Inject(at = @At("HEAD"), method = "prepareChunkRenders", cancellable = true) private void prepareChunkRenders(Matrix4fc projectionMatrix, double d, double e, double f, CallbackInfoReturnable callback) + #else + @Inject(at = @At("HEAD"), method = "renderLevel") + private void renderLevel( + GraphicsResourceAllocator resourceAllocator, DeltaTracker deltaTracker, + boolean renderBlockOutline, Camera camera, + Matrix4f positionMatrix, Matrix4f projectionMatrix, Matrix4f idkMatrix, GpuBufferSlice gpuBufferSlice, + Vector4f skyColor, boolean thinFog, CallbackInfo callback) #endif { #if MC_VER == MC_1_16_5 @@ -110,11 +127,14 @@ public class MixinLevelRenderer // get the matrices directly from MC ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrixStack.last().pose()); ClientApi.RENDER_STATE.mcProjectionMatrix = McObjectConverter.Convert(projectionMatrix); - #else - // MC combined the model view and projection matricies + #elif MC_VER < MC_1_21_9 + // MC combined the model view and projection matricies ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(projectionMatrix); ClientApi.RENDER_STATE.mcProjectionMatrix = new Mat4f(); ClientApi.RENDER_STATE.mcProjectionMatrix.setIdentity(); + #else + ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(positionMatrix); + ClientApi.RENDER_STATE.mcProjectionMatrix = McObjectConverter.Convert(projectionMatrix); #endif // TODO move this into a common place @@ -126,28 +146,61 @@ public class MixinLevelRenderer ClientApi.RENDER_STATE.frameTime = Minecraft.getInstance().deltaTracker.getRealtimeDeltaTicks(); #endif + ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, this.level); - //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.renderDeferredLodsForShaders(ClientLevelWrapper.getWrapper(this.level), - ClientApi.RENDER_STATE.mcModelViewMatrix, - ClientApi.RENDER_STATE.mcProjectionMatrix, - ClientApi.RENDER_STATE.frameTime - ); + ClientApi.INSTANCE.renderDeferredLodsForShaders(); } + #elif MC_VER < MC_1_21_9 + // rendering handled via Fabric Api render event #else - // rendering handled via Fabric Api render event + // handled here and in MixinChunkSectionsToRender #endif } + #if MC_VER < MC_1_21_6 + // rendering handled via Fabric Api render event + #else + @Inject(at = @At("HEAD"), method = "prepareChunkRenders") + private void prepareChunkRenders(Matrix4fc modelViewMatrix, double d, double e, double f, CallbackInfoReturnable callback) + { + ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrix); + ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, this.level); + + // only crash during development + if (ModInfo.IS_DEV_BUILD) + { + ClientApi.RENDER_STATE.canRenderOrThrow(); + } + + ClientApi.INSTANCE.renderLods(); + + } + + @Inject(at = @At("RETURN"), method = "renderLevel") + private void postRenderLevel(GraphicsResourceAllocator graphicsResourceAllocator, DeltaTracker deltaTracker, boolean bl, Camera camera, Matrix4f matrix4f, Matrix4f matrix4f2, Matrix4f matrix4f3, GpuBufferSlice gpuBufferSlice, Vector4f vector4f, boolean bl2, CallbackInfo ci) + { + ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, this.level); + ClientApi.RENDER_STATE.frameTime = deltaTracker.getGameTimeDeltaTicks(); + + // only crash during development + if (ModInfo.IS_DEV_BUILD) + { + ClientApi.RENDER_STATE.canRenderOrThrow(); + } + + ClientApi.INSTANCE.renderFade(); + + } + + #endif + + + } diff --git a/fabric/src/main/resources/DistantHorizons.fabric.mixins.json b/fabric/src/main/resources/DistantHorizons.fabric.mixins.json index c4796b42d..dca9096a5 100644 --- a/fabric/src/main/resources/DistantHorizons.fabric.mixins.json +++ b/fabric/src/main/resources/DistantHorizons.fabric.mixins.json @@ -17,6 +17,7 @@ "client.MixinDebugScreenOverlay", "client.MixinFogRenderer", "client.MixinLevelRenderer", + "client.MixinChunkSectionsToRender", "client.MixinLightTexture", "client.MixinMinecraft", "client.MixinOptionsScreen", diff --git a/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinLevelRenderer.java b/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinLevelRenderer.java index f48cc2d67..b9cef5dc3 100644 --- a/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinLevelRenderer.java +++ b/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinLevelRenderer.java @@ -129,34 +129,35 @@ public class MixinLevelRenderer // 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(); + ClientApi.RENDER_STATE.mcProjectionMatrix = new Mat4f(mcProjMatrixRaw); + ClientApi.RENDER_STATE.mcProjectionMatrix.transpose(); - Mat4f mcModelViewMatrix = McObjectConverter.Convert(matrixStackIn.last().pose()); + ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(matrixStackIn.last().pose()); #else // get the matrices directly from MC - Mat4f mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrixStack.last().pose()); - Mat4f mcProjectionMatrix = McObjectConverter.Convert(projectionMatrix); + ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrixStack.last().pose()); + ClientApi.RENDER_STATE.mcProjectionMatrix = McObjectConverter.Convert(projectionMatrix); #endif - float frameTime; #if MC_VER < MC_1_21_1 - frameTime = Minecraft.getInstance().getFrameTime(); + ClientApi.RENDER_STATE.frameTime = Minecraft.getInstance().getFrameTime(); #else - frameTime = Minecraft.getInstance().getTimer().getRealtimeDeltaTicks(); + ClientApi.RENDER_STATE.frameTime = Minecraft.getInstance().getTimer().getRealtimeDeltaTicks(); #endif + ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, this.level); + // only render before solid blocks if (renderType.equals(RenderType.solid())) { - ClientApi.INSTANCE.renderLods(ClientLevelWrapper.getWrapper(this.level), mcModelViewMatrix, mcProjectionMatrix, frameTime); + ClientApi.INSTANCE.renderLods(); } else if (renderType.equals(RenderType.translucent())) { - ClientApi.INSTANCE.renderDeferredLodsForShaders(ClientLevelWrapper.getWrapper(this.level), mcModelViewMatrix, mcProjectionMatrix, frameTime); + ClientApi.INSTANCE.renderDeferredLodsForShaders(); } // render fade @@ -165,21 +166,11 @@ public class MixinLevelRenderer // we need to trigger for the renderType after those passes are done if (renderType.equals(RenderType.cutout())) { - ClientApi.INSTANCE.renderFadeOpaque( - mcModelViewMatrix, - mcProjectionMatrix, - frameTime, - ClientLevelWrapper.getWrapper(this.level) - ); + ClientApi.INSTANCE.renderFadeOpaque(); } else if (renderType.equals(RenderType.tripwire())) { - ClientApi.INSTANCE.renderFade( - mcModelViewMatrix, - mcProjectionMatrix, - frameTime, - ClientLevelWrapper.getWrapper(this.level) - ); + ClientApi.INSTANCE.renderFade(); } } 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 39608b9be..b1fb05bc0 100644 --- a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeClientProxy.java +++ b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeClientProxy.java @@ -251,17 +251,12 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy public void afterLevelEntityRenderEvent(RenderLevelStageEvent.AfterEntities event) { #if MC_VER < MC_1_21_9 - IClientLevelWrapper levelWrapper = ClientLevelWrapper.getWrapper((ClientLevel)event.getLevel()); + ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, (ClientLevel)event.getLevel()); #else - IClientLevelWrapper levelWrapper = ClientLevelWrapper.getWrapper(event.getLevelRenderer().level); + ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, event.getLevelRenderer().level); #endif - ClientApi.INSTANCE.renderFade( - ClientApi.RENDER_STATE.mcModelViewMatrix, - ClientApi.RENDER_STATE.mcProjectionMatrix, - ClientApi.RENDER_STATE.frameTime, - levelWrapper - ); + ClientApi.INSTANCE.renderFade(); } @@ -269,26 +264,21 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy public void afterLevelTranslucentRenderEvent(RenderLevelStageEvent.AfterTranslucentBlocks event) { #if MC_VER < MC_1_21_9 - IClientLevelWrapper levelWrapper = ClientLevelWrapper.getWrapper((ClientLevel)event.getLevel()); + ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, (ClientLevel)event.getLevel()); #else - IClientLevelWrapper levelWrapper = ClientLevelWrapper.getWrapper(event.getLevelRenderer().level); + ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, event.getLevelRenderer().level); #endif - ClientApi.INSTANCE.renderDeferredLodsForShaders( - levelWrapper, - ClientApi.RENDER_STATE.mcModelViewMatrix, - ClientApi.RENDER_STATE.mcProjectionMatrix, - ClientApi.RENDER_STATE.frameTime - ); + ClientApi.INSTANCE.renderDeferredLodsForShaders(); } @SubscribeEvent public void afterLevelRenderEvent(RenderLevelStageEvent.AfterLevel event) { #if MC_VER < MC_1_21_9 - IClientLevelWrapper levelWrapper = ClientLevelWrapper.getWrapper((ClientLevel)event.getLevel()); + ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, (ClientLevel)event.getLevel()); #else - IClientLevelWrapper levelWrapper = ClientLevelWrapper.getWrapper(event.getLevelRenderer().level); + ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, event.getLevelRenderer().level); #endif @@ -305,24 +295,11 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy } - ClientApi.INSTANCE.renderFadeOpaque( - ClientApi.RENDER_STATE.mcModelViewMatrix, - ClientApi.RENDER_STATE.mcProjectionMatrix, - ClientApi.RENDER_STATE.frameTime, - levelWrapper - ); + ClientApi.INSTANCE.renderFadeOpaque(); } #endif - //================// - // helper methods // - //================// - - private static LevelAccessor GetEventLevel(LevelEvent e) { return e.getLevel(); } - - - } 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 d501bc024..c3a4395d9 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 @@ -66,15 +66,6 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -/** - * This class is used to mix in DH's rendering code - * before Minecraft starts rendering blocks. - * If this wasn't done, and we used Forge's - * render last event, the LODs would render on top - * of the normal terrain.

- * - * This is also the mixin for rendering the clouds - */ @Mixin(LevelRenderer.class) public class MixinLevelRenderer { @@ -90,17 +81,17 @@ public class MixinLevelRenderer #if MC_VER < MC_1_21_6 - @Inject(at = @At("HEAD"), method = "renderSectionLayer", cancellable = true) + @Inject(at = @At("HEAD"), method = "renderSectionLayer") private void renderChunkLayer(RenderType renderType, double x, double y, double z, Matrix4f modelViewMatrix, Matrix4f projectionMatrix, CallbackInfo callback) #elif MC_VER < MC_1_21_9 - @Inject(at = @At("HEAD"), method = "renderLevel", cancellable = true) + @Inject(at = @At("HEAD"), method = "renderLevel") private void onRenderLevel( GraphicsResourceAllocator resourceAllocator, DeltaTracker deltaTracker, boolean renderBlockOutline, Camera camera, Matrix4f positionMatrix, Matrix4f projectionMatrix, GpuBufferSlice gpuBufferSlice, Vector4f skyColor, boolean thinFog, CallbackInfo callback) #else - @Inject(at = @At("HEAD"), method = "renderLevel", cancellable = true) + @Inject(at = @At("HEAD"), method = "renderLevel") private void renderLevel( GraphicsResourceAllocator resourceAllocator, DeltaTracker deltaTracker, boolean renderBlockOutline, Camera camera, @@ -116,12 +107,6 @@ public class MixinLevelRenderer ClientApi.RENDER_STATE.mcProjectionMatrix = McObjectConverter.Convert(projectionMatrix); #endif - //LOGGER.info("\n\n" + - // "Level Mixin\n" + - // "Mc MVM: \n" + ClientApi.RENDER_STATE.mcModelViewMatrix.toString() + "\n" + - // "Mc Proj: \n" + ClientApi.RENDER_STATE.mcProjectionMatrix.toString() - //); - #if MC_VER < MC_1_21_1 @@ -132,6 +117,8 @@ public class MixinLevelRenderer ClientApi.RENDER_STATE.frameTime = Minecraft.getInstance().deltaTracker.getRealtimeDeltaTicks(); #endif + ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, this.level); + #if MC_VER < MC_1_21_6 @@ -144,17 +131,11 @@ public class MixinLevelRenderer // render LODs if (renderType.equals(RenderType.solid())) { - ClientApi.INSTANCE.renderLods(ClientLevelWrapper.getWrapper(this.level), - ClientApi.RENDER_STATE.mcModelViewMatrix, - ClientApi.RENDER_STATE.mcProjectionMatrix, - ClientApi.RENDER_STATE.frameTime); + ClientApi.INSTANCE.renderLods(); } else if (renderType.equals(RenderType.translucent())) { - ClientApi.INSTANCE.renderDeferredLodsForShaders(ClientLevelWrapper.getWrapper(this.level), - ClientApi.RENDER_STATE.mcModelViewMatrix, - ClientApi.RENDER_STATE.mcProjectionMatrix, - ClientApi.RENDER_STATE.frameTime); + ClientApi.INSTANCE.renderDeferredLodsForShaders(); } // render fade @@ -163,21 +144,11 @@ public class MixinLevelRenderer // we need to trigger for the renderType after those passes are done if (renderType.equals(RenderType.cutout())) { - ClientApi.INSTANCE.renderFadeOpaque( - ClientApi.RENDER_STATE.mcModelViewMatrix, - ClientApi.RENDER_STATE.mcProjectionMatrix, - ClientApi.RENDER_STATE.frameTime, - ClientLevelWrapper.getWrapper(this.level) - ); + ClientApi.INSTANCE.renderFadeOpaque(); } else if (renderType.equals(RenderType.tripwire())) { - ClientApi.INSTANCE.renderFade( - ClientApi.RENDER_STATE.mcModelViewMatrix, - ClientApi.RENDER_STATE.mcProjectionMatrix, - ClientApi.RENDER_STATE.frameTime, - ClientLevelWrapper.getWrapper(this.level) - ); + ClientApi.INSTANCE.renderFade(); } #endif } @@ -188,21 +159,19 @@ public class MixinLevelRenderer // formerly handled in renderChunkLayer() #else - @Inject(at = @At("HEAD"), method = "prepareChunkRenders", cancellable = true) + @Inject(at = @At("HEAD"), method = "prepareChunkRenders") private void renderChunkLayer(Matrix4fc modelViewMatrix, double d, double e, double f, CallbackInfoReturnable callback) { ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrix); - + ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, this.level); + // only crash during development if (ModInfo.IS_DEV_BUILD) { ClientApi.RENDER_STATE.canRenderOrThrow(); } - ClientApi.INSTANCE.renderLods(ClientLevelWrapper.getWrapper(this.level), - ClientApi.RENDER_STATE.mcModelViewMatrix, - ClientApi.RENDER_STATE.mcProjectionMatrix, - ClientApi.RENDER_STATE.frameTime); + ClientApi.INSTANCE.renderLods(); } #endif diff --git a/versionProperties/1.21.9.properties b/versionProperties/1.21.9.properties index 9e5af2beb..cf250a53f 100644 --- a/versionProperties/1.21.9.properties +++ b/versionProperties/1.21.9.properties @@ -12,8 +12,8 @@ netty_version=4.1.97.Final # Fabric loader fabric_loader_version=0.17.2 -fabric_api_version=0.133.14+1.21.9 - modmenu_version=15.0.0 +fabric_api_version=0.134.0+1.21.9 + modmenu_version=16.0.0-rc.1 starlight_version_fabric= phosphor_version_fabric= lithium_version=