diff --git a/common/src/main/java/traben/entity_texture_features/compat/ETF3DBodyLayerFeatureRenderer.java b/common/src/main/java/traben/entity_texture_features/compat/ETF3DBodyLayerFeatureRenderer.java deleted file mode 100644 index c6346ee8..00000000 --- a/common/src/main/java/traben/entity_texture_features/compat/ETF3DBodyLayerFeatureRenderer.java +++ /dev/null @@ -1,64 +0,0 @@ -package traben.entity_texture_features.compat; - -import dev.tr7zw.skinlayers.accessor.PlayerSettings; -import dev.tr7zw.skinlayers.renderlayers.BodyLayerFeatureRenderer; -import net.minecraft.client.network.AbstractClientPlayerEntity; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.feature.FeatureRendererContext; -import net.minecraft.client.render.entity.model.PlayerEntityModel; -import net.minecraft.client.render.item.ItemRenderer; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.Identifier; -import traben.entity_texture_features.ETFClientCommon; -import traben.entity_texture_features.features.ETFManager; -import traben.entity_texture_features.features.player.ETFPlayerTexture; - -//class exists to introduce extra, ETF interacting, child functionality to 3d Skin layer mod featureRenderers -//this will replace the featureRender added by 3d skin layers mod -// -// as long as inheritance remains valid this should remain future-proof -public class ETF3DBodyLayerFeatureRenderer extends BodyLayerFeatureRenderer { - private VertexConsumerProvider thisProvider = null; - - public ETF3DBodyLayerFeatureRenderer(FeatureRendererContext> renderLayerParent) { - super(renderLayerParent); - } - - // simply captures vertexConsumerProvider - @Override - public void render(MatrixStack poseStack, VertexConsumerProvider multiBufferSource, int i, AbstractClientPlayerEntity player, float f, float g, float h, float j, float k, float l) { - thisProvider = multiBufferSource; - super.render(poseStack, multiBufferSource, i, player, f, g, h, j, k, l); - } - - // simply defers the parent renderLayers method until ETF has had a chance to change the vertex consumer - @Override - public void renderLayers(AbstractClientPlayerEntity abstractClientPlayer, PlayerSettings settings, MatrixStack matrixStack, VertexConsumer vertices, int light, int overlay) { - ETFPlayerTexture thisETF = ETFManager.getInstance().getPlayerTexture(abstractClientPlayer, abstractClientPlayer.getSkinTextures().texture()); - if (thisETF != null) { - Identifier skin = thisETF.getBaseTextureIdentifierOrNullForVanilla(abstractClientPlayer); - if (skin != null) { - vertices = thisProvider.getBuffer(RenderLayer.getEntityTranslucent(skin)); - } - // mesh may be slightly incorrect if texture has changed significantly - // only minor changes expected, typically to the face for blinking - super.renderLayers(abstractClientPlayer, settings, matrixStack, vertices, light, overlay); - - // further meshes are correct as emissive and enchant are only overlays - Identifier emissiveSkin = thisETF.getBaseTextureEmissiveIdentifierOrNullForNone(); - if (emissiveSkin != null) { - vertices = thisProvider.getBuffer(RenderLayer.getEntityTranslucent(emissiveSkin)); - super.renderLayers(abstractClientPlayer, settings, matrixStack, vertices, ETFClientCommon.EMISSIVE_FEATURE_LIGHT_VALUE, overlay); - } - Identifier enchantSkin = thisETF.getBaseTextureEnchantIdentifierOrNullForNone(); - if (enchantSkin != null) { - vertices = ItemRenderer.getArmorGlintConsumer(thisProvider, RenderLayer.getArmorCutoutNoCull(enchantSkin), false, true); - super.renderLayers(abstractClientPlayer, settings, matrixStack, vertices, light, overlay); - } - } else { - super.renderLayers(abstractClientPlayer, settings, matrixStack, vertices, light, overlay); - } - } -} diff --git a/common/src/main/java/traben/entity_texture_features/compat/ETF3DHeadLayerFeatureRenderer.java b/common/src/main/java/traben/entity_texture_features/compat/ETF3DHeadLayerFeatureRenderer.java deleted file mode 100644 index 5cdebcf2..00000000 --- a/common/src/main/java/traben/entity_texture_features/compat/ETF3DHeadLayerFeatureRenderer.java +++ /dev/null @@ -1,63 +0,0 @@ -package traben.entity_texture_features.compat; - -import dev.tr7zw.skinlayers.accessor.PlayerSettings; -import dev.tr7zw.skinlayers.renderlayers.HeadLayerFeatureRenderer; -import net.minecraft.client.network.AbstractClientPlayerEntity; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.feature.FeatureRendererContext; -import net.minecraft.client.render.entity.model.PlayerEntityModel; -import net.minecraft.client.render.item.ItemRenderer; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.Identifier; -import traben.entity_texture_features.ETFClientCommon; -import traben.entity_texture_features.features.ETFManager; -import traben.entity_texture_features.features.player.ETFPlayerTexture; - -//class exists to introduce extra, ETF interacting, child functionality to 3d Skin layer mod featureRenderers -//this will replace the featureRender added by 3d skin layers mod -// -// as long as inheritance remains valid this should remain future-proof -public class ETF3DHeadLayerFeatureRenderer extends HeadLayerFeatureRenderer { - private VertexConsumerProvider thisProvider = null; - - public ETF3DHeadLayerFeatureRenderer(FeatureRendererContext> renderLayerParent) { - super(renderLayerParent); - } - - // simply captures vertexConsumerProvider - @Override - public void render(MatrixStack poseStack, VertexConsumerProvider multiBufferSource, int i, AbstractClientPlayerEntity player, float f, float g, float h, float j, float k, float l) { - thisProvider = multiBufferSource; - super.render(poseStack, multiBufferSource, i, player, f, g, h, j, k, l); - } - - // simply defers the parent renderLayers method until ETF has had a chance to change the vertex consumer - @Override - public void renderCustomHelmet(PlayerSettings settings, AbstractClientPlayerEntity abstractClientPlayer, MatrixStack matrixStack, VertexConsumer vertices, int light, int overlay) { - ETFPlayerTexture thisETF = ETFManager.getInstance().getPlayerTexture(abstractClientPlayer, abstractClientPlayer.getSkinTextures().texture()); - if (thisETF != null) { - Identifier skin = thisETF.getBaseTextureIdentifierOrNullForVanilla(abstractClientPlayer); - if (skin != null) { - vertices = thisProvider.getBuffer(RenderLayer.getEntityTranslucentCull(skin)); - } - // mesh may be slightly incorrect if texture has changed significantly - // only minor changes expected, typically to the face for blinking - super.renderCustomHelmet(settings, abstractClientPlayer, matrixStack, vertices, light, overlay); - // further meshes are correct as emissive and enchant are only overlays - Identifier emissiveSkin = thisETF.getBaseTextureEmissiveIdentifierOrNullForNone(); - if (emissiveSkin != null) { - vertices = thisProvider.getBuffer(RenderLayer.getEntityTranslucentCull(emissiveSkin)); - super.renderCustomHelmet(settings, abstractClientPlayer, matrixStack, vertices, ETFClientCommon.EMISSIVE_FEATURE_LIGHT_VALUE, overlay); - } - Identifier enchantSkin = thisETF.getBaseTextureEnchantIdentifierOrNullForNone(); - if (enchantSkin != null) { - vertices = ItemRenderer.getArmorGlintConsumer(thisProvider, RenderLayer.getArmorCutoutNoCull(enchantSkin), false, true); - super.renderCustomHelmet(settings, abstractClientPlayer, matrixStack, vertices, light, overlay); - } - } else { - super.renderCustomHelmet(settings, abstractClientPlayer, matrixStack, vertices, light, overlay); - } - } -} diff --git a/common/src/main/java/traben/entity_texture_features/compat/ETF3DSkinLayersUtil.java b/common/src/main/java/traben/entity_texture_features/compat/ETF3DSkinLayersUtil.java index 7d191aed..f4b2be7e 100644 --- a/common/src/main/java/traben/entity_texture_features/compat/ETF3DSkinLayersUtil.java +++ b/common/src/main/java/traben/entity_texture_features/compat/ETF3DSkinLayersUtil.java @@ -5,52 +5,18 @@ import dev.tr7zw.skinlayers.accessor.PlayerEntityModelAccessor; import dev.tr7zw.skinlayers.accessor.PlayerSettings; import dev.tr7zw.skinlayers.api.Mesh; -import dev.tr7zw.skinlayers.renderlayers.BodyLayerFeatureRenderer; -import dev.tr7zw.skinlayers.renderlayers.HeadLayerFeatureRenderer; import net.minecraft.client.model.ModelPart; import net.minecraft.client.network.AbstractClientPlayerEntity; import net.minecraft.client.render.OverlayTexture; import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.entity.PlayerEntityRenderer; import net.minecraft.client.render.entity.PlayerModelPart; -import net.minecraft.client.render.entity.feature.FeatureRenderer; -import net.minecraft.client.render.entity.feature.FeatureRendererContext; -import net.minecraft.client.render.entity.model.PlayerEntityModel; import net.minecraft.client.util.math.MatrixStack; import traben.entity_texture_features.utils.ETFUtils2; // compatibility class for the wonderful 3D skin layers mod by @tr9zw to utilise ETF skin features public abstract class ETF3DSkinLayersUtil { - // method is called from MixinLivingEntityRenderer as a super of the playerEntityRenderer - // - // method is handled in this class separately to prevent any loading attempt of 3D skin layer mod classes without the mod being present - // - // this appears to be the easiest way to add to the 3D skin layer mod's featureRenderers while also utilising - // the mods code to do all the setup required for correct rendering - // - // this method is future-proof only with the expectation that the 2 ETF3D featureRenderer's inheritance remains valid - // checks whether the provided featureRenderer is one of the 3D skin layer feature renderers - public static boolean canReplace(FeatureRenderer feature) { - return feature instanceof BodyLayerFeatureRenderer || feature instanceof HeadLayerFeatureRenderer; - } - - // returns a replacement ETF child featureRenderer of the 3D skin layer featureRenderer - public static FeatureRenderer getReplacement(FeatureRenderer feature, FeatureRendererContext context) { - try { - if (feature instanceof HeadLayerFeatureRenderer) { - //noinspection unchecked - return new ETF3DHeadLayerFeatureRenderer((FeatureRendererContext>) context); - } else if (feature instanceof BodyLayerFeatureRenderer) { - //noinspection unchecked - return new ETF3DBodyLayerFeatureRenderer((FeatureRendererContext>) context); - } - } catch (Exception e) { - ETFUtils2.logWarn("Exception with ETF's 3D skin layers mod compatibility: " + e); - } - ETFUtils2.logError("Failed in ETF's 3D skin layers mod compatibility."); - return feature; - } // todo ensure rendering method is kept up to date with how 3D skin layers mod does it // copy of 3D skin layers hand rendering code as ETF needs to be able to render it at will with a custom VertexConsumer @@ -105,12 +71,4 @@ public static void renderHand(PlayerEntityRenderer instance, MatrixStack poseSta } -// initial testing method -// public static void tryRenderWithETFFeatures(FeatureRendererContext> context, FeatureRenderer featureRenderer, AbstractClientPlayerEntity entity, float g, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, float k, float m, float l, float n, float o) { -// if (featureRenderer instanceof HeadLayerFeatureRenderer) { -// new ETF3DHeadLayerFeatureRenderer>(context).render(matrixStack, vertexConsumerProvider, i, entity, o, n, g, l, k, m); -// } else if (featureRenderer instanceof BodyLayerFeatureRenderer) { -// new ETF3DBodyLayerFeatureRenderer(context).render(matrixStack, vertexConsumerProvider, i, entity, o, n, g, l, k, m); -// } -// } } diff --git a/common/src/main/java/traben/entity_texture_features/mixin/MixinModelPart.java b/common/src/main/java/traben/entity_texture_features/mixin/MixinModelPart.java index dde46d3d..ad52499c 100644 --- a/common/src/main/java/traben/entity_texture_features/mixin/MixinModelPart.java +++ b/common/src/main/java/traben/entity_texture_features/mixin/MixinModelPart.java @@ -15,6 +15,7 @@ import traben.entity_texture_features.ETFClientCommon; import traben.entity_texture_features.features.ETFManager; import traben.entity_texture_features.features.ETFRenderContext; +import traben.entity_texture_features.mixin.mods.MixinModelPartSodium; /** * this method figures out if a {@link ModelPart} is the top level of the children tree being rendered, @@ -22,9 +23,9 @@ *

