diff --git a/src/main/java/com/minelittlepony/client/mixin/MixinClass_4722.java b/src/main/java/com/minelittlepony/client/mixin/MixinClass_4722.java index cb534745..b0d2b18d 100644 --- a/src/main/java/com/minelittlepony/client/mixin/MixinClass_4722.java +++ b/src/main/java/com/minelittlepony/client/mixin/MixinClass_4722.java @@ -12,8 +12,16 @@ import com.minelittlepony.client.render.LevitatingItemRenderer; @Mixin(class_4722.class) abstract class MixinClass_4722 { + + @Inject(method = "method_24074()Lnet/minecraft/client/render/RenderLayer;", at = @At("HEAD"), cancellable = true) + private static void onGetItemOpaque(CallbackInfoReturnable info) { + if (LevitatingItemRenderer.usesTransparency()) { + info.setReturnValue(LevitatingItemRenderer.getRenderLayer()); + } + } + @Inject(method = "method_24075()Lnet/minecraft/client/render/RenderLayer;", at = @At("HEAD"), cancellable = true) - private static void onGetEntityTranslucent(CallbackInfoReturnable info) { + private static void onGetItemTranslucent(CallbackInfoReturnable info) { if (LevitatingItemRenderer.usesTransparency()) { info.setReturnValue(LevitatingItemRenderer.getRenderLayer()); } diff --git a/src/main/java/com/minelittlepony/client/mixin/MixinClass_4730.java b/src/main/java/com/minelittlepony/client/mixin/MixinClass_4730.java new file mode 100644 index 00000000..1a76a535 --- /dev/null +++ b/src/main/java/com/minelittlepony/client/mixin/MixinClass_4730.java @@ -0,0 +1,36 @@ +package com.minelittlepony.client.mixin; + +import net.minecraft.class_4730; +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.render.VertexConsumerProvider; +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(class_4730.class) +abstract class MixinClass_4730 { + + @Inject(method = "method_24145(" + + "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.usesTransparency()) { + class_4730 self = (class_4730)(Object)this; + + info.setReturnValue(self.method_24148().method_24108(provider.getBuffer(LevitatingItemRenderer.getRenderLayer(self.method_24144())))); + } + } +} diff --git a/src/main/java/com/minelittlepony/client/mixin/MixinFirstPersonRenderer.java b/src/main/java/com/minelittlepony/client/mixin/MixinFirstPersonRenderer.java index 7f00ff8c..ef6ce574 100644 --- a/src/main/java/com/minelittlepony/client/mixin/MixinFirstPersonRenderer.java +++ b/src/main/java/com/minelittlepony/client/mixin/MixinFirstPersonRenderer.java @@ -11,32 +11,38 @@ import javax.annotation.Nullable; import net.minecraft.client.network.AbstractClientPlayerEntity; import net.minecraft.client.render.FirstPersonRenderer; import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.model.json.ModelTransformation; +import net.minecraft.client.render.model.json.ModelTransformation.Type; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.LivingEntity; import net.minecraft.item.ItemStack; import net.minecraft.world.World; +import net.minecraft.client.render.item.ItemRenderer; @Mixin(FirstPersonRenderer.class) abstract class MixinFirstPersonRenderer { - @Redirect(method = "renderFirstPersonItem(" - + "Lnet/minecraft/client/network/AbstractClientPlayerEntity;FF" - + "Lnet/minecraft/util/Hand;F" - + "Lnet/minecraft/item/ItemStack;F)V", + private static final String LivingEntity = "Lnet/minecraft/entity/LivingEntity;"; + private static final String MatrixStack = "Lnet/minecraft/client/util/math/MatrixStack;"; + private static final String ItemStack = "Lnet/minecraft/item/ItemStack;"; + private static final String Type = "Lnet/minecraft/client/render/model/json/ModelTransformation$Type;"; + private static final String VertexConsumerProvider = "Lnet/minecraft/client/render/VertexConsumerProvider;"; + private static final String World = "Lnet/minecraft/world/World;"; + private static final String ItemRenderer = "Lnet/minecraft/client/render/item/ItemRenderer;"; + + private static final String Boolean = "Z"; + private static final String Int = "I"; + + @Redirect(method = "renderItem(" + LivingEntity + ItemStack + Type + Boolean + MatrixStack + VertexConsumerProvider + Int + ")V", at = @At(value = "INVOKE", - target = "Lnet/minecraft/client/render/item/ItemRenderer;method_23177(" - + "Lnet/minecraft/entity/LivingEntity;" - + "Lnet/minecraft/item/ItemStack;" - + "Lnet/minecraft/client/render/model/json/ModelTransformation$Type;" - + "Z" - + "Lnet/minecraft/client/util/math/MatrixStack;" - + "Lnet/minecraft/client/render/VertexConsumerProvider;" - + "Lnet/minecraft/world/World;" - + "I" - + "I)V")) - private void redirectRenderItemSide(FirstPersonRenderer self, - @Nullable LivingEntity entity, ItemStack item, ModelTransformation.Type transform, boolean left, - MatrixStack stack, VertexConsumerProvider renderContext, @Nullable World world, int lightUv, int overlayUv) { - PonyRenderManager.getInstance().getMagicRenderer().renderItemInFirstPerson(self, (AbstractClientPlayerEntity)entity, item, transform, left, stack, renderContext, world, lightUv); + target = ItemRenderer + "method_23177(" + LivingEntity + ItemStack + Type + Boolean + MatrixStack + VertexConsumerProvider + World + Int + Int + ")V")) + private void redirectRenderItem(ItemRenderer target, + @Nullable LivingEntity entity, + ItemStack item, + Type transform, + boolean left, + MatrixStack stack, + VertexConsumerProvider renderContext, + @Nullable World world, + int lightUv, int overlayUv) { + PonyRenderManager.getInstance().getMagicRenderer().renderItemInFirstPerson(target, (AbstractClientPlayerEntity)entity, item, transform, left, stack, renderContext, world, lightUv); } } 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 bd38efaa..00000000 --- a/src/main/java/com/minelittlepony/client/mixin/MixinItemRenderer.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.minelittlepony.client.mixin; - -import com.minelittlepony.client.render.LevitatingItemRenderer; - -import net.minecraft.client.render.item.ItemRenderer; -import net.minecraft.client.texture.TextureManager; -import net.minecraft.resource.SynchronousResourceReloadListener; - -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.ModifyArg; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(ItemRenderer.class) -abstract class MixinItemRenderer implements SynchronousResourceReloadListener { - - @Inject(method = "Lnet/minecraft/client/render/item/ItemRenderer;renderGlint(" - + "Lnet/minecraft/client/texture/TextureManager;" - + "Ljava/lang/Runnable;I)V", - at = @At("HEAD"), - cancellable = true) - private static void onRenderGlint(TextureManager manager, Runnable task, int i, CallbackInfo info) { - if (LevitatingItemRenderer.usesTransparency()) { - info.cancel(); - } - } - - @ModifyArg(method = "renderQuads(" - + "Lnet/minecraft/client/render/BufferBuilder;" - + "Ljava/util/List;I" - + "Lnet/minecraft/item/ItemStack;)V", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/client/render/item/ItemRenderer;renderQuad(" - + "Lnet/minecraft/client/render/BufferBuilder;" - + "Lnet/minecraft/client/render/model/BakedQuad;I)V"), - index = 2) - private int modifyItemRenderTint(int color) { - return LevitatingItemRenderer.usesTransparency() ? -1 : color; - } -} diff --git a/src/main/java/com/minelittlepony/client/render/LevitatingItemRenderer.java b/src/main/java/com/minelittlepony/client/render/LevitatingItemRenderer.java index 0c6c7699..a8f4bf74 100644 --- a/src/main/java/com/minelittlepony/client/render/LevitatingItemRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/LevitatingItemRenderer.java @@ -8,17 +8,18 @@ import javax.annotation.Nullable; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.AbstractClientPlayerEntity; -import net.minecraft.client.render.FirstPersonRenderer; 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.ModelTransformation; +import net.minecraft.client.texture.SpriteAtlasTexture; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.Vector3f; import net.minecraft.entity.LivingEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.Arm; +import net.minecraft.util.Identifier; import net.minecraft.util.UseAction; import net.minecraft.world.World; @@ -31,8 +32,15 @@ public class LevitatingItemRenderer { return usingTransparency; } + public static RenderLayer getRenderLayer(Identifier texture) { + if (!usesTransparency()) { + return RenderLayer.getEntityTranslucent(texture); + } + return MagicGlow.getTintedTexturedLayer(texture, Color.r(tint), Color.g(tint), Color.b(tint), 0.8F); + } + public static RenderLayer getRenderLayer() { - return MagicGlow.getTintedLayer(Color.r(tint), Color.g(tint), Color.b(tint), 0.8F); + return getRenderLayer(SpriteAtlasTexture.BLOCK_ATLAS_TEX); } /** @@ -68,15 +76,13 @@ public class LevitatingItemRenderer { /** * Renders an item in first person optionally with a magical overlay. */ - public void renderItemInFirstPerson(FirstPersonRenderer renderer, @Nullable AbstractClientPlayerEntity entity, ItemStack stack, ModelTransformation.Type transform, boolean left, MatrixStack matrix, VertexConsumerProvider renderContext, @Nullable World world, int lightUv) { + public void renderItemInFirstPerson(ItemRenderer itemRenderer, @Nullable AbstractClientPlayerEntity entity, ItemStack stack, ModelTransformation.Type transform, boolean left, MatrixStack matrix, VertexConsumerProvider renderContext, @Nullable World world, int lightUv) { IPony pony = MineLittlePony.getInstance().getManager().getPony(entity); matrix.push(); boolean doMagic = MineLittlePony.getInstance().getConfig().fpsmagic.get() && pony.getMetadata().hasMagic(); - ItemRenderer itemRenderer = MinecraftClient.getInstance().getItemRenderer(); - if (doMagic) { setupPerspective(itemRenderer, entity, stack, left, matrix); } diff --git a/src/main/java/com/minelittlepony/client/render/MagicGlow.java b/src/main/java/com/minelittlepony/client/render/MagicGlow.java index fb7697e9..b954e736 100644 --- a/src/main/java/com/minelittlepony/client/render/MagicGlow.java +++ b/src/main/java/com/minelittlepony/client/render/MagicGlow.java @@ -3,7 +3,7 @@ package com.minelittlepony.client.render; import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.RenderPhase; import net.minecraft.client.render.VertexFormats; -import net.minecraft.client.texture.SpriteAtlasTexture; +import net.minecraft.util.Identifier; import com.mojang.blaze3d.platform.GlStateManager.DestFactor; import com.mojang.blaze3d.platform.GlStateManager.SourceFactor; @@ -36,9 +36,9 @@ public class MagicGlow extends RenderPhase { return MAGIC; } - public static RenderLayer getTintedLayer(float red, float green, float blue, float alpha) { + public static RenderLayer getTintedTexturedLayer(Identifier texture, float red, float green, float blue, float alpha) { return RenderLayer.method_24049("mlp_tint_layer", VertexFormats.POSITION_COLOR_TEXTURE_OVERLAY_LIGHT_NORMAL, 7, 256, true, true, RenderLayer.MultiPhaseData.builder() - .texture(new Color(red, green, blue, alpha)) + .texture(new Color(texture, red, green, blue, alpha)) .writeMaskState(COLOR_MASK) .alpha(ONE_TENTH_ALPHA) .transparency(GLOWING_TRANSPARENCY) @@ -55,8 +55,8 @@ public class MagicGlow extends RenderPhase { private final float blue; private final float alpha; - public Color(float red, float green, float blue, float alpha) { - super(SpriteAtlasTexture.BLOCK_ATLAS_TEX, false, false); + public Color(Identifier texture, float red, float green, float blue, float alpha) { + super(texture, false, false); this.red = red; this.green = green; this.blue = blue; 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 b5120568..5b45e2fa 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 @@ -2,6 +2,7 @@ package com.minelittlepony.client.render.blockentity.skull; import com.google.common.collect.Maps; import com.minelittlepony.client.MineLittlePony; +import com.minelittlepony.client.render.LevitatingItemRenderer; import com.minelittlepony.client.render.entity.MobRenderers; import com.minelittlepony.client.render.entity.RenderPonySkeleton; import com.minelittlepony.client.render.entity.RenderPonyZombie; @@ -13,7 +14,6 @@ import com.mojang.authlib.GameProfile; import net.minecraft.block.SkullBlock; import net.minecraft.block.entity.BlockEntityType; import net.minecraft.client.render.OverlayTexture; -import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher; @@ -81,7 +81,7 @@ public class PonySkullRenderer extends SkullBlockEntityRenderer { stack.scale(-1, -1, 1); - VertexConsumer vertices = renderContext.getBuffer(RenderLayer.getEntityTranslucent(skin)); + VertexConsumer vertices = renderContext.getBuffer(LevitatingItemRenderer.getRenderLayer(skin)); skull.setAngles(angle, poweredTicks); skull.render(stack, vertices, lightUv, OverlayTexture.DEFAULT_UV, 1, 1, 1, 1); diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/LayerHeldPonyItem.java b/src/main/java/com/minelittlepony/client/render/entity/feature/LayerHeldPonyItem.java index e0d66333..b39b3dd5 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/feature/LayerHeldPonyItem.java +++ b/src/main/java/com/minelittlepony/client/render/entity/feature/LayerHeldPonyItem.java @@ -5,6 +5,7 @@ import com.minelittlepony.client.render.IPonyRenderContext; import com.minelittlepony.model.BodyPart; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.OverlayTexture; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.client.render.model.json.ModelTransformation; @@ -72,7 +73,7 @@ public class LayerHeldPonyItem stack.translate(left * -0.2F, 0, 0); preItemRender(entity, drop, transform, arm, stack); - MinecraftClient.getInstance().getFirstPersonRenderer().renderItem(entity, drop, transform, arm == Arm.LEFT, stack, renderContext, lightUv); + MinecraftClient.getInstance().getItemRenderer().method_23177(entity, drop, transform, arm == Arm.LEFT, stack, renderContext, entity.world, lightUv, OverlayTexture.DEFAULT_UV); postItemRender(entity, drop, transform, arm, stack, renderContext); stack.pop(); diff --git a/src/main/resources/minelp.mixin.json b/src/main/resources/minelp.mixin.json index 211ceb24..007933be 100644 --- a/src/main/resources/minelp.mixin.json +++ b/src/main/resources/minelp.mixin.json @@ -11,8 +11,8 @@ "MixinEntityRenderDispatcher", "MixinSkullBlockEntityRenderer", "MixinFirstPersonRenderer", - "MixinItemRenderer", "MixinClass_4722", + "MixinClass_4730", "MixinClientPlayerEntity", "MixinPlayerMoveC2SPacket_Both", "MixinPlayerMoveC2SPacket_LookOnly"