From e613886c71b6164cfe1db07527058efd7e6ca220 Mon Sep 17 00:00:00 2001 From: Sollace Date: Fri, 29 Nov 2019 20:11:31 +0200 Subject: [PATCH] Fixed item glows --- .../client/mixin/MixinClass_4722.java | 21 ++++++ .../client/render/LevitatingItemRenderer.java | 28 ++++---- .../client/render/MagicGlow.java | 69 ++++++++++++++++++- src/main/resources/minelp.mixin.json | 1 + 4 files changed, 102 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/minelittlepony/client/mixin/MixinClass_4722.java diff --git a/src/main/java/com/minelittlepony/client/mixin/MixinClass_4722.java b/src/main/java/com/minelittlepony/client/mixin/MixinClass_4722.java new file mode 100644 index 00000000..cb534745 --- /dev/null +++ b/src/main/java/com/minelittlepony/client/mixin/MixinClass_4722.java @@ -0,0 +1,21 @@ +package com.minelittlepony.client.mixin; + +import net.minecraft.class_4722; +import net.minecraft.client.render.RenderLayer; + +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(class_4722.class) +abstract class MixinClass_4722 { + @Inject(method = "method_24075()Lnet/minecraft/client/render/RenderLayer;", at = @At("HEAD"), cancellable = true) + private static void onGetEntityTranslucent(CallbackInfoReturnable info) { + if (LevitatingItemRenderer.usesTransparency()) { + info.setReturnValue(LevitatingItemRenderer.getRenderLayer()); + } + } +} diff --git a/src/main/java/com/minelittlepony/client/render/LevitatingItemRenderer.java b/src/main/java/com/minelittlepony/client/render/LevitatingItemRenderer.java index 0b182b69..0c6c7699 100644 --- a/src/main/java/com/minelittlepony/client/render/LevitatingItemRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/LevitatingItemRenderer.java @@ -2,6 +2,7 @@ package com.minelittlepony.client.render; import com.minelittlepony.client.MineLittlePony; import com.minelittlepony.pony.IPony; +import com.minelittlepony.util.math.Color; import javax.annotation.Nullable; @@ -9,6 +10,7 @@ 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; @@ -22,22 +24,23 @@ import net.minecraft.world.World; public class LevitatingItemRenderer { + static int tint; private static boolean usingTransparency; public static boolean usesTransparency() { return usingTransparency; } + public static RenderLayer getRenderLayer() { + return MagicGlow.getTintedLayer(Color.r(tint), Color.g(tint), Color.b(tint), 0.8F); + } + /** * Renders a magical overlay over an item in third person. */ public void renderItemGlow(LivingEntity entity, ItemStack drop, ModelTransformation.Type transform, Arm hand, int glowColor, MatrixStack stack, VertexConsumerProvider renderContext) { - - // TODO: mixin into RenderLayer.getItemLayer(itemstack) to enable transparency - usingTransparency = true; - - stack.push(); setColor(glowColor); + stack.push(); ItemRenderer renderItem = MinecraftClient.getInstance().getItemRenderer(); @@ -48,19 +51,18 @@ public class LevitatingItemRenderer { stack.translate(-0.02F, -0.02F, -0.02F); renderItem.method_23177(entity, drop, transform, hand == Arm.LEFT, stack, renderContext, entity.world, 0x0F00F0, OverlayTexture.DEFAULT_UV); - - unsetColor(); stack.pop(); - - usingTransparency = false; + unsetColor(); } private void setColor(int glowColor) { - //GL14.glBlendColor(Color.r(glowColor), Color.g(glowColor), Color.b(glowColor), 0.2F); + usingTransparency = true; + tint = glowColor; } private void unsetColor() { - //GL14.glBlendColor(255, 255, 255, 1); + usingTransparency = false; + tint = 0; } /** @@ -82,8 +84,6 @@ public class LevitatingItemRenderer { itemRenderer.method_23177(entity, stack, transform, left, matrix, renderContext, world, lightUv, OverlayTexture.DEFAULT_UV); if (doMagic) { - usingTransparency = true; - setColor(pony.getMetadata().getGlowColor()); matrix.scale(1.1F, 1.1F, 1.1F); @@ -93,8 +93,6 @@ public class LevitatingItemRenderer { matrix.translate(-0.03F, -0.02F, -0.02F); itemRenderer.method_23177(entity, stack, transform, left, matrix, renderContext, world, lightUv, OverlayTexture.DEFAULT_UV); - usingTransparency = false; - unsetColor(); } diff --git a/src/main/java/com/minelittlepony/client/render/MagicGlow.java b/src/main/java/com/minelittlepony/client/render/MagicGlow.java index fe918ae0..fb7697e9 100644 --- a/src/main/java/com/minelittlepony/client/render/MagicGlow.java +++ b/src/main/java/com/minelittlepony/client/render/MagicGlow.java @@ -3,15 +3,31 @@ 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 com.mojang.blaze3d.platform.GlStateManager.DestFactor; +import com.mojang.blaze3d.platform.GlStateManager.SourceFactor; +import com.mojang.blaze3d.systems.RenderSystem; public class MagicGlow extends RenderPhase { private MagicGlow(String name, Runnable beginAction, Runnable endAction) { super(name, beginAction, endAction); } - static final RenderLayer MAGIC = RenderLayer.method_24048("mlp_magic_glow", VertexFormats.POSITION_COLOR_TEXTURE_LIGHT_NORMAL, 7, 256, RenderLayer.MultiPhaseData.builder() + protected static final RenderPhase.Transparency GLOWING_TRANSPARENCY = new RenderPhase.Transparency("glowing_transparency", () -> { + RenderSystem.enableBlend(); + RenderSystem.blendFuncSeparate( + SourceFactor.CONSTANT_COLOR, DestFactor.ONE, + SourceFactor.ONE, DestFactor.ZERO); + }, () -> { + RenderSystem.disableBlend(); + RenderSystem.defaultBlendFunc(); + }); + + private static final RenderLayer MAGIC = RenderLayer.method_24048("mlp_magic_glow", VertexFormats.POSITION_COLOR_TEXTURE_LIGHT_NORMAL, 7, 256, RenderLayer.MultiPhaseData.builder() .texture(NO_TEXTURE) - .transparency(TRANSLUCENT_TRANSPARENCY) + .writeMaskState(COLOR_MASK) + .transparency(LIGHTNING_TRANSPARENCY) .lightmap(DISABLE_LIGHTMAP) .cull(DISABLE_CULLING) .build(false)); @@ -19,4 +35,53 @@ public class MagicGlow extends RenderPhase { public static RenderLayer getRenderLayer() { return MAGIC; } + + public static RenderLayer getTintedLayer(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)) + .writeMaskState(COLOR_MASK) + .alpha(ONE_TENTH_ALPHA) + .transparency(GLOWING_TRANSPARENCY) + .lightmap(DISABLE_LIGHTMAP) + .overlay(DISABLE_OVERLAY_COLOR) + .cull(DISABLE_CULLING) + .build(true)); + } + + private static class Color extends Texture { + + private final float red; + private final float green; + 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); + this.red = red; + this.green = green; + this.blue = blue; + this.alpha = alpha; + } + + @Override + public void startDrawing() { + super.startDrawing(); + RenderSystem.blendColor(red, green, blue, alpha); + } + + @Override + public void endDrawing() { + super.endDrawing(); + RenderSystem.blendColor(1, 1, 1, 1); + } + + @Override + public boolean equals(Object other) { + return super.equals(other) + && ((Color)other).red == red + && ((Color)other).green == green + && ((Color)other).blue == blue + && ((Color)other).alpha == alpha; + } + } } diff --git a/src/main/resources/minelp.mixin.json b/src/main/resources/minelp.mixin.json index 592a9fea..211ceb24 100644 --- a/src/main/resources/minelp.mixin.json +++ b/src/main/resources/minelp.mixin.json @@ -12,6 +12,7 @@ "MixinSkullBlockEntityRenderer", "MixinFirstPersonRenderer", "MixinItemRenderer", + "MixinClass_4722", "MixinClientPlayerEntity", "MixinPlayerMoveC2SPacket_Both", "MixinPlayerMoveC2SPacket_LookOnly"