Skip to content

Commit

Permalink
Merge pull request #2158 from embeddedt/fix/overwriting-custom-resolver
Browse files Browse the repository at this point in the history
Fall back to non-vertex-specific coloring if mods override color providers
  • Loading branch information
IMS212 authored Dec 4, 2023
2 parents cf1e76b + eb4d68c commit 2b9910e
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import it.unimi.dsi.fastutil.objects.Reference2ReferenceMap;
import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap;
import it.unimi.dsi.fastutil.objects.ReferenceSet;
import me.jellysquid.mods.sodium.client.model.color.interop.BlockColorsExtended;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
Expand All @@ -17,13 +18,17 @@ public class ColorProviderRegistry {
private final Reference2ReferenceMap<Block, ColorProvider<BlockState>> blocks = new Reference2ReferenceOpenHashMap<>();
private final Reference2ReferenceMap<Fluid, ColorProvider<FluidState>> fluids = new Reference2ReferenceOpenHashMap<>();

private final ReferenceSet<Block> overridenBlocks;

public ColorProviderRegistry(BlockColors blockColors) {
var providers = BlockColorsExtended.getProviders(blockColors);

for (var entry : providers.reference2ReferenceEntrySet()) {
this.blocks.put(entry.getKey(), DefaultColorProviders.adapt(entry.getValue()));
}

this.overridenBlocks = BlockColorsExtended.getOverridenVanillaBlocks(blockColors);

this.installOverrides();
}

Expand All @@ -46,6 +51,9 @@ private void installOverrides() {

private void registerBlocks(ColorProvider<BlockState> resolver, Block... blocks) {
for (var block : blocks) {
// Do not register our resolver if the block is overriden
if (this.overridenBlocks.contains(block))
continue;
this.blocks.put(block, resolver);
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package me.jellysquid.mods.sodium.client.model.color.interop;

import it.unimi.dsi.fastutil.objects.Reference2ReferenceMap;
import it.unimi.dsi.fastutil.objects.ReferenceSet;
import net.minecraft.block.Block;
import net.minecraft.client.color.block.BlockColorProvider;
import net.minecraft.client.color.block.BlockColors;
Expand All @@ -10,5 +11,11 @@ static Reference2ReferenceMap<Block, BlockColorProvider> getProviders(BlockColor
return ((BlockColorsExtended) blockColors).sodium$getProviders();
}

static ReferenceSet<Block> getOverridenVanillaBlocks(BlockColors blockColors) {
return ((BlockColorsExtended) blockColors).sodium$getOverridenVanillaBlocks();
}

Reference2ReferenceMap<Block, BlockColorProvider> sodium$getProviders();

ReferenceSet<Block> sodium$getOverridenVanillaBlocks();
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package me.jellysquid.mods.sodium.mixin.core.model.colors;

import it.unimi.dsi.fastutil.objects.Reference2ReferenceMap;
import it.unimi.dsi.fastutil.objects.Reference2ReferenceMaps;
import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap;
import it.unimi.dsi.fastutil.objects.*;
import me.jellysquid.mods.sodium.client.SodiumClientMod;
import me.jellysquid.mods.sodium.client.model.color.interop.BlockColorsExtended;
import net.minecraft.block.Block;
import net.minecraft.client.color.block.BlockColorProvider;
import net.minecraft.client.color.block.BlockColors;
import net.minecraft.registry.Registries;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
Expand All @@ -19,15 +19,28 @@ public class BlockColorsMixin implements BlockColorsExtended {
@Unique
private final Reference2ReferenceMap<Block, BlockColorProvider> blocksToColor = new Reference2ReferenceOpenHashMap<>();

@Unique
private final ReferenceSet<Block> overridenBlocks = new ReferenceOpenHashSet<>();

@Inject(method = "registerColorProvider", at = @At("HEAD"))
private void preRegisterColorProvider(BlockColorProvider provider, Block[] blocks, CallbackInfo ci) {
for (Block block : blocks) {
this.blocksToColor.put(block, provider);
// There will be one provider already registered for vanilla blocks, if we are replacing it,
// it means a mod is using custom logic and we need to disable per-vertex coloring
if (this.blocksToColor.put(block, provider) != null) {
this.overridenBlocks.add(block);
SodiumClientMod.logger().info("Block {} had its color provider replaced with {} and will not use per-vertex coloring", Registries.BLOCK.getId(block), provider.toString());
}
}
}

@Override
public Reference2ReferenceMap<Block, BlockColorProvider> sodium$getProviders() {
return Reference2ReferenceMaps.unmodifiable(this.blocksToColor);
}

@Override
public ReferenceSet<Block> sodium$getOverridenVanillaBlocks() {
return ReferenceSets.unmodifiable(this.overridenBlocks);
}
}

0 comments on commit 2b9910e

Please sign in to comment.