From dd630248dd39e9b0f158f4dc1cf3acd52f385df7 Mon Sep 17 00:00:00 2001 From: Sollace Date: Mon, 20 Mar 2023 18:44:53 +0000 Subject: [PATCH] Fixed texturing bugs with magic rendering --- .../client/mixin/MixinItemRenderer.java | 35 ------------ .../client/mixin/MixinSpriteIdentifier.java | 36 ------------ .../mixin/MixinTexturedRenderLayers.java | 29 ---------- .../model/entity/race/EarthPonyModel.java | 4 +- .../client/render/LevitatingItemRenderer.java | 57 +++++-------------- .../client/render/MagicGlow.java | 6 +- .../blockentity/skull/PonySkullRenderer.java | 5 +- .../render/entity/PlayerPonyRenderer.java | 4 +- .../entity/feature/GlowingItemFeature.java | 2 +- .../client/util/render/RenderLayerUtil.java | 14 +++++ src/main/resources/minelp.aw | 11 +++- src/main/resources/minelp.mixin.json | 3 - 12 files changed, 47 insertions(+), 159 deletions(-) delete mode 100644 src/main/java/com/minelittlepony/client/mixin/MixinItemRenderer.java delete mode 100644 src/main/java/com/minelittlepony/client/mixin/MixinSpriteIdentifier.java delete mode 100644 src/main/java/com/minelittlepony/client/mixin/MixinTexturedRenderLayers.java create mode 100644 src/main/java/com/minelittlepony/client/util/render/RenderLayerUtil.java diff --git a/src/main/java/com/minelittlepony/client/mixin/MixinItemRenderer.java b/src/main/java/com/minelittlepony/client/mixin/MixinItemRenderer.java deleted file mode 100644 index ea3b02fb..00000000 --- a/src/main/java/com/minelittlepony/client/mixin/MixinItemRenderer.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.minelittlepony.client.mixin; - -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 com.minelittlepony.client.render.LevitatingItemRenderer; - -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.item.ItemRenderer; - -@Mixin(ItemRenderer.class) -abstract class MixinItemRenderer { - private static final String VertexConsumerProvider = "Lnet/minecraft/client/render/VertexConsumerProvider;"; - private static final String VertexConsumer = "Lnet/minecraft/client/render/VertexConsumer;"; - private static final String RenderLayer = "Lnet/minecraft/client/render/RenderLayer;"; - - private static final String Boolean = "Z"; - - private static final String PARAMS = "(" + VertexConsumerProvider + RenderLayer + Boolean + Boolean + ")" + VertexConsumer; - - @Inject(method = { - "getArmorGlintConsumer" + PARAMS, - "getItemGlintConsumer" + PARAMS, - "getDirectItemGlintConsumer" + PARAMS - }, at = @At("HEAD"), cancellable = true) - private static void onGetArmorVertexConsumer(VertexConsumerProvider provider, RenderLayer layer, boolean solid, boolean glint, CallbackInfoReturnable info) { - if (LevitatingItemRenderer.isEnabled()) { - info.setReturnValue(provider.getBuffer(LevitatingItemRenderer.getRenderLayer())); - } - } -} diff --git a/src/main/java/com/minelittlepony/client/mixin/MixinSpriteIdentifier.java b/src/main/java/com/minelittlepony/client/mixin/MixinSpriteIdentifier.java deleted file mode 100644 index b3b54167..00000000 --- a/src/main/java/com/minelittlepony/client/mixin/MixinSpriteIdentifier.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.minelittlepony.client.mixin; - -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.util.SpriteIdentifier; -import net.minecraft.util.Identifier; - -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 com.minelittlepony.client.render.LevitatingItemRenderer; - -import java.util.function.Function; - -@Mixin(SpriteIdentifier.class) -abstract class MixinSpriteIdentifier { - - @Inject(method = "getVertexConsumer(" - + "Lnet/minecraft/client/render/VertexConsumerProvider;" - + "Ljava/util/function/Function;" - + ")" - + "Lnet/minecraft/client/render/VertexConsumer;", - at = @At("HEAD"), - cancellable = true - ) - public void onGetBuffer(VertexConsumerProvider provider, Function layerFunction, CallbackInfoReturnable info) { - if (LevitatingItemRenderer.isEnabled()) { - SpriteIdentifier self = (SpriteIdentifier)(Object)this; - - info.setReturnValue(self.getSprite().getTextureSpecificVertexConsumer(provider.getBuffer(LevitatingItemRenderer.getRenderLayer(self.getAtlasId())))); - } - } -} diff --git a/src/main/java/com/minelittlepony/client/mixin/MixinTexturedRenderLayers.java b/src/main/java/com/minelittlepony/client/mixin/MixinTexturedRenderLayers.java deleted file mode 100644 index 143d6f63..00000000 --- a/src/main/java/com/minelittlepony/client/mixin/MixinTexturedRenderLayers.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.minelittlepony.client.mixin; - -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.TexturedRenderLayers; - -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 com.minelittlepony.client.render.LevitatingItemRenderer; - -@Mixin(TexturedRenderLayers.class) -abstract class MixinTexturedRenderLayers { - - @Inject(method = "getEntityCutout()Lnet/minecraft/client/render/RenderLayer;", at = @At("HEAD"), cancellable = true) - private static void onGetItemOpaque(CallbackInfoReturnable info) { - if (LevitatingItemRenderer.isEnabled()) { - info.setReturnValue(LevitatingItemRenderer.getRenderLayer()); - } - } - - @Inject(method = "getEntityTranslucentCull()Lnet/minecraft/client/render/RenderLayer;", at = @At("HEAD"), cancellable = true) - private static void onGetItemTranslucent(CallbackInfoReturnable info) { - if (LevitatingItemRenderer.isEnabled()) { - info.setReturnValue(LevitatingItemRenderer.getRenderLayer()); - } - } -} diff --git a/src/main/java/com/minelittlepony/client/model/entity/race/EarthPonyModel.java b/src/main/java/com/minelittlepony/client/model/entity/race/EarthPonyModel.java index d1b26efe..150baff6 100644 --- a/src/main/java/com/minelittlepony/client/model/entity/race/EarthPonyModel.java +++ b/src/main/java/com/minelittlepony/client/model/entity/race/EarthPonyModel.java @@ -26,8 +26,8 @@ public class EarthPonyModel extends AbstractPonyModel super.init(context); tail = addPart(context.findByName("tail")); - addPart(context.findByName("snout")); - addPart(context.findByName("ears")); + snout = addPart(context.findByName("snout")); + ears = addPart(context.findByName("ears")); bodyRenderList.add(forPart(tail)); } diff --git a/src/main/java/com/minelittlepony/client/render/LevitatingItemRenderer.java b/src/main/java/com/minelittlepony/client/render/LevitatingItemRenderer.java index 1285d5c7..cd8af3dc 100644 --- a/src/main/java/com/minelittlepony/client/render/LevitatingItemRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/LevitatingItemRenderer.java @@ -2,13 +2,12 @@ package com.minelittlepony.client.render; import com.minelittlepony.api.pony.IPony; import com.minelittlepony.client.MineLittlePony; -import com.minelittlepony.common.util.Color; +import com.minelittlepony.client.util.render.RenderLayerUtil; import org.jetbrains.annotations.Nullable; import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.OverlayTexture; -import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.item.ItemRenderer; import net.minecraft.client.render.model.json.ModelTransformationMode; @@ -18,59 +17,36 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.screen.PlayerScreenHandler; import net.minecraft.util.Arm; -import net.minecraft.util.Identifier; import net.minecraft.util.UseAction; import net.minecraft.util.math.RotationAxis; import net.minecraft.world.World; public class LevitatingItemRenderer { - - private static int tint; - private static boolean enabled; - - public static boolean isEnabled() { - return enabled; - } - - public static RenderLayer getRenderLayer(Identifier texture) { - if (!isEnabled()) { - return RenderLayer.getEntityTranslucent(texture); - } - return MagicGlow.getTintedTexturedLayer(texture, Color.r(tint), Color.g(tint), Color.b(tint), 0.8F); - } - - public static RenderLayer getRenderLayer() { - return getRenderLayer(PlayerScreenHandler.BLOCK_ATLAS_TEXTURE); - } - /** * Renders a magical overlay over an item in third person. */ - public void renderItemGlow(LivingEntity entity, ItemStack drop, ModelTransformationMode transform, Arm hand, int glowColor, MatrixStack stack, VertexConsumerProvider renderContext) { - setColor(glowColor); + public void renderItemGlow(IPony pony, LivingEntity entity, ItemStack drop, ModelTransformationMode transform, Arm hand, int glowColor, MatrixStack stack, VertexConsumerProvider renderContext) { stack.push(); - ItemRenderer renderItem = MinecraftClient.getInstance().getItemRenderer(); + ItemRenderer renderer = MinecraftClient.getInstance().getItemRenderer(); stack.scale(1.1F, 1.1F, 1.1F); - stack.translate(0.01F, 0.01F, 0.01F); - renderItem.renderItem(entity, drop, transform, hand == Arm.LEFT, stack, renderContext, entity.world, 0x0F00F0, OverlayTexture.DEFAULT_UV, 0); + VertexConsumerProvider interceptedContext = getProvider(pony, renderContext); + + renderer.renderItem(entity, drop, transform, hand == Arm.LEFT, stack, interceptedContext, entity.world, 0x0F00F0, OverlayTexture.DEFAULT_UV, 0); stack.translate(-0.02F, -0.02F, -0.02F); - renderItem.renderItem(entity, drop, transform, hand == Arm.LEFT, stack, renderContext, entity.world, 0x0F00F0, OverlayTexture.DEFAULT_UV, 0); + renderer.renderItem(entity, drop, transform, hand == Arm.LEFT, stack, interceptedContext, entity.world, 0x0F00F0, OverlayTexture.DEFAULT_UV, 0); stack.pop(); - unsetColor(); } - private void setColor(int glowColor) { - enabled = true; - tint = glowColor; - } - - private void unsetColor() { - enabled = false; + private VertexConsumerProvider getProvider(IPony pony, VertexConsumerProvider renderContext) { + final int color = pony.metadata().getGlowColor(); + return layer -> { + return renderContext.getBuffer(MagicGlow.getColoured(RenderLayerUtil.getTexture(layer).orElse(PlayerScreenHandler.BLOCK_ATLAS_TEXTURE), color)); + }; } /** @@ -93,17 +69,14 @@ public class LevitatingItemRenderer { itemRenderer.renderItem(entity, stack, mode, left, matrix, renderContext, world, lightUv, OverlayTexture.DEFAULT_UV, posLong); if (doMagic) { - setColor(pony.metadata().getGlowColor()); + VertexConsumerProvider interceptedContext = getProvider(pony, renderContext); matrix.scale(1.1F, 1.1F, 1.1F); - matrix.translate(0.015F, 0.01F, 0.01F); - itemRenderer.renderItem(entity, stack, mode, left, matrix, renderContext, world, lightUv, OverlayTexture.DEFAULT_UV, posLong); + itemRenderer.renderItem(entity, stack, mode, left, matrix, interceptedContext, world, lightUv, OverlayTexture.DEFAULT_UV, posLong); matrix.translate(-0.03F, -0.02F, -0.02F); - itemRenderer.renderItem(entity, stack, mode, left, matrix, renderContext, world, lightUv, OverlayTexture.DEFAULT_UV, posLong); - - unsetColor(); + itemRenderer.renderItem(entity, stack, mode, left, matrix, interceptedContext, world, lightUv, OverlayTexture.DEFAULT_UV, posLong); } matrix.pop(); diff --git a/src/main/java/com/minelittlepony/client/render/MagicGlow.java b/src/main/java/com/minelittlepony/client/render/MagicGlow.java index da2f4550..11009f55 100644 --- a/src/main/java/com/minelittlepony/client/render/MagicGlow.java +++ b/src/main/java/com/minelittlepony/client/render/MagicGlow.java @@ -42,8 +42,8 @@ public abstract class MagicGlow extends RenderPhase { return MAGIC; } - public static RenderLayer getTintedTexturedLayer(Identifier texture, float red, float green, float blue, float alpha) { - return TINTED_LAYER.apply(texture, Color.argbToHex(alpha, red, green, blue)); + public static RenderLayer getColoured(Identifier texture, int color) { + return TINTED_LAYER.apply(texture, color); } private static class Colored extends Texture { @@ -58,7 +58,7 @@ public abstract class MagicGlow extends RenderPhase { this.red = Color.r(color); this.green = Color.g(color); this.blue = Color.b(color); - this.alpha = Color.a(color); + this.alpha = 0.8F; } @Override diff --git a/src/main/java/com/minelittlepony/client/render/blockentity/skull/PonySkullRenderer.java b/src/main/java/com/minelittlepony/client/render/blockentity/skull/PonySkullRenderer.java index 9ea0a843..91f03ce2 100644 --- a/src/main/java/com/minelittlepony/client/render/blockentity/skull/PonySkullRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/blockentity/skull/PonySkullRenderer.java @@ -5,7 +5,6 @@ import com.minelittlepony.api.config.PonyConfig; import com.minelittlepony.api.pony.IPony; import com.minelittlepony.client.MineLittlePony; import com.minelittlepony.client.model.ModelType; -import com.minelittlepony.client.render.LevitatingItemRenderer; import com.minelittlepony.client.render.MobRenderers; import com.minelittlepony.client.render.entity.SkeleponyRenderer; import com.minelittlepony.client.render.entity.ZomponyRenderer; @@ -40,7 +39,7 @@ public class PonySkullRenderer { private static void loadSkulls(Map skullMap) { skullMap.put(SkullBlock.Type.SKELETON, new MobSkull(SkeleponyRenderer.SKELETON, MobRenderers.SKELETON, ModelType.SKELETON)); - skullMap.put(SkullBlock.Type.WITHER_SKELETON, new MobSkull(SkeleponyRenderer.WITHER, MobRenderers.SKELETON, ModelType.ENDERMAN)); + skullMap.put(SkullBlock.Type.WITHER_SKELETON, new MobSkull(SkeleponyRenderer.WITHER, MobRenderers.SKELETON, ModelType.SKELETON)); skullMap.put(SkullBlock.Type.ZOMBIE, new MobSkull(ZomponyRenderer.ZOMBIE, MobRenderers.ZOMBIE, ModelType.ZOMBIE)); skullMap.put(SkullBlock.Type.PLAYER, new PlayerPonySkull()); } @@ -57,7 +56,7 @@ public class PonySkullRenderer { selectedSkull = skull; selectedSkin = skull.getSkinResource(profile); - return LevitatingItemRenderer.getRenderLayer(selectedSkin); + return RenderLayer.getEntityTranslucent(selectedSkin); } public static boolean renderSkull(@Nullable Direction direction, diff --git a/src/main/java/com/minelittlepony/client/render/entity/PlayerPonyRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/PlayerPonyRenderer.java index 8fc17d99..3dbfe7e4 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/PlayerPonyRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/PlayerPonyRenderer.java @@ -23,9 +23,7 @@ import java.util.List; import net.minecraft.block.BedBlock; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.AbstractClientPlayerEntity; -import net.minecraft.client.render.Frustum; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.*; import net.minecraft.client.render.entity.EntityRendererFactory; import net.minecraft.client.render.entity.PlayerEntityRenderer; import net.minecraft.client.render.entity.feature.*; diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/GlowingItemFeature.java b/src/main/java/com/minelittlepony/client/render/entity/feature/GlowingItemFeature.java index 2a314807..2513afdd 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/feature/GlowingItemFeature.java +++ b/src/main/java/com/minelittlepony/client/render/entity/feature/GlowingItemFeature.java @@ -73,7 +73,7 @@ public class GlowingItemFeature @Override protected void postItemRender(T entity, ItemStack drop, ModelTransformationMode transform, Arm hand, MatrixStack stack, VertexConsumerProvider renderContext) { if (isUnicorn()) { - PonyRenderDispatcher.getInstance().getMagicRenderer().renderItemGlow(entity, drop, transform, hand, ((IUnicorn)getContextModel()).getMagicColor(), stack, renderContext); + PonyRenderDispatcher.getInstance().getMagicRenderer().renderItemGlow(getContext().getEntityPony(entity), entity, drop, transform, hand, ((IUnicorn)getContextModel()).getMagicColor(), stack, renderContext); } } } diff --git a/src/main/java/com/minelittlepony/client/util/render/RenderLayerUtil.java b/src/main/java/com/minelittlepony/client/util/render/RenderLayerUtil.java new file mode 100644 index 00000000..69e5b3b2 --- /dev/null +++ b/src/main/java/com/minelittlepony/client/util/render/RenderLayerUtil.java @@ -0,0 +1,14 @@ +package com.minelittlepony.client.util.render; + +import java.util.Optional; +import net.minecraft.client.render.*; +import net.minecraft.util.Identifier; + +public interface RenderLayerUtil { + static Optional getTexture(RenderLayer layer) { + if (layer instanceof RenderLayer.MultiPhase multiphase) { + return multiphase.getPhases().texture.getId(); + } + return Optional.empty(); + } +} diff --git a/src/main/resources/minelp.aw b/src/main/resources/minelp.aw index 23f69965..7b2e3e2a 100644 --- a/src/main/resources/minelp.aw +++ b/src/main/resources/minelp.aw @@ -1,4 +1,11 @@ accessWidener v1 named accessible class net/minecraft/client/render/RenderLayer$MultiPhaseParameters -accessible method net/minecraft/client/render/RenderLayer of (Ljava/lang/String;Lnet/minecraft/client/render/VertexFormat;Lnet/minecraft/client/render/VertexFormat$DrawMode;ILnet/minecraft/client/render/RenderLayer$MultiPhaseParameters;)Lnet/minecraft/client/render/RenderLayer$MultiPhase; -accessible method net/minecraft/client/render/RenderLayer of (Ljava/lang/String;Lnet/minecraft/client/render/VertexFormat;Lnet/minecraft/client/render/VertexFormat$DrawMode;IZZLnet/minecraft/client/render/RenderLayer$MultiPhaseParameters;)Lnet/minecraft/client/render/RenderLayer$MultiPhase; +accessible class net/minecraft/client/render/RenderPhase$TextureBase +accessible class net/minecraft/client/render/VertexConsumers$Union + +accessible method net/minecraft/client/render/RenderLayer of (Ljava/lang/String;Lnet/minecraft/client/render/VertexFormat;Lnet/minecraft/client/render/VertexFormat$DrawMode;ILnet/minecraft/client/render/RenderLayer$MultiPhaseParameters;)Lnet/minecraft/client/render/RenderLayer$MultiPhase; +accessible method net/minecraft/client/render/RenderLayer of (Ljava/lang/String;Lnet/minecraft/client/render/VertexFormat;Lnet/minecraft/client/render/VertexFormat$DrawMode;IZZLnet/minecraft/client/render/RenderLayer$MultiPhaseParameters;)Lnet/minecraft/client/render/RenderLayer$MultiPhase; + +accessible method net/minecraft/client/render/RenderLayer$MultiPhase getPhases ()Lnet/minecraft/client/render/RenderLayer$MultiPhaseParameters; +accessible method net/minecraft/client/render/RenderPhase$TextureBase getId ()Ljava/util/Optional; +accessible field net/minecraft/client/render/RenderLayer$MultiPhaseParameters texture Lnet/minecraft/client/render/RenderPhase$TextureBase; diff --git a/src/main/resources/minelp.mixin.json b/src/main/resources/minelp.mixin.json index d9a6f575..df844702 100644 --- a/src/main/resources/minelp.mixin.json +++ b/src/main/resources/minelp.mixin.json @@ -12,9 +12,6 @@ "MixinEntityRenderers", "MixinSkullBlockEntityRenderer", "MixinHeldItemRenderer", - "MixinItemRenderer", - "MixinTexturedRenderLayers", - "MixinSpriteIdentifier", "MixinClientPlayerEntity", "MixinPlayerMoveC2SPacket", "MixinPlayerPositionLookS2CPacket"