* this is copied in {@link MixinModelPartSodium} for sodium's alternative model part render method. *

- * the priority is required so this method will never mixin before sodium. + * the priority is set so this method will never run before sodium cancels the vanilla rendering code. */ -@Mixin(value = ModelPart.class, priority = 99999999) +@Mixin(value = ModelPart.class, priority = 2000) public abstract class MixinModelPart { @Shadow public abstract void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha); diff --git a/common/src/main/java/traben/entity_texture_features/mixin/entity/renderer/MixinLivingEntityRenderer.java b/common/src/main/java/traben/entity_texture_features/mixin/entity/renderer/MixinLivingEntityRenderer.java index bb9ce622..b01f735b 100644 --- a/common/src/main/java/traben/entity_texture_features/mixin/entity/renderer/MixinLivingEntityRenderer.java +++ b/common/src/main/java/traben/entity_texture_features/mixin/entity/renderer/MixinLivingEntityRenderer.java @@ -4,7 +4,6 @@ import net.minecraft.client.render.entity.EntityRenderer; import net.minecraft.client.render.entity.EntityRendererFactory; import net.minecraft.client.render.entity.LivingEntityRenderer; -import net.minecraft.client.render.entity.feature.FeatureRenderer; import net.minecraft.client.render.entity.feature.FeatureRendererContext; import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.client.util.math.MatrixStack; @@ -13,15 +12,9 @@ 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.ModifyArg; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import traben.entity_texture_features.ETFClientCommon; -import traben.entity_texture_features.compat.ETF3DSkinLayersUtil; import traben.entity_texture_features.features.ETFRenderContext; import traben.entity_texture_features.utils.ETFEntity; -import traben.entity_texture_features.utils.ETFUtils2; - -import static traben.entity_texture_features.ETFClientCommon.ETFConfigData; @Mixin(LivingEntityRenderer.class) @@ -59,28 +52,6 @@ protected MixinLivingEntityRenderer(EntityRendererFactory.Context ctx) { ETFRenderContext.setRenderingFeatures(false); } - @ModifyArg(method = "addFeature", at = @At(value = "INVOKE", target = "Ljava/util/List;add(Ljava/lang/Object;)Z"), index = 0) - private Object etf$3dSkinLayerCompat(Object featureRenderer) { - // replace 3d skin layers mod feature renderers with ETF's child versions - - try { - // handler class is only ever accessed if the mod is present - // prevents NoClassDefFoundError - if (ETFClientCommon.SKIN_LAYERS_DETECTED - && ETFConfigData.use3DSkinLayerPatch - && ETF3DSkinLayersUtil.canReplace((FeatureRenderer) featureRenderer)) { - return ETF3DSkinLayersUtil.getReplacement((FeatureRenderer) featureRenderer, this); - } - } catch (Exception e) { - ETFUtils2.logWarn("Exception with ETF's 3D skin layers mod compatibility: " + e); - } catch (NoClassDefFoundError error) { - // Should never be thrown - // unless a significant change in 3d skin layers mod - ETFUtils2.logError("Error with ETF's 3D skin layers mod compatibility: " + error); - } - - return featureRenderer; - } } diff --git a/common/src/main/java/traben/entity_texture_features/mixin/entity/renderer/MixinPlayerEntityRenderer.java b/common/src/main/java/traben/entity_texture_features/mixin/entity/renderer/MixinPlayerEntityRenderer.java index aef2689a..070119a3 100644 --- a/common/src/main/java/traben/entity_texture_features/mixin/entity/renderer/MixinPlayerEntityRenderer.java +++ b/common/src/main/java/traben/entity_texture_features/mixin/entity/renderer/MixinPlayerEntityRenderer.java @@ -21,7 +21,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import traben.entity_texture_features.ETFClientCommon; -import traben.entity_texture_features.ETFVersionDifferenceHandler; import traben.entity_texture_features.compat.ETF3DSkinLayersUtil; import traben.entity_texture_features.features.ETFManager; import traben.entity_texture_features.features.ETFRenderContext; @@ -57,20 +56,20 @@ public MixinPlayerEntityRenderer(EntityRendererFactory.Context ctx, PlayerEntity at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/entity/model/PlayerEntityModel;setAngles(Lnet/minecraft/entity/LivingEntity;FFFFF)V", shift = At.Shift.AFTER), cancellable = true) private void etf$redirectNicely(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, AbstractClientPlayerEntity player, ModelPart arm, ModelPart sleeve, CallbackInfo ci) { - arm.pitch = 0.0F; - sleeve.pitch = 0.0F; - if (ETFConfigData.skinFeaturesEnabled) { ETFPlayerTexture thisETFPlayerTexture = ETFManager.getInstance().getPlayerTexture(player, player.getSkinTextures().texture()); - if (thisETFPlayerTexture != null) { + if (thisETFPlayerTexture != null && thisETFPlayerTexture.hasFeatures) { Identifier etfTexture = thisETFPlayerTexture.getBaseTextureIdentifierOrNullForVanilla(player); if (etfTexture != null) { ETFRenderContext.preventRenderLayerTextureModify(); + arm.pitch = 0.0F; + sleeve.pitch = 0.0F; + VertexConsumer vc1 = vertexConsumers.getBuffer(RenderLayer.getEntityTranslucent(etfTexture)); arm.render(matrices, vc1, light, OverlayTexture.DEFAULT_UV); sleeve.render(matrices, vc1, light, OverlayTexture.DEFAULT_UV); - if (ETFVersionDifferenceHandler.isThisModLoaded("skinlayers") || ETFVersionDifferenceHandler.isThisModLoaded("skinlayers3d")) { + if (ETFClientCommon.SKIN_LAYERS_DETECTED) { try { // handler class is only ever accessed if the mod is present // prevents NoClassDefFoundError @@ -92,7 +91,7 @@ public MixinPlayerEntityRenderer(EntityRendererFactory.Context ctx, PlayerEntity arm.render(matrices, vc2, ETFClientCommon.EMISSIVE_FEATURE_LIGHT_VALUE, OverlayTexture.DEFAULT_UV); sleeve.render(matrices, vc2, ETFClientCommon.EMISSIVE_FEATURE_LIGHT_VALUE, OverlayTexture.DEFAULT_UV); ETFRenderContext.endSpecialRenderOverlayPhase(); - if (ETFVersionDifferenceHandler.isThisModLoaded("skinlayers") || ETFVersionDifferenceHandler.isThisModLoaded("skinlayers3d")) { + if (ETFClientCommon.SKIN_LAYERS_DETECTED) { try { // handler class is only ever accessed if the mod is present // prevents NoClassDefFoundError @@ -112,7 +111,7 @@ public MixinPlayerEntityRenderer(EntityRendererFactory.Context ctx, PlayerEntity VertexConsumer vc3 = ItemRenderer.getArmorGlintConsumer(vertexConsumers, RenderLayer.getArmorCutoutNoCull(thisETFPlayerTexture.baseEnchantIdentifier), false, true); arm.render(matrices, vc3, light, OverlayTexture.DEFAULT_UV); sleeve.render(matrices, vc3, light, OverlayTexture.DEFAULT_UV); - if (ETFVersionDifferenceHandler.isThisModLoaded("skinlayers") || ETFVersionDifferenceHandler.isThisModLoaded("skinlayers3d")) { + if (ETFClientCommon.SKIN_LAYERS_DETECTED) { try { // handler class is only ever accessed if the mod is present // prevents NoClassDefFoundError diff --git a/common/src/main/java/traben/entity_texture_features/mixin/mods/Mixin3DSkinLayersBody.java b/common/src/main/java/traben/entity_texture_features/mixin/mods/Mixin3DSkinLayersBody.java new file mode 100644 index 00000000..4d1199e3 --- /dev/null +++ b/common/src/main/java/traben/entity_texture_features/mixin/mods/Mixin3DSkinLayersBody.java @@ -0,0 +1,56 @@ +package traben.entity_texture_features.mixin.mods; + +import dev.tr7zw.skinlayers.accessor.PlayerSettings; +import dev.tr7zw.skinlayers.renderlayers.BodyLayerFeatureRenderer; +import net.minecraft.client.network.AbstractClientPlayerEntity; +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.entity.LivingEntityRenderer; +import net.minecraft.client.render.item.ItemRenderer; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.util.Identifier; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import traben.entity_texture_features.ETFClientCommon; +import traben.entity_texture_features.features.ETFManager; +import traben.entity_texture_features.features.player.ETFPlayerTexture; + +import static traben.entity_texture_features.ETFClientCommon.ETFConfigData; + +@Pseudo +@Mixin(BodyLayerFeatureRenderer.class) +public abstract class Mixin3DSkinLayersBody { + + + @Shadow public abstract void renderLayers(AbstractClientPlayerEntity abstractClientPlayer, PlayerSettings settings, MatrixStack matrixStack, VertexConsumer vertices, int light, int overlay); + + @Inject(method = "render(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ILnet/minecraft/client/network/AbstractClientPlayerEntity;FFFFFF)V", + at = @At(value = "INVOKE", + target = "Ldev/tr7zw/skinlayers/renderlayers/BodyLayerFeatureRenderer;renderLayers(Lnet/minecraft/client/network/AbstractClientPlayerEntity;Ldev/tr7zw/skinlayers/accessor/PlayerSettings;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumer;II)V", + shift = At.Shift.AFTER)) + private void etf$renderETFHead(MatrixStack poseStack, VertexConsumerProvider multiBufferSource, int i, AbstractClientPlayerEntity player, float f, float g, float h, float j, float k, float l, CallbackInfo ci) { + if (ETFConfigData != null && ETFConfigData.use3DSkinLayerPatch) { + ETFPlayerTexture thisETF = ETFManager.getInstance().getPlayerTexture(player, player.getSkinTextures().texture()); + if (thisETF != null && thisETF.hasFeatures) { + int overlay = LivingEntityRenderer.getOverlay(player, 0.0F); + Identifier emissiveSkin = thisETF.getBaseTextureEmissiveIdentifierOrNullForNone(); + if (emissiveSkin != null) { + VertexConsumer emissive = multiBufferSource.getBuffer(RenderLayer.getEntityTranslucentCull(emissiveSkin)); + renderLayers(player, (PlayerSettings) player, poseStack, emissive, ETFClientCommon.EMISSIVE_FEATURE_LIGHT_VALUE, overlay); + } + Identifier enchantSkin = thisETF.getBaseTextureEnchantIdentifierOrNullForNone(); + if (enchantSkin != null) { + VertexConsumer enchanted = ItemRenderer.getArmorGlintConsumer(multiBufferSource, RenderLayer.getArmorCutoutNoCull(enchantSkin), false, true); + renderLayers(player, (PlayerSettings) player, poseStack, enchanted, i, overlay); + } + } + } + } +} + + diff --git a/common/src/main/java/traben/entity_texture_features/mixin/mods/Mixin3DSkinLayersHead.java b/common/src/main/java/traben/entity_texture_features/mixin/mods/Mixin3DSkinLayersHead.java new file mode 100644 index 00000000..8b30feb8 --- /dev/null +++ b/common/src/main/java/traben/entity_texture_features/mixin/mods/Mixin3DSkinLayersHead.java @@ -0,0 +1,56 @@ +package traben.entity_texture_features.mixin.mods; + +import dev.tr7zw.skinlayers.accessor.PlayerSettings; +import dev.tr7zw.skinlayers.renderlayers.HeadLayerFeatureRenderer; +import net.minecraft.client.network.AbstractClientPlayerEntity; +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.entity.LivingEntityRenderer; +import net.minecraft.client.render.item.ItemRenderer; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.util.Identifier; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import traben.entity_texture_features.ETFClientCommon; +import traben.entity_texture_features.features.ETFManager; +import traben.entity_texture_features.features.player.ETFPlayerTexture; + +import static traben.entity_texture_features.ETFClientCommon.ETFConfigData; + +@Pseudo +@Mixin(HeadLayerFeatureRenderer.class) +public abstract class Mixin3DSkinLayersHead { + + @Shadow + public abstract void renderCustomHelmet(PlayerSettings settings, AbstractClientPlayerEntity abstractClientPlayer, MatrixStack matrixStack, VertexConsumer vertices, int light, int overlay); + + @Inject(method = "render(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ILnet/minecraft/client/network/AbstractClientPlayerEntity;FFFFFF)V", + at = @At(value = "INVOKE", + target = "Ldev/tr7zw/skinlayers/renderlayers/HeadLayerFeatureRenderer;renderCustomHelmet(Ldev/tr7zw/skinlayers/accessor/PlayerSettings;Lnet/minecraft/client/network/AbstractClientPlayerEntity;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumer;II)V", + shift = At.Shift.AFTER)) + private void etf$renderETFHead(MatrixStack poseStack, VertexConsumerProvider multiBufferSource, int i, AbstractClientPlayerEntity player, float f, float g, float h, float j, float k, float l, CallbackInfo ci) { + if (ETFConfigData != null && ETFConfigData.use3DSkinLayerPatch) { + ETFPlayerTexture thisETF = ETFManager.getInstance().getPlayerTexture(player, player.getSkinTextures().texture()); + if (thisETF != null && thisETF.hasFeatures) { + int overlay = LivingEntityRenderer.getOverlay(player, 0.0F); + Identifier emissiveSkin = thisETF.getBaseTextureEmissiveIdentifierOrNullForNone(); + if (emissiveSkin != null) { + VertexConsumer emissive = multiBufferSource.getBuffer(RenderLayer.getEntityTranslucentCull(emissiveSkin)); + renderCustomHelmet((PlayerSettings) player, player, poseStack, emissive, ETFClientCommon.EMISSIVE_FEATURE_LIGHT_VALUE, overlay); + } + Identifier enchantSkin = thisETF.getBaseTextureEnchantIdentifierOrNullForNone(); + if (enchantSkin != null) { + VertexConsumer enchanted = ItemRenderer.getArmorGlintConsumer(multiBufferSource, RenderLayer.getArmorCutoutNoCull(enchantSkin), false, true); + renderCustomHelmet((PlayerSettings) player, player, poseStack, enchanted, i, overlay); + } + } + } + } +} + + diff --git a/common/src/main/java/traben/entity_texture_features/mixin/MixinModelPartSodium.java b/common/src/main/java/traben/entity_texture_features/mixin/mods/MixinModelPartSodium.java similarity index 98% rename from common/src/main/java/traben/entity_texture_features/mixin/MixinModelPartSodium.java rename to common/src/main/java/traben/entity_texture_features/mixin/mods/MixinModelPartSodium.java index b3b013c1..9dab25bd 100644 --- a/common/src/main/java/traben/entity_texture_features/mixin/MixinModelPartSodium.java +++ b/common/src/main/java/traben/entity_texture_features/mixin/mods/MixinModelPartSodium.java @@ -1,4 +1,4 @@ -package traben.entity_texture_features.mixin; +package traben.entity_texture_features.mixin.mods; import me.jellysquid.mods.sodium.client.render.immediate.model.EntityRenderer; import me.jellysquid.mods.sodium.client.render.vertex.VertexConsumerUtils; @@ -19,6 +19,7 @@ import traben.entity_texture_features.ETFClientCommon; import traben.entity_texture_features.features.ETFManager; import traben.entity_texture_features.features.ETFRenderContext; +import traben.entity_texture_features.mixin.MixinModelPart; /** * this is a copy of {@link MixinModelPart} but for sodium's alternative model part render method diff --git a/common/src/main/resources/entity_texture_features-common.mixins.json b/common/src/main/resources/entity_texture_features-common.mixins.json index 0abf1839..fe863edd 100644 --- a/common/src/main/resources/entity_texture_features-common.mixins.json +++ b/common/src/main/resources/entity_texture_features-common.mixins.json @@ -32,9 +32,11 @@ "entity.renderer.feature.MixinMooshroomMushroomFeatureRenderer", "entity.renderer.feature.MixinShoulderParrotFeatureRenderer", "entity.renderer.feature.MixinWardenFeatureRenderer", + "mods.Mixin3DSkinLayersBody", + "mods.Mixin3DSkinLayersHead", + "mods.MixinModelPartSodium", "reloading.MixinMinecraftClient", - "reloading.MixinResourceReload", - "MixinModelPartSodium" + "reloading.MixinResourceReload" ], "mixins": [ ], diff --git a/fabric/build.gradle b/fabric/build.gradle index 14749642..52e39af2 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -2,7 +2,7 @@ plugins { id "com.github.johnrengelman.shadow" version "8.1.1" } -archivesBaseName = rootProject.archives_base_name + "_fabric_1.20.3" +archivesBaseName = rootProject.archives_base_name + "_fabric_1.20.4" architectury { platformSetupLoomIde() diff --git a/forge/build.gradle b/forge/build.gradle index 80d6a396..b25f0f52 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -2,7 +2,7 @@ plugins { id "com.github.johnrengelman.shadow" version "8.1.1" } -archivesBaseName = rootProject.archives_base_name + "_forge_1.20.3" +archivesBaseName = rootProject.archives_base_name + "_forge_1.20.4" architectury { platformSetupLoomIde() diff --git a/gradle.properties b/gradle.properties index a8f010ba..cb7c3040 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,16 +1,16 @@ org.gradle.jvmargs=-Xmx4096M enabled_platforms=fabric archives_base_name=entity_texture_features -mod_version=5.0 +mod_version=5.0.1 maven_group=traben.entity_texture_features architectury_version=5.6.22 fabric_loader_version=0.15.0 -fabric_api_version=0.91.1+1.20.3 +fabric_api_version=0.91.1+1.20.4 modmenu_version=TwfjidT5 forge_version=1.20.2-48.0.33 neoforge_version=20.3.1-beta -minecraft_version=1.20.3 -yarn_mappings=1.20.3+build.1 +minecraft_version=1.20.4 +yarn_mappings=1.20.4+build.1 skinlayers_version=q77puo5I skinlayers_version_forge=42BoJdTc sodium_version=zPwAvKCF \ No newline at end of file diff --git a/neoforge/build.gradle b/neoforge/build.gradle index e77a0025..9f7a9d14 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -2,7 +2,7 @@ plugins { id "com.github.johnrengelman.shadow" version "8.1.1" } -archivesBaseName = rootProject.archives_base_name + "_neoforge_1.20.3" +archivesBaseName = rootProject.archives_base_name + "_neoforge_1.20.4" architectury { platformSetupLoomIde()