From 6d7bade7ca9e90afff1705d51bc1334e94da21a1 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sat, 11 Apr 2026 12:09:15 -0500 Subject: [PATCH] fix neoforge rendering on MC 26 --- .../client/MixinChunkSectionsToRender.java | 3 +- .../neoforge/NeoforgeClientProxy.java | 14 +-- .../client/MixinChunkSectionsToRender.java | 86 +++++++++++++++++++ .../mixins/client/MixinLevelRenderer.java | 22 +---- .../DistantHorizons.neoforge.mixins.json | 1 + 5 files changed, 99 insertions(+), 27 deletions(-) create mode 100644 neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinChunkSectionsToRender.java 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 ebd7c81e5..4c9791bdc 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 @@ -50,8 +50,8 @@ public class MixinChunkSectionsToRender //===========// // Pre MC 26 // //===========// - //regino #if MC_VER <= MC_1_21_11 + //region #if MC_VER <= MC_1_21_10 // needs to fire at HEAD with a lower than normal order (less than 1000) @@ -78,7 +78,6 @@ public class MixinChunkSectionsToRender ClientApi.INSTANCE.renderFadeTransparent(); } } - //endregion #else 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 883705665..741d7732b 100644 --- a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeClientProxy.java +++ b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeClientProxy.java @@ -228,8 +228,10 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy { #if MC_VER < MC_1_21_9 ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, (ClientLevel)event.getLevel()); - #else + #elif MC_VER <= MC_1_21_11 ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, event.getLevelRenderer().level); + #else + // handled via the same mixin as fabric for consistency #endif ClientApi.INSTANCE.renderFadeOpaque(); @@ -241,11 +243,11 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy { #if MC_VER < MC_1_21_9 ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, (ClientLevel)event.getLevel()); - #else + #elif MC_VER <= MC_1_21_11 ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, event.getLevelRenderer().level); + #else + // handled via the same mixin as fabric for consistency #endif - - ClientApi.INSTANCE.renderDeferredLodsForShaders(); } @SubscribeEvent @@ -253,8 +255,10 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy { #if MC_VER < MC_1_21_9 ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, (ClientLevel)event.getLevel()); - #else + #elif MC_VER <= MC_1_21_11 ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, event.getLevelRenderer().level); + #else + // handled via the same mixin as fabric for consistency #endif diff --git a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinChunkSectionsToRender.java b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinChunkSectionsToRender.java new file mode 100644 index 000000000..0f53b8806 --- /dev/null +++ b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinChunkSectionsToRender.java @@ -0,0 +1,86 @@ +/* + * 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.neoforge.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.mojang.blaze3d.textures.GpuSampler; +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; + +#if MC_VER <= MC_1_21_10 +#else +#endif + +@Mixin(ChunkSectionsToRender.class) +public class MixinChunkSectionsToRender +{ + + //============// + // post MC 26 // + //============// + //region + + #if MC_VER <= MC_1_21_11 + #else + + // 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.renderLods(); + } + } + + //endregion + #endif + + + +} + +#endif + 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 70235a6c0..1a466e2e1 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 @@ -44,8 +44,10 @@ import com.mojang.blaze3d.resource.GraphicsResourceAllocator; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; #else +import com.mojang.blaze3d.textures.GpuSampler; import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftRenderWrapper; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.chunk.ChunkSectionLayerGroup; import net.minecraft.client.renderer.chunk.ChunkSectionsToRender; import net.minecraft.client.Camera; import net.minecraft.client.DeltaTracker; @@ -223,26 +225,6 @@ public class MixinLevelRenderer } - @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/resources/DistantHorizons.neoforge.mixins.json b/neoforge/src/main/resources/DistantHorizons.neoforge.mixins.json index eeb186623..c4b8d8d3c 100644 --- a/neoforge/src/main/resources/DistantHorizons.neoforge.mixins.json +++ b/neoforge/src/main/resources/DistantHorizons.neoforge.mixins.json @@ -15,6 +15,7 @@ "client.MixinClientPacketListener", "client.MixinDebugScreenOverlay", "client.MixinFogRenderer", + "client.MixinChunkSectionsToRender", "client.MixinGameRenderer", "client.MixinLevelRenderer", "client.MixinLightTexture",