MineLittlePony/src/main/java/com/minelittlepony/client/render/LevitatingItemRenderer.java

146 lines
5.1 KiB
Java
Raw Normal View History

2019-03-23 20:49:34 +01:00
package com.minelittlepony.client.render;
import org.lwjgl.opengl.GL14;
import com.minelittlepony.MineLittlePony;
2019-03-23 20:49:34 +01:00
import com.minelittlepony.client.ducks.IRenderItem;
import com.minelittlepony.client.render.tileentities.skull.PonySkullRenderer;
import com.minelittlepony.client.util.render.Color;
import com.minelittlepony.pony.IPony;
2019-05-28 10:26:26 +02:00
import com.minelittlepony.settings.PonySettings;
2019-05-27 17:59:15 +02:00
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.AbstractClientPlayerEntity;
2019-06-02 14:20:42 +02:00
import net.minecraft.client.render.FirstPersonRenderer;
2019-05-27 17:59:15 +02:00
import net.minecraft.client.render.item.ItemRenderer;
import net.minecraft.client.render.model.json.ModelTransformation;
import net.minecraft.entity.LivingEntity;
import net.minecraft.item.ItemStack;
2019-05-27 17:59:15 +02:00
import net.minecraft.util.AbsoluteHand;
import net.minecraft.util.UseAction;
import static com.mojang.blaze3d.platform.GlStateManager.*;
public class LevitatingItemRenderer {
2018-08-20 22:24:22 +02:00
public static void enableItemGlowRenderProfile() {
2019-03-24 18:55:15 +01:00
enableBlend();
blendFuncSeparate(SourceFactor.CONSTANT_COLOR, DestFactor.ONE, SourceFactor.ONE, DestFactor.ZERO);
2019-05-27 17:59:15 +02:00
MinecraftClient.getInstance().gameRenderer.disableLightmap();
2018-08-20 22:24:22 +02:00
}
/**
* Renders a magical overlay over an item in third person.
*/
2019-05-27 17:59:15 +02:00
public void renderItemGlow(LivingEntity entity, ItemStack drop, ModelTransformation.Type transform, AbsoluteHand hand, int glowColor) {
pushMatrix();
disableLighting();
setColor(glowColor);
2019-05-27 17:59:15 +02:00
ItemRenderer renderItem = MinecraftClient.getInstance().getItemRenderer();
((IRenderItem) renderItem).useTransparency(true);
PonySkullRenderer.ponyInstance.useTransparency(true);
2019-03-24 18:55:15 +01:00
scalef(1.1F, 1.1F, 1.1F);
translatef(0.01F, 0.01F, 0.01F);
2019-05-27 17:59:15 +02:00
renderItem.renderHeldItem(drop, entity, transform, hand == AbsoluteHand.LEFT);
translatef(-0.02F, -0.02F, -0.02F);
2019-05-27 17:59:15 +02:00
renderItem.renderHeldItem(drop, entity, transform, hand == AbsoluteHand.LEFT);
((IRenderItem) renderItem).useTransparency(false);
PonySkullRenderer.ponyInstance.useTransparency(false);
unsetColor();
enableLighting();
popMatrix();
// I hate rendering
}
private void setColor(int glowColor) {
GL14.glBlendColor(Color.r(glowColor), Color.g(glowColor), Color.b(glowColor), 0.2F);
}
private void unsetColor() {
GL14.glBlendColor(255, 255, 255, 1);
}
/**
* Renders an item in first person optionally with a magical overlay.
*/
2019-06-02 14:20:42 +02:00
public void renderItemInFirstPerson(FirstPersonRenderer renderer, AbstractClientPlayerEntity entity, ItemStack stack, ModelTransformation.Type transform, boolean left) {
IPony pony = MineLittlePony.getInstance().getManager().getPony(entity);
pushMatrix();
2019-05-28 10:26:26 +02:00
boolean doMagic = PonySettings.FPSMAGIC.get() && pony.getMetadata().hasMagic();
2019-06-02 14:20:42 +02:00
ItemRenderer itemRenderer = MinecraftClient.getInstance().getItemRenderer();
if (doMagic) {
2019-06-02 14:20:42 +02:00
setupPerspective(itemRenderer, entity, stack, left);
}
2019-06-02 14:20:42 +02:00
renderer.renderItemFromSide(entity, stack, transform, left);
if (doMagic) {
disableLighting();
2019-06-02 14:20:42 +02:00
((IRenderItem)itemRenderer).useTransparency(true);
PonySkullRenderer.ponyInstance.useTransparency(true);
setColor(pony.getMetadata().getGlowColor());
2019-03-24 18:55:15 +01:00
scalef(1.1F, 1.1F, 1.1F);
translatef(0.01F, 0.01F, 0.01F);
2019-06-02 14:20:42 +02:00
renderer.renderItemFromSide(entity, stack, transform, left);
translatef(-0.02F, -0.02F, -0.02F);
2019-06-02 14:20:42 +02:00
renderer.renderItemFromSide(entity, stack, transform, left);
2019-03-24 18:55:15 +01:00
2019-06-02 14:20:42 +02:00
((IRenderItem)itemRenderer).useTransparency(false);
PonySkullRenderer.ponyInstance.useTransparency(false);
unsetColor();
enableLighting();
}
popMatrix();
// I hate rendering
}
/**
* Moves held items to look like they're floating in the player's field.
*/
2019-05-27 17:59:15 +02:00
private void setupPerspective(ItemRenderer renderer, LivingEntity entity, ItemStack stack, boolean left) {
UseAction action = stack.getUseAction();
boolean doNormal = entity.getItemUseTime() <= 0 || action == UseAction.NONE || action == UseAction.CROSSBOW;
if (doNormal) { // eating, blocking, and drinking are not transformed. Only held items.
2019-05-28 01:50:45 +02:00
float ticks = MinecraftClient.getInstance().getTickDelta() - entity.age;
float floatAmount = (float)Math.sin(ticks / 9) / 40;
float driftAmount = (float)Math.cos(ticks / 6) / 40;
boolean handHeldTool = action == UseAction.BOW
|| action == UseAction.CROSSBOW
|| action == UseAction.BLOCK;
2019-03-24 18:55:15 +01:00
translatef(driftAmount - floatAmount / 4, floatAmount, handHeldTool ? -0.3F : -0.6F);
2018-08-22 12:31:24 +02:00
2019-05-27 17:59:15 +02:00
if (!renderer.hasDepthInGui(stack) && !handHeldTool) { // bows have to point forwards
if (left) {
2019-03-24 18:55:15 +01:00
rotatef(-60, 0, 1, 0);
rotatef(30, 0, 0, 1);
} else {
2019-03-24 18:55:15 +01:00
rotatef(60, 0, 1, 0);
rotatef(-30, 0, 0, 1);
}
}
}
}
}