From 526791aae7526378ee11fac2efac0a7d1457f5cd Mon Sep 17 00:00:00 2001 From: TomTheFurry Date: Sat, 9 Apr 2022 13:58:02 +0800 Subject: [PATCH] Fix 1.16 forge --- .../lod/fabric/mixins/MixinFogRenderer.java | 45 ++++++-------- .../lod/forge/mixins/MixinChunkGenerator.java | 58 +++++++++++++++++++ .../lod/forge/mixins/MixinFogRenderer.java | 47 +++++++-------- .../mixins/MixinUtilBackgroudThread.java | 7 ++- .../lod/forge/mixins/MixinWorldRenderer.java | 34 ++++++++++- forge/src/main/resources/lod.mixins.json | 3 +- 6 files changed, 137 insertions(+), 57 deletions(-) create mode 100644 forge/src/main/java/com/seibel/lod/forge/mixins/MixinChunkGenerator.java diff --git a/fabric/src/main/java/com/seibel/lod/fabric/mixins/MixinFogRenderer.java b/fabric/src/main/java/com/seibel/lod/fabric/mixins/MixinFogRenderer.java index b1cf78a2e..66c27961a 100644 --- a/fabric/src/main/java/com/seibel/lod/fabric/mixins/MixinFogRenderer.java +++ b/fabric/src/main/java/com/seibel/lod/fabric/mixins/MixinFogRenderer.java @@ -35,7 +35,6 @@ import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; #if MC_VERSION_1_16_5 -import net.minecraft.tags.FluidTags; import net.minecraft.world.level.material.FluidState; #else import net.minecraft.world.level.material.FogType; @@ -49,37 +48,29 @@ public class MixinFogRenderer { private static final float A_REALLY_REALLY_BIG_VALUE = 420694206942069.F; private static final float A_EVEN_LARGER_VALUE = 42069420694206942069.F; - #if MC_VERSION_1_16_5 - @Inject(at = @At("RETURN"), method = "setupFog(Lnet/minecraft/client/Camera;Lnet/minecraft/client/renderer/FogRenderer$FogMode;FZ)V") private static void disableSetupFog(Camera camera, FogMode fogMode, float f, boolean bl, CallbackInfo callback) { + #if MC_VERSION_1_16_5 FluidState fluidState = camera.getFluidInCamera(); - Entity entity = camera.getEntity(); - boolean isUnderWater = (entity instanceof LivingEntity) && ((LivingEntity)entity).hasEffect(MobEffects.BLINDNESS); - isUnderWater |= fluidState.is(FluidTags.WATER); - isUnderWater |= fluidState.is(FluidTags.LAVA); + boolean cameraNotInFluid = fluidState.isEmpty(); + #else + FogType fogTypes = camera.getFluidInCamera(); + boolean cameraNotInFluid = fogTypes == FogType.NONE; + #endif - if (!isUnderWater) { - if (fogMode == FogMode.FOG_TERRAIN && CONFIG.client().graphics().fogQuality().getDisableVanillaFog()) { - RenderSystem.fogStart(A_REALLY_REALLY_BIG_VALUE); - RenderSystem.fogEnd(A_EVEN_LARGER_VALUE); - } + Entity entity = camera.getEntity(); + boolean isSpecialFog = (entity instanceof LivingEntity) && ((LivingEntity) entity).hasEffect(MobEffects.BLINDNESS); + if (!isSpecialFog && cameraNotInFluid && fogMode == FogMode.FOG_TERRAIN + && CONFIG.client().graphics().fogQuality().getDisableVanillaFog()) + { + #if MC_VERSION_1_16_5 + RenderSystem.fogStart(A_REALLY_REALLY_BIG_VALUE); + RenderSystem.fogEnd(A_EVEN_LARGER_VALUE); + #else + RenderSystem.setShaderFogStart(A_REALLY_REALLY_BIG_VALUE); + RenderSystem.setShaderFogEnd(A_EVEN_LARGER_VALUE); + #endif } } - #else - @Inject(at = @At("RETURN"), method = "setupFog(Lnet/minecraft/client/Camera;Lnet/minecraft/client/renderer/FogRenderer$FogMode;FZ)V") - private static void disableSetupFog(Camera camera, FogMode fogMode, float f, boolean bl, CallbackInfo callback) { - FogType fogTypes = camera.getFluidInCamera(); - Entity entity = camera.getEntity(); - boolean isUnderWater = (entity instanceof LivingEntity) && ((LivingEntity)entity).hasEffect(MobEffects.BLINDNESS); - if (!isUnderWater) { - if (fogMode == FogMode.FOG_TERRAIN && fogTypes == FogType.NONE && CONFIG.client().graphics().fogQuality().getDisableVanillaFog()) { - RenderSystem.setShaderFogStart(A_REALLY_REALLY_BIG_VALUE); - RenderSystem.setShaderFogEnd(A_EVEN_LARGER_VALUE); - } - } - } - #endif - } diff --git a/forge/src/main/java/com/seibel/lod/forge/mixins/MixinChunkGenerator.java b/forge/src/main/java/com/seibel/lod/forge/mixins/MixinChunkGenerator.java new file mode 100644 index 000000000..cc6e3ec94 --- /dev/null +++ b/forge/src/main/java/com/seibel/lod/forge/mixins/MixinChunkGenerator.java @@ -0,0 +1,58 @@ +/* + * This file is part of the Distant Horizons mod (formerly the LOD Mod), + * licensed under the GNU GPL v3 License. + * + * Copyright (C) 2020-2022 James Seibel + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.seibel.lod.forge.mixins; + +import com.seibel.lod.core.api.ApiShared; +import org.spongepowered.asm.mixin.Mixin; +import net.minecraft.world.level.chunk.ChunkGenerator; + +#if MC_VERSION_1_16_5 || MC_VERSION_1_17_1 +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.WorldGenRegion; +import net.minecraft.world.level.StructureFeatureManager; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.levelgen.WorldgenRandom; + +@Mixin(ChunkGenerator.class) +public class MixinChunkGenerator { + @Redirect(method = "applyBiomeDecoration", at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/level/biome/Biome;generate(Lnet/minecraft/world/level/StructureFeatureManager;" + + "Lnet/minecraft/world/level/chunk/ChunkGenerator;Lnet/minecraft/server/level/WorldGenRegion;J" + + "Lnet/minecraft/world/level/levelgen/WorldgenRandom;Lnet/minecraft/core/BlockPos;)V" + + )) + private void wrapBiomeGenerateCall(Biome biome, StructureFeatureManager structFeatManager, ChunkGenerator generator, + WorldGenRegion genRegion, long l, WorldgenRandom random, BlockPos pos) { + synchronized(ChunkGenerator.class) { + //ApiShared.LOGGER.info("Generating Biome {} and acquired lock.", biome.getRegistryName()); + biome.generate(structFeatManager, (ChunkGenerator)(Object)this, genRegion, l, random, pos); + } + //ApiShared.LOGGER.info("Released lock. Biome {} generated.", biome.getRegistryName()); + } +} + +#else +@Mixin(ChunkGenerator.class) +public class MixinChunkGenerator {} +#endif \ No newline at end of file diff --git a/forge/src/main/java/com/seibel/lod/forge/mixins/MixinFogRenderer.java b/forge/src/main/java/com/seibel/lod/forge/mixins/MixinFogRenderer.java index 01a45bf91..6d9c64b1e 100644 --- a/forge/src/main/java/com/seibel/lod/forge/mixins/MixinFogRenderer.java +++ b/forge/src/main/java/com/seibel/lod/forge/mixins/MixinFogRenderer.java @@ -19,7 +19,6 @@ package com.seibel.lod.forge.mixins; -import net.minecraft.world.level.material.FluidState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -35,23 +34,25 @@ import net.minecraft.client.renderer.FogRenderer.FogMode; import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; - -#if MC_VERSION_1_18_1 || MC_VERSION_1_18_2 || MC_VERSION_1_17_1 +#if MC_VERSION_1_16_5 +import net.minecraft.world.level.material.FluidState; +#else import net.minecraft.world.level.material.FogType; #endif + @Mixin(FogRenderer.class) public class MixinFogRenderer { // Using this instead of Float.MAX_VALUE because Sodium don't like it. (and copy paste in case someone in forge don't like it) - private static final float A_REALLY_REALLY_BIG_VALUE = 420694206942069.F; - private static final float A_EVEN_LARGER_VALUE = 42069420694206942069.F; + private static final float A_REALLY_REALLY_BIG_VALUE = 4206942069.F; + private static final float A_EVEN_LARGER_VALUE = 420694206942069.F; @Inject(at = @At("RETURN"), method = "setupFog(Lnet/minecraft/client/Camera;Lnet/minecraft/client/renderer/FogRenderer$FogMode;FZF)V", - remap = false) // Remap = false due to this being added by forge. + remap = #if MC_VERSION_1_16_5 true #else false #endif) // Remap = false messiness due to this being added by forge. private static void disableSetupFog(Camera camera, FogMode fogMode, float f, boolean bl, float partTick, CallbackInfo callback) { ILodConfigWrapperSingleton CONFIG; @@ -63,31 +64,27 @@ public class MixinFogRenderer { return; // May happen due to forge for some reason haven't inited out thingy yet. } - - - - #if MC_VERSION_1_18_1 || MC_VERSION_1_18_2 || MC_VERSION_1_17_1 + + #if MC_VERSION_1_16_5 + FluidState fluidState = camera.getFluidInCamera(); + boolean cameraNotInFluid = fluidState.isEmpty(); + #else FogType fogTypes = camera.getFluidInCamera(); boolean cameraNotInFluid = fogTypes == FogType.NONE; - #else - FluidState fluidState = camera.getFluidInCamera(); - boolean cameraNotInFluid = !fluidState.isEmpty(); #endif Entity entity = camera.getEntity(); - boolean isUnderWater = (entity instanceof LivingEntity) && ((LivingEntity) entity).hasEffect(MobEffects.BLINDNESS); - if (!isUnderWater) + boolean isSpecialFog = (entity instanceof LivingEntity) && ((LivingEntity) entity).hasEffect(MobEffects.BLINDNESS); + if (!isSpecialFog && cameraNotInFluid && fogMode == FogMode.FOG_TERRAIN + && CONFIG.client().graphics().fogQuality().getDisableVanillaFog()) { - if (fogMode == FogMode.FOG_TERRAIN && cameraNotInFluid && CONFIG.client().graphics().fogQuality().getDisableVanillaFog()) - { - #if MC_VERSION_1_18_1 || MC_VERSION_1_18_2 || MC_VERSION_1_17_1 - RenderSystem.setShaderFogStart(A_REALLY_REALLY_BIG_VALUE); - RenderSystem.setShaderFogEnd(A_EVEN_LARGER_VALUE); - #else - RenderSystem.fogStart(A_REALLY_REALLY_BIG_VALUE); - RenderSystem.fogEnd(A_EVEN_LARGER_VALUE); - #endif - } + #if MC_VERSION_1_16_5 + RenderSystem.fogStart(A_REALLY_REALLY_BIG_VALUE); + RenderSystem.fogEnd(A_EVEN_LARGER_VALUE); + #else + RenderSystem.setShaderFogStart(A_REALLY_REALLY_BIG_VALUE); + RenderSystem.setShaderFogEnd(A_EVEN_LARGER_VALUE); + #endif } } } diff --git a/forge/src/main/java/com/seibel/lod/forge/mixins/MixinUtilBackgroudThread.java b/forge/src/main/java/com/seibel/lod/forge/mixins/MixinUtilBackgroudThread.java index 46449167c..b93e16e8f 100644 --- a/forge/src/main/java/com/seibel/lod/forge/mixins/MixinUtilBackgroudThread.java +++ b/forge/src/main/java/com/seibel/lod/forge/mixins/MixinUtilBackgroudThread.java @@ -39,8 +39,8 @@ public class MixinUtilBackgroudThread private static boolean shouldApplyOverride() { return DependencySetupDoneCheck.getIsCurrentThreadDistantGeneratorThread.get(); } - - + + #if !MC_VERSION_1_16_5 @Inject(method = "wrapThreadWithTaskName(Ljava/lang/String;Ljava/lang/Runnable;)Ljava/lang/Runnable;", at = @At("HEAD"), cancellable = true) private static void overrideUtil$wrapThreadWithTaskName(String string, Runnable r, CallbackInfoReturnable ci) @@ -51,6 +51,7 @@ public class MixinUtilBackgroudThread ci.setReturnValue(r); } } + #endif #if MC_VERSION_1_18_1 || MC_VERSION_1_18_2 @Inject(method = "wrapThreadWithTaskName(Ljava/lang/String;Ljava/util/function/Supplier;)Ljava/util/function/Supplier;", at = @At("HEAD"), cancellable = true) @@ -63,7 +64,7 @@ public class MixinUtilBackgroudThread } } #endif - + @Inject(method = "backgroundExecutor", at = @At("HEAD"), cancellable = true) private static void overrideUtil$backgroundExecutor(CallbackInfoReturnable ci) { diff --git a/forge/src/main/java/com/seibel/lod/forge/mixins/MixinWorldRenderer.java b/forge/src/main/java/com/seibel/lod/forge/mixins/MixinWorldRenderer.java index c2b74109b..929255903 100644 --- a/forge/src/main/java/com/seibel/lod/forge/mixins/MixinWorldRenderer.java +++ b/forge/src/main/java/com/seibel/lod/forge/mixins/MixinWorldRenderer.java @@ -27,6 +27,7 @@ import com.seibel.lod.core.api.ClientApi; import com.seibel.lod.core.objects.math.Mat4f; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.RenderType; +import org.lwjgl.opengl.GL15; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -54,6 +55,37 @@ public class MixinWorldRenderer throw new NullPointerException("Null cannot be cast to non-null type."); } + #if MC_VERSION_1_16_5 + @Inject(at = @At("RETURN"), method = "renderSky(Lcom/mojang/blaze3d/vertex/PoseStack;F)V") + private void renderSky(PoseStack matrixStackIn, float partialTicks, CallbackInfo callback) + { + // get the partial ticks since renderBlockLayer doesn't + // have access to them + previousPartialTicks = partialTicks; + } + + @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) + { + // only render before solid blocks + if (renderType.equals(RenderType.solid())) + { + // get MC's current projection matrix + 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()); + + ClientApi.INSTANCE.renderLods(mcModelViewMatrix, mcProjectionMatrix, previousPartialTicks); + } + if (Config.Client.Advanced.lodOnlyMode) { + callback.cancel(); + } + } + #else @Inject(method = "renderClouds", at = @At("HEAD"), cancellable = true) public void renderClouds(PoseStack poseStack, Matrix4f projectionMatrix, float tickDelta, double cameraX, double cameraY, double cameraZ, CallbackInfo ci) { // get the partial ticks since renderChunkLayer doesn't @@ -61,7 +93,6 @@ public class MixinWorldRenderer previousPartialTicks = tickDelta; } - // HEAD or RETURN @Inject(at = @At("HEAD"), method = "renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLcom/mojang/math/Matrix4f;)V", cancellable = true) @@ -79,4 +110,5 @@ public class MixinWorldRenderer callback.cancel(); } } + #endif } diff --git a/forge/src/main/resources/lod.mixins.json b/forge/src/main/resources/lod.mixins.json index 397a72e89..52fc11c53 100644 --- a/forge/src/main/resources/lod.mixins.json +++ b/forge/src/main/resources/lod.mixins.json @@ -3,12 +3,13 @@ "minVersion": "0.8", "package": "com.seibel.lod.forge.mixins", "mixins": [ - "MixinUtilBackgroudThread", + "MixinUtilBackgroudThread" ], "client": [ "MixinOptionsScreen", "MixinWorldRenderer", "MixinFogRenderer", + "MixinChunkGenerator" ], "server": [] }