feat: rework dynamic item colors

This commit is contained in:
Martin Prokoph
2025-01-26 01:46:16 +01:00
parent 3307ba337e
commit d95a18b28b
11 changed files with 103 additions and 80 deletions

View File

@@ -4,6 +4,7 @@ import com.mojang.blaze3d.systems.RenderSystem;
import eu.midnightdust.visualoverhaul.config.VOConfig;
import eu.midnightdust.visualoverhaul.mixin.TextureManagerAccessor;
import eu.midnightdust.visualoverhaul.util.ModIconUtil;
import eu.midnightdust.visualoverhaul.util.VOColorUtil;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.widget.ClickableWidget;
@@ -25,6 +26,8 @@ import java.util.Map;
import java.util.Properties;
import java.util.function.Function;
import static eu.midnightdust.visualoverhaul.util.VOColorUtil.alphaAndBrightness;
public class IconicButtons {
MinecraftClient client = MinecraftClient.getInstance();
TextureManager textureManager = client.getTextureManager();
@@ -77,7 +80,7 @@ public class IconicButtons {
boolean showLeftWhenBoth = (VOConfig.buttonIconPosition.equals(VOConfig.IconPosition.BOTH) && !limitedSpace) || (VOConfig.buttonIconPosition.equals(VOConfig.IconPosition.BOTH) && widget.getX() < scaledWidth/2);
boolean showRightWhenBoth = (VOConfig.buttonIconPosition.equals(VOConfig.IconPosition.BOTH) && !limitedSpace) || (VOConfig.buttonIconPosition.equals(VOConfig.IconPosition.BOTH) && widget.getX() > scaledWidth/2);
int color = widget.active ? fromArgb(alpha, 1.0F) : fromArgb(alpha, 0.3F);
int color = widget.active ? alphaAndBrightness(alpha, 1.0F) : alphaAndBrightness(alpha, 0.3F);
RenderSystem.enableBlend();
RenderSystem.enableDepthTest();
int inset = 2;
@@ -96,9 +99,6 @@ public class IconicButtons {
RenderSystem.disableDepthTest();
}
}
int fromArgb(float alpha, float brightness) {
return ColorHelper.getArgb(MathHelper.floor(alpha*255), MathHelper.floor(brightness*255), MathHelper.floor(brightness*255), MathHelper.floor(brightness*255));
}
public static void reload(ResourceManager manager) {
manager.findResources("textures", path -> path.getNamespace().equals("iconic") && path.getPath().contains(".properties")).forEach((id, resource) -> {
if (manager.getResource(id).isEmpty()) return;

View File

@@ -0,0 +1,25 @@
package eu.midnightdust.visualoverhaul.mixin;
import eu.midnightdust.visualoverhaul.VisualOverhaulClient;
import eu.midnightdust.visualoverhaul.config.VOConfig;
import net.minecraft.client.render.item.tint.ConstantTintSource;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.entity.LivingEntity;
import net.minecraft.item.ItemStack;
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.CallbackInfoReturnable;
import java.util.List;
@Mixin(ConstantTintSource.class)
public abstract class MixinConstantTintSource {
@Inject(at = @At("RETURN"), method = "getTint", cancellable = true)
public void vo$modifyLeafTint(ItemStack stack, ClientWorld world, LivingEntity user, CallbackInfoReturnable<Integer> cir) {
// Dynamic Leaf Item colors
if (VOConfig.coloredItems && List.of(-12012264).contains(cir.getReturnValue())) {
cir.setReturnValue(VisualOverhaulClient.foliageColor);
}
}
}

View File

@@ -0,0 +1,23 @@
package eu.midnightdust.visualoverhaul.mixin;
import eu.midnightdust.visualoverhaul.VisualOverhaulClient;
import eu.midnightdust.visualoverhaul.config.VOConfig;
import net.minecraft.client.render.item.tint.GrassTintSource;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.entity.LivingEntity;
import net.minecraft.item.ItemStack;
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.CallbackInfoReturnable;
@Mixin(GrassTintSource.class)
public abstract class MixinGrassTintSource {
@Inject(at = @At("RETURN"), method = "getTint", cancellable = true)
public void vo$modifyGrassTint(ItemStack stack, ClientWorld world, LivingEntity user, CallbackInfoReturnable<Integer> cir) {
// Dynamic Grass Item colors
if (VOConfig.coloredItems) {
cir.setReturnValue(VisualOverhaulClient.grassColor);
}
}
}

View File

@@ -0,0 +1,37 @@
package eu.midnightdust.visualoverhaul.mixin;
import eu.midnightdust.visualoverhaul.VisualOverhaulClient;
import eu.midnightdust.visualoverhaul.config.VOConfig;
import net.minecraft.client.render.item.tint.PotionTintSource;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.component.DataComponentTypes;
import net.minecraft.entity.LivingEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.potion.Potion;
import net.minecraft.potion.Potions;
import net.minecraft.registry.entry.RegistryEntry;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import java.util.List;
@Mixin(PotionTintSource.class)
public class MixinPotionTintSource {
@Unique private static final List<RegistryEntry<Potion>> WATER_POTIONS = List.of(Potions.WATER, Potions.MUNDANE, Potions.THICK, Potions.AWKWARD);
@Inject(at = @At("RETURN"), method = "getTint", cancellable = true)
public void vo$modifyWaterTint(ItemStack stack, ClientWorld world, LivingEntity user, CallbackInfoReturnable<Integer> cir) {
// Dynamic Potion Item colors
if (VOConfig.coloredItems) {
var contents = stack.getComponents().get(DataComponentTypes.POTION_CONTENTS);
if (contents != null && contents.potion().isPresent()) {
if (!WATER_POTIONS.contains(contents.potion().get()))
return; // Skip all potions with effects
}
cir.setReturnValue(VisualOverhaulClient.potionColor);
}
}
}

View File

@@ -1,12 +1,17 @@
package eu.midnightdust.visualoverhaul.util;
import net.minecraft.util.math.ColorHelper;
import net.minecraft.util.math.MathHelper;
public class VOColorUtil {
public static int convertRgbToArgb(int rgb) {
public static int convertRgbToArgb(int rgb, int alpha) {
int red = 0xFF & (rgb >> 16);
int green = 0xFF & (rgb >> 8);
int blue = 0xFF & (rgb);
int alpha = 200; // Makes water bottles transparent, 255 would be opaque
return (alpha << 24) | (red << 16) | (green << 8) | blue;
}
public static int alphaAndBrightness(float alpha, float brightness) {
return ColorHelper.getArgb(MathHelper.floor(alpha*255), MathHelper.floor(brightness*255), MathHelper.floor(brightness*255), MathHelper.floor(brightness*255));
}
}

View File

@@ -9,6 +9,9 @@
"client": [
"ItemRenderStateAccessor",
"MixinBlastFurnaceBlock",
"MixinConstantTintSource",
"MixinGrassTintSource",
"MixinPotionTintSource",
"MixinPressableWidget",
"MixinSliderWidget",
"MixinSmokerBlock",