diff --git a/src/main/java/com/minelittlepony/api/model/Models.java b/src/main/java/com/minelittlepony/api/model/Models.java index ccece120..f4c9ed99 100644 --- a/src/main/java/com/minelittlepony/api/model/Models.java +++ b/src/main/java/com/minelittlepony/api/model/Models.java @@ -1,6 +1,5 @@ package com.minelittlepony.api.model; -import net.minecraft.item.ArmorItem; import net.minecraft.item.ItemStack; import net.minecraft.util.Util; @@ -35,7 +34,7 @@ public record Models> ( public Optional> getArmourModel(ItemStack stack, ArmourLayer layer, ArmourVariant variant) { return ArmorModelRegistry.getModelKey(stack.getItem(), layer) - .or(() -> variant.getDefaultModel(layer).filter(l -> stack.getItem() instanceof ArmorItem)) + .or(() -> variant.getDefaultModel(layer)) .map(armor); } } diff --git a/src/main/java/com/minelittlepony/client/model/armour/ArmourTexture.java b/src/main/java/com/minelittlepony/client/model/armour/ArmourTexture.java index e6c28911..41f334e0 100644 --- a/src/main/java/com/minelittlepony/client/model/armour/ArmourTexture.java +++ b/src/main/java/com/minelittlepony/client/model/armour/ArmourTexture.java @@ -28,7 +28,7 @@ public record ArmourTexture(Identifier texture, ArmourVariant variant) { public Stream ponify() { if (!PonyConfig.getInstance().disablePonifiedArmour.get()) { - return Stream.of(this, modern(texture().withPath(p -> p.replace("humanoid", "ponified")))); + return Stream.of(modern(texture().withPath(p -> p.replace("humanoid", "ponified"))), this); } return Stream.of(this); } diff --git a/src/main/java/com/minelittlepony/client/model/armour/ArmourTextureResolver.java b/src/main/java/com/minelittlepony/client/model/armour/ArmourTextureResolver.java index fc3fc51c..3c683bad 100644 --- a/src/main/java/com/minelittlepony/client/model/armour/ArmourTextureResolver.java +++ b/src/main/java/com/minelittlepony/client/model/armour/ArmourTextureResolver.java @@ -77,6 +77,7 @@ public class ArmourTextureResolver implements ArmourTextureLookup, IdentifiableR @Override public ArmourTexture getTexture(ItemStack stack, EquipmentModel.LayerType layerType, EquipmentModel.Layer layer) { + layerCache.invalidateAll(); return layerCache.getUnchecked(new ArmourParameters(layer, layerType, getCustom(stack))); } diff --git a/src/main/java/com/minelittlepony/client/model/armour/PonifiedEquipmentRenderer.java b/src/main/java/com/minelittlepony/client/model/armour/PonifiedEquipmentRenderer.java index a8907e18..b989b04d 100644 --- a/src/main/java/com/minelittlepony/client/model/armour/PonifiedEquipmentRenderer.java +++ b/src/main/java/com/minelittlepony/client/model/armour/PonifiedEquipmentRenderer.java @@ -4,6 +4,7 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.*; import net.minecraft.client.render.entity.equipment.EquipmentModelLoader; import net.minecraft.client.render.entity.equipment.EquipmentRenderer; +import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.DyedColorComponent; @@ -13,6 +14,7 @@ import net.minecraft.item.equipment.EquipmentModel; import net.minecraft.item.equipment.EquipmentModel.LayerType; import net.minecraft.item.equipment.trim.ArmorTrim; import net.minecraft.registry.tag.ItemTags; +import net.minecraft.util.Colors; import net.minecraft.util.Identifier; import net.minecraft.util.math.ColorHelper; @@ -25,6 +27,7 @@ import com.minelittlepony.client.render.entity.state.PonyRenderState; import java.util.*; public class PonifiedEquipmentRenderer extends EquipmentRenderer { + private static final int TRANSPARENT = 0; private final EquipmentModelLoader modelLoader; @@ -63,30 +66,27 @@ public class PonifiedEquipmentRenderer extends EquipmentRenderer { List layers = modelLoader.get(modelId).getLayers(layerType); if (!layers.isEmpty()) { ArmourRendererPlugin plugin = ArmourRendererPlugin.INSTANCE.get(); - int i = stack.isIn(ItemTags.DYEABLE) ? DyedColorComponent.getColor(stack, 0) : 0; + int defaultColor = stack.isIn(ItemTags.DYEABLE) ? DyedColorComponent.getColor(stack, 0) : 0; float armorAlpha = plugin.getArmourAlpha(equipmentSlot, layerType); boolean hasGlint = plugin.getGlintAlpha(equipmentSlot, stack) > 0 && stack.hasGlint(); - Set drawnModels = new HashSet<>(); + Set> drawnModels = new HashSet<>(); if (armorAlpha > 0) { for (EquipmentModel.Layer layer : layers) { - int j = getDyeColor(layer, i); - if (j != 0) { + int dyeColor = getDyeColor(layer, defaultColor); + if (dyeColor != TRANSPARENT) { ArmourLayer armourLayer = layerType == LayerType.HUMANOID_LEGGINGS ? ArmourLayer.INNER : ArmourLayer.OUTER; ArmourTexture armorTexture = plugin.getTextureLookup().getTexture(stack, layerType, layer); - Identifier layerTexture = layer.usePlayerTexture() && texture != null - ? texture - : armorTexture.texture(); + Identifier layerTexture = layer.usePlayerTexture() && texture != null ? texture : armorTexture.texture(); - VertexConsumer armorConsumer = plugin.getArmourConsumer(equipmentSlot, vertexConsumers, layerTexture, layerType); + VertexConsumer armorConsumer = getArmorVertexConsumer(plugin, equipmentSlot, vertexConsumers, layerTexture, layerType, hasGlint); if (armorConsumer != null) { ArmourVariant variant = layer.usePlayerTexture() ? ArmourVariant.NORMAL : armorTexture.variant(); models.getArmourModel(stack, armourLayer, variant).ifPresent(model -> { - VertexConsumer glintConsumer = hasGlint ? plugin.getGlintConsumer(equipmentSlot, vertexConsumers, layerType) : null; - if (model.poseModel(equipmentSlot, armourLayer, models.body())) { - model.setAngles(entity); - model.render(matrices, glintConsumer != null ? VertexConsumers.union(plugin.getGlintConsumer(equipmentSlot, vertexConsumers, layerType), armorConsumer) : armorConsumer, light, OverlayTexture.DEFAULT_UV, j); + if (model.setAngles(entity, equipmentSlot, armourLayer, models.body())) { + model.render(matrices, armorConsumer, light, OverlayTexture.DEFAULT_UV, dyeColor); + drawnModels.add(model); } }); } @@ -98,22 +98,31 @@ public class PonifiedEquipmentRenderer extends EquipmentRenderer { if (armorTrim != null && plugin.getTrimAlpha(equipmentSlot, armorTrim, layerType) > 0) { VertexConsumer trimConsumer = plugin.getTrimConsumer(equipmentSlot, vertexConsumers, armorTrim, layerType, modelId); if (trimConsumer != null) { - drawnModels.forEach(model -> { - model.render(matrices, trimConsumer, light, OverlayTexture.DEFAULT_UV); - }); + drawnModels.forEach(model -> model.render(matrices, trimConsumer, light, OverlayTexture.DEFAULT_UV)); } } } } + @Nullable + private static VertexConsumer getArmorVertexConsumer(ArmourRendererPlugin plugin, EquipmentSlot slot, VertexConsumerProvider provider, Identifier texture, EquipmentModel.LayerType layerType, boolean glint) { + VertexConsumer armorConsumer = plugin.getArmourConsumer(slot, provider, texture, layerType); + if (armorConsumer != null) { + VertexConsumer glintConsumer = glint ? plugin.getGlintConsumer(slot, provider, layerType) : null; + if (glintConsumer != null) { + return VertexConsumers.union(glintConsumer, armorConsumer); + } + } + return armorConsumer; + } + private static int getDyeColor(EquipmentModel.Layer layer, int dyeColor) { Optional optional = layer.dyeable(); if (optional.isPresent()) { - int i = (Integer)((EquipmentModel.Dyeable)optional.get()).colorWhenUndyed().map(ColorHelper::fullAlpha).orElse(0); - return dyeColor != 0 ? dyeColor : i; - } else { - return -1; + int i = optional.get().colorWhenUndyed().map(ColorHelper::fullAlpha).orElse(0); + return dyeColor != TRANSPARENT ? dyeColor : i; } + return Colors.WHITE; } } diff --git a/src/main/java/com/minelittlepony/client/model/armour/PonyArmourModel.java b/src/main/java/com/minelittlepony/client/model/armour/PonyArmourModel.java index d700272b..bb318356 100644 --- a/src/main/java/com/minelittlepony/client/model/armour/PonyArmourModel.java +++ b/src/main/java/com/minelittlepony/client/model/armour/PonyArmourModel.java @@ -1,6 +1,7 @@ package com.minelittlepony.client.model.armour; import net.minecraft.client.model.ModelPart; +import net.minecraft.client.render.entity.state.PlayerEntityRenderState; import net.minecraft.entity.EquipmentSlot; import com.minelittlepony.api.model.PonyModel; @@ -14,7 +15,8 @@ public class PonyArmourModel extends AbstractPonyMode super(tree, false); } - public boolean poseModel(EquipmentSlot slot, ArmourLayer layer, PonyModel mainModel) { + public boolean setAngles(PlayerEntityRenderState state, EquipmentSlot slot, ArmourLayer layer, PonyModel mainModel) { + setAngles(state); if (!setVisibilities(slot, layer)) { return false; } diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/ArmourFeature.java b/src/main/java/com/minelittlepony/client/render/entity/feature/ArmourFeature.java index 61a38292..dc8d1cf3 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/feature/ArmourFeature.java +++ b/src/main/java/com/minelittlepony/client/render/entity/feature/ArmourFeature.java @@ -18,6 +18,8 @@ import net.minecraft.item.*; import net.minecraft.item.equipment.EquipmentModel; import net.minecraft.util.Identifier; +import org.jetbrains.annotations.Nullable; + public class ArmourFeature< T extends LivingEntity, S extends PonyRenderState, @@ -60,7 +62,7 @@ public class ArmourFeature< for (ItemStack stack : plugin.getArmorStacks(entity, armorSlot, layer, ArmourRendererPlugin.ArmourType.ARMOUR)) { EquippableComponent equippableComponent = stack.get(DataComponentTypes.EQUIPPABLE); - if (equippableComponent != null && hasModel(equippableComponent, armorSlot)) { + if (hasModel(equippableComponent, armorSlot)) { EquipmentModel.LayerType layerType = layer == ArmourLayer.INNER ? EquipmentModel.LayerType.HUMANOID_LEGGINGS : EquipmentModel.LayerType.HUMANOID; @@ -72,7 +74,7 @@ public class ArmourFeature< plugin.onArmourRendered(entity, matrices, vertices, armorSlot, layer, ArmourRendererPlugin.ArmourType.ARMOUR); } - private static boolean hasModel(EquippableComponent component, EquipmentSlot slot) { - return component.model().isPresent() && component.slot() == slot; + private static boolean hasModel(@Nullable EquippableComponent component, EquipmentSlot slot) { + return component != null && component.model().isPresent() && component.slot() == slot; } } diff --git a/src/main/resources/assets/minecraft/textures/entity/equipment/ponified/chainmail.png b/src/main/resources/assets/minecraft/textures/entity/equipment/ponified/chainmail.png index 4e853e22..efe93b43 100644 Binary files a/src/main/resources/assets/minecraft/textures/entity/equipment/ponified/chainmail.png and b/src/main/resources/assets/minecraft/textures/entity/equipment/ponified/chainmail.png differ diff --git a/src/main/resources/assets/minecraft/textures/entity/equipment/ponified/diamond.png b/src/main/resources/assets/minecraft/textures/entity/equipment/ponified/diamond.png index fb08b99f..d9cb5e69 100644 Binary files a/src/main/resources/assets/minecraft/textures/entity/equipment/ponified/diamond.png and b/src/main/resources/assets/minecraft/textures/entity/equipment/ponified/diamond.png differ diff --git a/src/main/resources/assets/minecraft/textures/entity/equipment/ponified/gold.png b/src/main/resources/assets/minecraft/textures/entity/equipment/ponified/gold.png index e82481b4..e9915eb7 100644 Binary files a/src/main/resources/assets/minecraft/textures/entity/equipment/ponified/gold.png and b/src/main/resources/assets/minecraft/textures/entity/equipment/ponified/gold.png differ diff --git a/src/main/resources/assets/minecraft/textures/entity/equipment/ponified/iron.png b/src/main/resources/assets/minecraft/textures/entity/equipment/ponified/iron.png index 37d6d916..64049dff 100644 Binary files a/src/main/resources/assets/minecraft/textures/entity/equipment/ponified/iron.png and b/src/main/resources/assets/minecraft/textures/entity/equipment/ponified/iron.png differ diff --git a/src/main/resources/assets/minecraft/textures/entity/equipment/ponified/leather.png b/src/main/resources/assets/minecraft/textures/entity/equipment/ponified/leather.png index 24c714b0..619ea19e 100644 Binary files a/src/main/resources/assets/minecraft/textures/entity/equipment/ponified/leather.png and b/src/main/resources/assets/minecraft/textures/entity/equipment/ponified/leather.png differ diff --git a/src/main/resources/assets/minecraft/textures/entity/equipment/ponified/leather_overlay.png b/src/main/resources/assets/minecraft/textures/entity/equipment/ponified/leather_overlay.png index 05fdfc68..e1396966 100644 Binary files a/src/main/resources/assets/minecraft/textures/entity/equipment/ponified/leather_overlay.png and b/src/main/resources/assets/minecraft/textures/entity/equipment/ponified/leather_overlay.png differ diff --git a/src/main/resources/assets/minecraft/textures/entity/equipment/ponified/netherite.png b/src/main/resources/assets/minecraft/textures/entity/equipment/ponified/netherite.png index 2c02c285..75a3500a 100644 Binary files a/src/main/resources/assets/minecraft/textures/entity/equipment/ponified/netherite.png and b/src/main/resources/assets/minecraft/textures/entity/equipment/ponified/netherite.png differ diff --git a/src/main/resources/assets/minecraft/textures/entity/equipment/ponified_leggings/chainmail.png b/src/main/resources/assets/minecraft/textures/entity/equipment/ponified_leggings/chainmail.png index efe93b43..4e853e22 100644 Binary files a/src/main/resources/assets/minecraft/textures/entity/equipment/ponified_leggings/chainmail.png and b/src/main/resources/assets/minecraft/textures/entity/equipment/ponified_leggings/chainmail.png differ diff --git a/src/main/resources/assets/minecraft/textures/entity/equipment/ponified_leggings/diamond.png b/src/main/resources/assets/minecraft/textures/entity/equipment/ponified_leggings/diamond.png index d9cb5e69..fb08b99f 100644 Binary files a/src/main/resources/assets/minecraft/textures/entity/equipment/ponified_leggings/diamond.png and b/src/main/resources/assets/minecraft/textures/entity/equipment/ponified_leggings/diamond.png differ diff --git a/src/main/resources/assets/minecraft/textures/entity/equipment/ponified_leggings/gold.png b/src/main/resources/assets/minecraft/textures/entity/equipment/ponified_leggings/gold.png index e9915eb7..e82481b4 100644 Binary files a/src/main/resources/assets/minecraft/textures/entity/equipment/ponified_leggings/gold.png and b/src/main/resources/assets/minecraft/textures/entity/equipment/ponified_leggings/gold.png differ diff --git a/src/main/resources/assets/minecraft/textures/entity/equipment/ponified_leggings/iron.png b/src/main/resources/assets/minecraft/textures/entity/equipment/ponified_leggings/iron.png index 64049dff..37d6d916 100644 Binary files a/src/main/resources/assets/minecraft/textures/entity/equipment/ponified_leggings/iron.png and b/src/main/resources/assets/minecraft/textures/entity/equipment/ponified_leggings/iron.png differ diff --git a/src/main/resources/assets/minecraft/textures/entity/equipment/ponified_leggings/leather.png b/src/main/resources/assets/minecraft/textures/entity/equipment/ponified_leggings/leather.png index 619ea19e..24c714b0 100644 Binary files a/src/main/resources/assets/minecraft/textures/entity/equipment/ponified_leggings/leather.png and b/src/main/resources/assets/minecraft/textures/entity/equipment/ponified_leggings/leather.png differ diff --git a/src/main/resources/assets/minecraft/textures/entity/equipment/ponified_leggings/leather_overlay.png b/src/main/resources/assets/minecraft/textures/entity/equipment/ponified_leggings/leather_overlay.png index e1396966..05fdfc68 100644 Binary files a/src/main/resources/assets/minecraft/textures/entity/equipment/ponified_leggings/leather_overlay.png and b/src/main/resources/assets/minecraft/textures/entity/equipment/ponified_leggings/leather_overlay.png differ diff --git a/src/main/resources/assets/minecraft/textures/entity/equipment/ponified_leggings/netherite.png b/src/main/resources/assets/minecraft/textures/entity/equipment/ponified_leggings/netherite.png index 75a3500a..2c02c285 100644 Binary files a/src/main/resources/assets/minecraft/textures/entity/equipment/ponified_leggings/netherite.png and b/src/main/resources/assets/minecraft/textures/entity/equipment/ponified_leggings/netherite.png differ