From 63d8c72abb86e08994aefc788a140b012b1672a1 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Tue, 28 Jan 2025 09:42:30 -0500 Subject: [PATCH] Rewrite biome coloring to not require rendering mod patches (#2773) --- .../EnvironmentalHazardClientHandler.java | 6 +-- .../gtceu/core/mixins/BiomeColorsMixin.java | 52 ++++++++++++++++++ .../gtceu/core/mixins/BlockColorsMixin.java | 53 ------------------ .../core/mixins/GregTechMixinPlugin.java | 2 - .../embeddium/BiomeColorCacheMixin.java | 43 --------------- .../embeddium/VanillaColorAdapterMixin.java | 54 ------------------- src/main/resources/gtceu.mixins.json | 4 +- 7 files changed, 56 insertions(+), 158 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/BiomeColorsMixin.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/BlockColorsMixin.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BiomeColorCacheMixin.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/VanillaColorAdapterMixin.java diff --git a/src/main/java/com/gregtechceu/gtceu/client/EnvironmentalHazardClientHandler.java b/src/main/java/com/gregtechceu/gtceu/client/EnvironmentalHazardClientHandler.java index a5a8682fb6..27e985f52e 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/EnvironmentalHazardClientHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/client/EnvironmentalHazardClientHandler.java @@ -19,8 +19,8 @@ import it.unimi.dsi.fastutil.floats.FloatIntPair; import lombok.Getter; -import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; @OnlyIn(Dist.CLIENT) public class EnvironmentalHazardClientHandler { @@ -44,8 +44,8 @@ private EnvironmentalHazardClientHandler() { * Map of source position to a triple of (trigger, material). */ @Getter - private final Map hazardZones = new HashMap<>(); - private final Map chunkColorCache = new HashMap<>(); + private final Map hazardZones = new ConcurrentHashMap<>(); + private final Map chunkColorCache = new ConcurrentHashMap<>(); public void onClientTick() { if (!ConfigHolder.INSTANCE.gameplay.environmentalHazards) { diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/BiomeColorsMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/BiomeColorsMixin.java new file mode 100644 index 0000000000..b5cc30f666 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/BiomeColorsMixin.java @@ -0,0 +1,52 @@ +package com.gregtechceu.gtceu.core.mixins; + +import com.gregtechceu.gtceu.client.EnvironmentalHazardClientHandler; +import com.gregtechceu.gtceu.config.ConfigHolder; + +import net.minecraft.client.renderer.BiomeColors; +import net.minecraft.core.SectionPos; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.ColorResolver; + +import org.spongepowered.asm.mixin.*; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(BiomeColors.class) +public class BiomeColorsMixin { + + @Shadow + @Final + @Mutable + public static ColorResolver WATER_COLOR_RESOLVER; + @Shadow + @Final + @Mutable + public static ColorResolver GRASS_COLOR_RESOLVER; + @Shadow + @Final + @Mutable + public static ColorResolver FOLIAGE_COLOR_RESOLVER; + + @Unique + private static ColorResolver gtceu$wrapResolver(ColorResolver resolver) { + return (biome, x, z) -> { + var originalColor = resolver.getColor(biome, x, z); + if (!ConfigHolder.INSTANCE.gameplay.environmentalHazards) { + return originalColor; + } + + var clientHandler = EnvironmentalHazardClientHandler.INSTANCE; + var chunkPos = new ChunkPos(SectionPos.posToSectionCoord(x), SectionPos.posToSectionCoord(z)); + return clientHandler.colorZone(originalColor, chunkPos); + }; + } + + @Inject(method = "", at = @At("RETURN")) + private static void addPollutionWrapper(CallbackInfo ci) { + WATER_COLOR_RESOLVER = gtceu$wrapResolver(WATER_COLOR_RESOLVER); + GRASS_COLOR_RESOLVER = gtceu$wrapResolver(GRASS_COLOR_RESOLVER); + FOLIAGE_COLOR_RESOLVER = gtceu$wrapResolver(FOLIAGE_COLOR_RESOLVER); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/BlockColorsMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/BlockColorsMixin.java deleted file mode 100644 index cddd860b93..0000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/BlockColorsMixin.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.gregtechceu.gtceu.core.mixins; - -import com.gregtechceu.gtceu.client.EnvironmentalHazardClientHandler; -import com.gregtechceu.gtceu.config.ConfigHolder; - -import net.minecraft.client.color.block.BlockColors; -import net.minecraft.core.BlockPos; -import net.minecraft.tags.BlockTags; -import net.minecraft.world.level.BlockAndTintGetter; -import net.minecraft.world.level.ChunkPos; -import net.minecraft.world.level.block.*; -import net.minecraft.world.level.block.state.BlockState; - -import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import org.jetbrains.annotations.Nullable; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -@Mixin(BlockColors.class) -public class BlockColorsMixin { - - @ModifyExpressionValue(method = "getColor(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/BlockAndTintGetter;Lnet/minecraft/core/BlockPos;I)I", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/client/color/block/BlockColor;getColor(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/BlockAndTintGetter;Lnet/minecraft/core/BlockPos;I)I")) - private int gtceu$modifyBiomeAverageColorByHazard(int color, BlockState state, - @Nullable BlockAndTintGetter level, - @Nullable BlockPos pos, - int tintIndex) { - if (!ConfigHolder.INSTANCE.gameplay.environmentalHazards) { - return color; - } - - if (pos == null) { - return color; - } - var clientHandler = EnvironmentalHazardClientHandler.INSTANCE; - ChunkPos chunkPos = new ChunkPos(pos); - - // because spotless decided to be dumb about if statement indentation - // @formatter:off - final Block block = state.getBlock(); - if (block instanceof GrassBlock) { - return clientHandler.colorZone(color, chunkPos); - } else if (state.is(BlockTags.LEAVES) || block instanceof TallGrassBlock || state.is(BlockTags.FLOWERS) || block instanceof DoublePlantBlock) { - return clientHandler.colorZone(color, chunkPos); - } else if (!state.getFluidState().isEmpty()) { - return clientHandler.colorZone(color, chunkPos); - } - // @formatter:on - - return color; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/GregTechMixinPlugin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/GregTechMixinPlugin.java index cb025b32d1..0ad2923f28 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/GregTechMixinPlugin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/GregTechMixinPlugin.java @@ -31,8 +31,6 @@ public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { return MixinPluginShared.isClassFound("mezz.jei.api.IModPlugin"); } else if (mixinClassName.contains("com.gregtechceu.gtceu.core.mixins.emi")) { return MixinPluginShared.isClassFound("dev.emi.emi.api.EmiPlugin"); - } else if (mixinClassName.contains("com.gregtechceu.gtceu.core.mixins.embeddium")) { - return MixinPluginShared.isClassFound("me.jellysquid.mods.sodium.client.SodiumClientMod"); } return true; } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BiomeColorCacheMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BiomeColorCacheMixin.java deleted file mode 100644 index 11d9a0be25..0000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BiomeColorCacheMixin.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.gregtechceu.gtceu.core.mixins.embeddium; - -import com.gregtechceu.gtceu.client.EnvironmentalHazardClientHandler; -import com.gregtechceu.gtceu.config.ConfigHolder; - -import net.minecraft.client.renderer.BiomeColors; -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.ChunkPos; -import net.minecraft.world.level.ColorResolver; - -import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import me.jellysquid.mods.sodium.client.world.biome.BiomeColorCache; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -@Mixin(value = BiomeColorCache.class, remap = false) -public class BiomeColorCacheMixin { - - @ModifyExpressionValue(method = "getColor(Lnet/minecraft/world/level/ColorResolver;III)I", - at = @At(value = "INVOKE", - target = "Lme/jellysquid/mods/sodium/client/util/color/BoxBlur$ColorBuffer;get(II)I")) - private int gtceu$modifyBiomeAverageColorByHazard(int color, - ColorResolver source, int blockX, int blockY, int blockZ) { - if (!ConfigHolder.INSTANCE.gameplay.environmentalHazards) { - return color; - } - - var clientHandler = EnvironmentalHazardClientHandler.INSTANCE; - BlockPos pos = new BlockPos(blockX, blockY, blockZ); - ChunkPos chunkPos = new ChunkPos(pos); - - // because spotless decided to be dumb about if statement indentation - if (source == BiomeColors.GRASS_COLOR_RESOLVER) { - return clientHandler.colorZone(color, chunkPos); - } else if (source == BiomeColors.FOLIAGE_COLOR_RESOLVER) { - return clientHandler.colorZone(color, chunkPos); - } else if (source == BiomeColors.WATER_COLOR_RESOLVER) { - return clientHandler.colorZone(color, chunkPos); - } - - return color; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/VanillaColorAdapterMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/VanillaColorAdapterMixin.java deleted file mode 100644 index 79ac79b384..0000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/VanillaColorAdapterMixin.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.gregtechceu.gtceu.core.mixins.embeddium; - -import com.gregtechceu.gtceu.client.EnvironmentalHazardClientHandler; -import com.gregtechceu.gtceu.config.ConfigHolder; - -import net.minecraft.core.BlockPos; -import net.minecraft.tags.BlockTags; -import net.minecraft.world.level.ChunkPos; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.DoublePlantBlock; -import net.minecraft.world.level.block.GrassBlock; -import net.minecraft.world.level.block.TallGrassBlock; -import net.minecraft.world.level.block.state.BlockState; - -import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import me.jellysquid.mods.sodium.client.model.quad.ModelQuadView; -import me.jellysquid.mods.sodium.client.world.WorldSlice; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -@Mixin(targets = "me.jellysquid.mods.sodium.client.model.color.DefaultColorProviders$VanillaAdapter") -public class VanillaColorAdapterMixin { - - @ModifyExpressionValue(method = "getColors(Lme/jellysquid/mods/sodium/client/world/WorldSlice;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lme/jellysquid/mods/sodium/client/model/quad/ModelQuadView;[I)V", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/client/color/block/BlockColor;getColor(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/BlockAndTintGetter;Lnet/minecraft/core/BlockPos;I)I")) - private int gtceu$modifyBiomeAverageColorByHazard(int color, - WorldSlice view, BlockPos pos, BlockState state, - ModelQuadView quad, int[] output) { - if (!ConfigHolder.INSTANCE.gameplay.environmentalHazards) { - return color; - } - - if (pos == null) { - return color; - } - var clientHandler = EnvironmentalHazardClientHandler.INSTANCE; - ChunkPos chunkPos = new ChunkPos(pos); - - // because spotless decided to be dumb about if statement indentation - // @formatter:off - final Block block = state.getBlock(); - if (block instanceof GrassBlock) { - return clientHandler.colorZone(color, chunkPos); - } else if (state.is(BlockTags.LEAVES) || block instanceof TallGrassBlock || state.is(BlockTags.FLOWERS) || block instanceof DoublePlantBlock) { - return clientHandler.colorZone(color, chunkPos); - } else if (!state.getFluidState().isEmpty()) { - return clientHandler.colorZone(color, chunkPos); - } - // @formatter:on - - return color; - } -} diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index f3d503ca48..e5cbbc33ba 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -6,7 +6,7 @@ "compatibilityLevel": "JAVA_17", "plugin": "com.gregtechceu.gtceu.core.mixins.GregTechMixinPlugin", "client": [ - "BlockColorsMixin", + "BiomeColorsMixin", "BlockModelMixin", "ClientLevelAccessor", "GuiGraphicsAccessor", @@ -64,8 +64,6 @@ "TagManagerMixin", "TagValueAccessor", "ae2.GenericStackInvAccessor", - "embeddium.BiomeColorCacheMixin", - "embeddium.VanillaColorAdapterMixin", "emi.FluidEmiStackMixin", "jei.FluidHelperMixin", "ldlib.SyncUtilsMixin",