diff --git a/src/main/java/com/minelittlepony/ducks/IRenderItem.java b/src/main/java/com/minelittlepony/ducks/IRenderItem.java new file mode 100644 index 00000000..4d1a0eec --- /dev/null +++ b/src/main/java/com/minelittlepony/ducks/IRenderItem.java @@ -0,0 +1,6 @@ +package com.minelittlepony.ducks; + +public interface IRenderItem { + + void useTransparency(boolean use); +} diff --git a/src/main/java/com/minelittlepony/mixin/MixinRenderItem.java b/src/main/java/com/minelittlepony/mixin/MixinRenderItem.java new file mode 100644 index 00000000..dee104f5 --- /dev/null +++ b/src/main/java/com/minelittlepony/mixin/MixinRenderItem.java @@ -0,0 +1,43 @@ +package com.minelittlepony.mixin; + +import com.minelittlepony.ducks.IRenderItem; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.RenderItem; +import net.minecraft.client.resources.IResourceManagerReloadListener; +import org.spongepowered.asm.mixin.Implements; +import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(value = RenderItem.class) +@Implements( value = @Interface(iface = IRenderItem.class, prefix = "mlp$") ) +public abstract class MixinRenderItem implements IResourceManagerReloadListener, IRenderItem { + + private static final String ItemStack = "Lnet/minecraft/item/ItemStack;"; + private static final String IBakedModel = "Lnet/minecraft/client/renderer/block/model/IBakedModel;"; + private static final String ItemCameraTransform$TransformType = "Lnet/minecraft/client/renderer/block/model/ItemCameraTransforms$TransformType;"; + private static final String GlStateManager$SourceFactor = "Lnet/minecraft/client/renderer/GlStateManager$SourceFactor;"; + private static final String GlStateManager$DestFactor = "Lnet/minecraft/client/renderer/GlStateManager$DestFactor;"; + + private boolean transparency; + + public void mlp$useTransparency(boolean transparency) { + this.transparency = transparency; + } + + @Redirect(method = "renderItemModel(" + ItemStack + IBakedModel + ItemCameraTransform$TransformType + "Z)V", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/renderer/GlStateManager;tryBlendFuncSeparate(" + + GlStateManager$SourceFactor + GlStateManager$DestFactor + + GlStateManager$SourceFactor + GlStateManager$DestFactor + ")V")) + private void redirectBlendFunc(GlStateManager.SourceFactor srcFactor, GlStateManager.DestFactor dstFactor, + GlStateManager.SourceFactor srcFactorAlpha, GlStateManager.DestFactor dstFactorAlpha) { + if (transparency) { + GlStateManager.tryBlendFuncSeparate(GlStateManager.SourceFactor.CONSTANT_COLOR, GlStateManager.DestFactor.ONE, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); + } else { + GlStateManager.tryBlendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); + } + } +} diff --git a/src/main/java/com/minelittlepony/mixin/MixinRenderPlayer.java b/src/main/java/com/minelittlepony/mixin/MixinRenderPlayer.java index 151e23bf..d1685c4f 100644 --- a/src/main/java/com/minelittlepony/mixin/MixinRenderPlayer.java +++ b/src/main/java/com/minelittlepony/mixin/MixinRenderPlayer.java @@ -23,6 +23,7 @@ import net.minecraft.client.renderer.entity.RenderPlayer; import net.minecraft.client.renderer.entity.layers.LayerArrow; import net.minecraft.util.ResourceLocation; import org.objectweb.asm.Opcodes; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -37,6 +38,7 @@ import static net.minecraft.client.renderer.GlStateManager.scale; public abstract class MixinRenderPlayer extends RenderLivingBase implements IRenderPony { @Shadow + @Final private boolean smallArms; private PlayerModel playerModel; private Pony thePony; diff --git a/src/main/java/com/minelittlepony/model/UnicornHorn.java b/src/main/java/com/minelittlepony/model/UnicornHorn.java index adb8bd8e..6670664e 100644 --- a/src/main/java/com/minelittlepony/model/UnicornHorn.java +++ b/src/main/java/com/minelittlepony/model/UnicornHorn.java @@ -1,8 +1,6 @@ package com.minelittlepony.model; import com.minelittlepony.PonyData; -import com.minelittlepony.model.AbstractPonyModel; -import com.minelittlepony.model.PonyModelConstants; import com.minelittlepony.renderer.HornGlowRenderer; import net.minecraft.client.model.ModelBase; import net.minecraft.client.model.ModelBiped.ArmPose; @@ -51,7 +49,7 @@ public class UnicornHorn extends ModelBase implements PonyModelConstants { float red = (data.getGlowColor() >> 16 & 255) / 255.0F; float green = (data.getGlowColor() >> 8 & 255) / 255.0F; float blue = (data.getGlowColor() & 255) / 255.0F; - blendFunc(GL11.GL_SRC_ALPHA, 1); + blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); this.horn.postRender(scale); diff --git a/src/main/java/com/minelittlepony/renderer/layer/LayerHeldPonyItem.java b/src/main/java/com/minelittlepony/renderer/layer/LayerHeldPonyItem.java index 912bf9c9..8ce6d503 100644 --- a/src/main/java/com/minelittlepony/renderer/layer/LayerHeldPonyItem.java +++ b/src/main/java/com/minelittlepony/renderer/layer/LayerHeldPonyItem.java @@ -1,6 +1,7 @@ package com.minelittlepony.renderer.layer; import com.minelittlepony.PonyData; +import com.minelittlepony.ducks.IRenderItem; import com.minelittlepony.ducks.IRenderPony; import com.minelittlepony.model.AbstractPonyModel; import com.minelittlepony.model.BodyPart; @@ -12,7 +13,6 @@ import net.minecraft.client.model.ModelBiped; import net.minecraft.client.model.ModelRenderer; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.RenderItem; -import net.minecraft.client.renderer.block.model.IBakedModel; import net.minecraft.client.renderer.block.model.ItemCameraTransforms; import net.minecraft.client.renderer.entity.RenderLivingBase; import net.minecraft.client.renderer.entity.layers.LayerHeldItem; @@ -20,7 +20,6 @@ import net.minecraft.client.renderer.entity.layers.LayerRenderer; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumHandSide; -import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL14; import static net.minecraft.client.renderer.GlStateManager.*; @@ -119,35 +118,29 @@ public class LayerHeldPonyItem implements LayerRenderer { if (drop2.hasEffect()) drop2.setTagInfo("ench", null); - GL11.glPushAttrib(GL11.GL_CURRENT_BIT | GL11.GL_ENABLE_BIT | GL11.GL_COLOR_BUFFER_BIT); - float red = (glowColor >> 16 & 255) / 255.0F; float green = (glowColor >> 8 & 255) / 255.0F; float blue = (glowColor & 255) / 255.0F; float alpha = 0.2F; - // disableLighting(); - enableBlend(); - blendFunc(GL11.GL_CONSTANT_COLOR, 1); + + pushMatrix(); + disableLighting(); + GL14.glBlendColor(red, green, blue, alpha); RenderItem renderItem = Minecraft.getMinecraft().getRenderItem(); - IBakedModel model = renderItem.getItemModelWithOverrides(drop, entity.world, entity); - - ItemCameraTransforms itemcameratransforms = model.getItemCameraTransforms(); - ItemCameraTransforms.applyTransformSide(itemcameratransforms.getTransform(transform), hand == EnumHandSide.LEFT); + ((IRenderItem)renderItem).useTransparency(true); scale(1.1, 1.1, 1.1); translate(0, .01, .01); - renderItem.renderItem(drop2, model); + renderItem.renderItem(drop, entity, transform, hand == EnumHandSide.LEFT); translate(.01, -.01, -.02); - // scale(1.1, 1.1, 1.1); - renderItem.renderItem(drop2, model); + renderItem.renderItem(drop, entity, transform, hand == EnumHandSide.LEFT); - disableBlend(); + ((IRenderItem)renderItem).useTransparency(false); enableLighting(); - enableTexture2D(); - popAttrib(); + popMatrix(); // I hate rendering }