Split the held item renderer up into a magical and non-magical variant since they not neccessarily neet to be together

This commit is contained in:
Sollace 2018-04-27 19:06:22 +02:00
parent b00b2745e1
commit 235494cd6c
3 changed files with 124 additions and 80 deletions

View file

@ -3,7 +3,7 @@ package com.minelittlepony.render;
import com.minelittlepony.MineLittlePony; import com.minelittlepony.MineLittlePony;
import com.minelittlepony.ducks.IRenderPony; import com.minelittlepony.ducks.IRenderPony;
import com.minelittlepony.model.ModelWrapper; import com.minelittlepony.model.ModelWrapper;
import com.minelittlepony.render.layer.LayerHeldPonyItem; import com.minelittlepony.render.layer.LayerHeldPonyItemMagical;
import com.minelittlepony.render.layer.LayerPonyArmor; import com.minelittlepony.render.layer.LayerPonyArmor;
import com.minelittlepony.render.layer.LayerPonyCustomHead; import com.minelittlepony.render.layer.LayerPonyCustomHead;
import com.minelittlepony.render.layer.LayerPonyElytra; import com.minelittlepony.render.layer.LayerPonyElytra;
@ -29,7 +29,7 @@ public abstract class RenderPonyMob<T extends EntityLiving> extends RenderLiving
protected void addLayers() { protected void addLayers() {
addLayer(new LayerPonyArmor<>(this)); addLayer(new LayerPonyArmor<>(this));
addLayer(new LayerHeldPonyItem<>(this)); addLayer(new LayerHeldPonyItemMagical<>(this));
// addLayer(new LayerArrow(this)); // addLayer(new LayerArrow(this));
addLayer(new LayerPonyCustomHead<>(this)); addLayer(new LayerPonyCustomHead<>(this));
addLayer(new LayerPonyElytra<>(this)); addLayer(new LayerPonyElytra<>(this));

View file

@ -1,29 +1,17 @@
package com.minelittlepony.render.layer; package com.minelittlepony.render.layer;
import com.minelittlepony.ducks.IRenderItem;
import com.minelittlepony.ducks.IRenderPony;
import com.minelittlepony.model.AbstractPonyModel; import com.minelittlepony.model.AbstractPonyModel;
import com.minelittlepony.model.BodyPart; import com.minelittlepony.model.BodyPart;
import com.minelittlepony.model.ponies.ModelPlayerPony;
import com.minelittlepony.pony.data.IPonyData;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.model.ModelBase; import net.minecraft.client.model.ModelBase;
import net.minecraft.client.model.ModelBiped; import net.minecraft.client.model.ModelBiped;
import net.minecraft.client.model.ModelRenderer;
import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.RenderItem;
import net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType; import net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType;
import net.minecraft.client.renderer.entity.RenderLivingBase; import net.minecraft.client.renderer.entity.RenderLivingBase;
import net.minecraft.client.renderer.entity.layers.LayerHeldItem; import net.minecraft.client.renderer.entity.layers.LayerHeldItem;
import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.EntityLivingBase;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumHandSide; import net.minecraft.util.EnumHandSide;
import org.lwjgl.opengl.GL14;
import javax.annotation.Nullable;
import static net.minecraft.client.renderer.GlStateManager.*; import static net.minecraft.client.renderer.GlStateManager.*;
public class LayerHeldPonyItem<T extends EntityLivingBase> extends AbstractPonyLayer<T> { public class LayerHeldPonyItem<T extends EntityLivingBase> extends AbstractPonyLayer<T> {
@ -65,7 +53,7 @@ public class LayerHeldPonyItem<T extends EntityLivingBase> extends AbstractPonyL
private void renderHeldItem(T entity, ItemStack drop, TransformType transform, EnumHandSide hand) { private void renderHeldItem(T entity, ItemStack drop, TransformType transform, EnumHandSide hand) {
if (!drop.isEmpty()) { if (!drop.isEmpty()) {
GlStateManager.pushMatrix(); GlStateManager.pushMatrix();
postRenderArm(hand); renderArm(hand);
if (entity.isSneaking()) { if (entity.isSneaking()) {
GlStateManager.translate(0, 0.2F, 0); GlStateManager.translate(0, 0.2F, 0);
@ -74,82 +62,27 @@ public class LayerHeldPonyItem<T extends EntityLivingBase> extends AbstractPonyL
GlStateManager.rotate(-90, 1, 0, 0); GlStateManager.rotate(-90, 1, 0, 0);
GlStateManager.rotate(180, 0, 1, 0); GlStateManager.rotate(180, 0, 1, 0);
boolean isUnicorn = isUnicorn(getRenderer().getMainModel()); preItemRender(entity, drop, transform, hand);
boolean isLeft = hand == EnumHandSide.LEFT; Minecraft.getMinecraft().getItemRenderer().renderItemSide(entity, drop, transform, hand == EnumHandSide.LEFT);
postItemRender(entity, drop, transform, hand);
if (isUnicorn) {
GlStateManager.translate(isLeft ? -0.6F : 0.1F, 1, -0.5F);
} else {
GlStateManager.translate(0.0425F, 0.125F, -1);
}
Minecraft.getMinecraft().getItemRenderer().renderItemSide(entity, drop, transform, isLeft);
if (isUnicorn) {
IPonyData metadata = ((AbstractPonyModel) getRenderer().getMainModel()).metadata;
renderItemGlow(entity, drop, transform, hand, metadata.getGlowColor());
}
GlStateManager.popMatrix(); GlStateManager.popMatrix();
} }
} }
private static boolean isUnicorn(ModelBase model) { protected void preItemRender(T entity, ItemStack drop, TransformType transform, EnumHandSide hand) {
return model instanceof AbstractPonyModel && ((AbstractPonyModel) model).metadata.hasMagic(); GlStateManager.translate(0.0425F, 0.125F, -1);
}
protected void postItemRender(T entity, ItemStack drop, TransformType transform, EnumHandSide hand) {
} }
/** /**
* Renders the main arm * Renders the main arm
*/ */
protected void postRenderArm(EnumHandSide side) { protected void renderArm(EnumHandSide side) {
AbstractPonyModel thePony = ((IRenderPony) getRenderer()).getPlayerModel().getModel();
if (thePony.metadata.hasMagic()) {
ModelPlayerPony playerModel = (ModelPlayerPony) thePony;
ModelRenderer unicornarm = side == EnumHandSide.LEFT ? playerModel.unicornArmLeft : playerModel.unicornArmRight;
unicornarm.postRender(0.0625F);
} else {
((ModelBiped) getRenderer().getMainModel()).postRenderArm(0.0625F, side); ((ModelBiped) getRenderer().getMainModel()).postRenderArm(0.0625F, side);
} }
}
public void renderItemGlow(T entity, ItemStack drop, TransformType transform, EnumHandSide hand, int glowColor) {
// enchantments mess up the rendering
ItemStack drop2 = drop.copy();
if (drop2.hasEffect()) {
removeEnch(drop2.getTagCompound());
}
float red = (glowColor >> 16 & 255) / 255.0F;
float green = (glowColor >> 8 & 255) / 255.0F;
float blue = (glowColor & 255) / 255.0F;
float alpha = 0.2F;
pushMatrix();
disableLighting();
GL14.glBlendColor(red, green, blue, alpha);
RenderItem renderItem = Minecraft.getMinecraft().getRenderItem();
((IRenderItem) renderItem).useTransparency(true);
scale(1.1, 1.1, 1.1);
translate(0, .01, .01);
renderItem.renderItem(drop, entity, transform, hand == EnumHandSide.LEFT);
translate(.01, -.01, -.02);
renderItem.renderItem(drop, entity, transform, hand == EnumHandSide.LEFT);
((IRenderItem) renderItem).useTransparency(false);
enableLighting();
popMatrix();
// I hate rendering
}
private void removeEnch(@Nullable NBTTagCompound tag) {
if (tag != null) {
tag.removeTag("ench");
}
}
@Override @Override
public boolean shouldCombineTextures() { public boolean shouldCombineTextures() {

View file

@ -0,0 +1,111 @@
package com.minelittlepony.render.layer;
import static net.minecraft.client.renderer.GlStateManager.disableLighting;
import static net.minecraft.client.renderer.GlStateManager.enableLighting;
import static net.minecraft.client.renderer.GlStateManager.popMatrix;
import static net.minecraft.client.renderer.GlStateManager.pushMatrix;
import static net.minecraft.client.renderer.GlStateManager.scale;
import static net.minecraft.client.renderer.GlStateManager.translate;
import javax.annotation.Nullable;
import org.lwjgl.opengl.GL14;
import com.minelittlepony.ducks.IRenderItem;
import com.minelittlepony.ducks.IRenderPony;
import com.minelittlepony.model.AbstractPonyModel;
import com.minelittlepony.model.ponies.ModelPlayerPony;
import com.minelittlepony.pony.data.IPonyData;
import net.minecraft.client.Minecraft;
import net.minecraft.client.model.ModelBase;
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.ItemCameraTransforms.TransformType;
import net.minecraft.client.renderer.entity.RenderLivingBase;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumHandSide;
public class LayerHeldPonyItemMagical<T extends EntityLivingBase> extends LayerHeldPonyItem<T> {
public LayerHeldPonyItemMagical(RenderLivingBase<T> livingPony) {
super(livingPony);
}
private boolean isUnicorn() {
ModelBase model = getRenderer().getMainModel();
return model instanceof AbstractPonyModel && ((AbstractPonyModel) model).metadata.hasMagic();
}
protected void preItemRender(T entity, ItemStack drop, TransformType transform, EnumHandSide hand) {
if (isUnicorn()) {
GlStateManager.translate(hand == EnumHandSide.LEFT ? -0.6F : 0.1F, 1, -0.5F);
} else {
super.preItemRender(entity, drop, transform, hand);
}
}
protected void postItemRender(T entity, ItemStack drop, TransformType transform, EnumHandSide hand) {
if (isUnicorn()) {
IPonyData metadata = ((AbstractPonyModel) getRenderer().getMainModel()).metadata;
renderItemGlow(entity, drop, transform, hand, metadata.getGlowColor());
}
}
/**
* Renders the main arm
*/
protected void renderArm(EnumHandSide side) {
AbstractPonyModel thePony = ((IRenderPony) getRenderer()).getPlayerModel().getModel();
if (thePony.metadata.hasMagic()) {
ModelPlayerPony playerModel = (ModelPlayerPony) thePony;
ModelRenderer unicornarm = side == EnumHandSide.LEFT ? playerModel.unicornArmLeft : playerModel.unicornArmRight;
unicornarm.postRender(0.0625F);
} else {
super.renderArm(side);
}
}
public void renderItemGlow(T entity, ItemStack drop, TransformType transform, EnumHandSide hand, int glowColor) {
// enchantments mess up the rendering
ItemStack drop2 = drop.copy();
if (drop2.hasEffect()) {
removeEnch(drop2.getTagCompound());
}
float red = (glowColor >> 16 & 255) / 255.0F;
float green = (glowColor >> 8 & 255) / 255.0F;
float blue = (glowColor & 255) / 255.0F;
float alpha = 0.2F;
pushMatrix();
disableLighting();
GL14.glBlendColor(red, green, blue, alpha);
RenderItem renderItem = Minecraft.getMinecraft().getRenderItem();
((IRenderItem) renderItem).useTransparency(true);
scale(1.1, 1.1, 1.1);
translate(0, .01, .01);
renderItem.renderItem(drop, entity, transform, hand == EnumHandSide.LEFT);
translate(.01, -.01, -.02);
renderItem.renderItem(drop, entity, transform, hand == EnumHandSide.LEFT);
((IRenderItem) renderItem).useTransparency(false);
enableLighting();
popMatrix();
// I hate rendering
}
private void removeEnch(@Nullable NBTTagCompound tag) {
if (tag != null) {
tag.removeTag("ench");
}
}
}