package com.amadornes.framez.client;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import net.minecraftforge.client.IItemRenderer;
import org.lwjgl.opengl.GL11;
import uk.co.qmunity.lib.client.render.RenderHelper;
import uk.co.qmunity.lib.transform.Scale;
import uk.co.qmunity.lib.transform.Translation;
import uk.co.qmunity.lib.vec.Vec3dCube;
import com.amadornes.framez.Framez;
import com.amadornes.framez.api.movement.IFrame;
import com.amadornes.framez.config.Config;
import com.amadornes.framez.item.ItemPartFrame;
import com.amadornes.framez.part.PartFrame;
public class RenderFrame implements IItemRenderer {
public static boolean renderFrame3D(RenderHelper renderer, IIcon[] borders_, IIcon border, IIcon[] cross_, IIcon[] simple_,
boolean[] hidden, int pass) {
if (Config.simple_frames) { // Only 2D render config option
if (pass == 0) {
return renderFrame2D(renderer, Config.click_through_frames ? borders_ : simple_, hidden);
} else if (pass == 1 && Config.click_through_frames) {
renderer.setOpacity(0.5);
boolean result = renderFrame2D(renderer, simple_, hidden);
renderer.setOpacity(1);
return result;
}
return false;
}
IIcon[] borders = new IIcon[6];
IIcon[] cross = new IIcon[6];
IIcon[] simple = new IIcon[6];
for (int i = 0; i < 6; i++) {
int pos = i;
if (pos > 1)
pos = 2 + (pos % 4);
borders[pos] = borders_[i];
cross[pos] = cross_[i];
simple[pos] = simple_[i];
}
double d = 0.0025D / 2D;
Translation tr = new Translation((hidden[4] ? d : 0) - (hidden[5] ? d : 0), (hidden[0] ? d : 0) - (hidden[1] ? d : 0),
(hidden[2] ? d : 0) - (hidden[3] ? d : 0));
Scale sc = new Scale((1 - d * 2) + (!hidden[4] ? d * 2 : 0) + (!hidden[5] ? d * 2 : 0), (1 - d * 2) + (!hidden[0] ? d * 2 : 0)
+ (!hidden[1] ? d * 2 : 0), (1 - d * 2) + (!hidden[2] ? d * 2 : 0) + (!hidden[3] ? d * 2 : 0));
if (pass == 0) {
renderer.addTransformation(tr);
renderer.addTransformation(sc);
renderer.renderBox(new Vec3dCube(0, 0, 0, 1, 1, 1), borders);
renderer.setRenderFromInside(true);
{
renderer.renderBox(new Vec3dCube(0, 2 / 16D, 2 / 16D, 1, 14 / 16D, 14 / 16D), border);
renderer.renderBox(new Vec3dCube(2 / 16D, 0, 2 / 16D, 14 / 16D, 1, 14 / 16D), border);
renderer.renderBox(new Vec3dCube(2 / 16D, 2 / 16D, 0, 14 / 16D, 14 / 16D, 1), border);
}
renderer.setRenderFromInside(false);
if (!Config.click_through_frames) {
renderer.setRenderFromInside(true);
renderer.renderBox(new Vec3dCube(1 / 16D, 1 / 16D, 1 / 16D, 15 / 16D, 15 / 16D, 15 / 16D), cross);
renderer.setRenderFromInside(false);
renderer.renderBox(new Vec3dCube(1 / 16D, 1 / 16D, 1 / 16D, 15 / 16D, 15 / 16D, 15 / 16D), cross);
}
renderer.removeTransformations(2);
return true;
} else if (pass == 1 && Config.click_through_frames) {
renderer.addTransformation(tr);
renderer.addTransformation(sc);
renderer.setOpacity(0.5);
renderer.setRenderFromInside(true);
renderer.renderBox(new Vec3dCube(1 / 16D, 1 / 16D, 1 / 16D, 15 / 16D, 15 / 16D, 15 / 16D), cross);
renderer.setRenderFromInside(false);
renderer.renderBox(new Vec3dCube(1 / 16D, 1 / 16D, 1 / 16D, 15 / 16D, 15 / 16D, 15 / 16D), cross);
renderer.setOpacity(1);
renderer.removeTransformations(2);
return true;
}
return false;
}
public static boolean renderFrame2D(RenderHelper renderer, IIcon[] simple_, boolean[] hidden) {
IIcon[] simple = new IIcon[6];
for (int i = 0; i < 6; i++) {
int pos = i;
if (pos > 1)
pos = 2 + (pos % 4);
simple[pos] = simple_[i];
}
double d = 0.0025D / 2D;
Translation tr = new Translation((hidden[4] ? d : 0) - (hidden[5] ? d : 0), (hidden[0] ? d : 0) - (hidden[1] ? d : 0),
(hidden[2] ? d : 0) - (hidden[3] ? d : 0));
Scale sc = new Scale((1 - d * 2) + (!hidden[4] ? d * 2 : 0) + (!hidden[5] ? d * 2 : 0), (1 - d * 2) + (!hidden[0] ? d * 2 : 0)
+ (!hidden[1] ? d * 2 : 0), (1 - d * 2) + (!hidden[2] ? d * 2 : 0) + (!hidden[3] ? d * 2 : 0));
renderer.addTransformation(tr);
renderer.addTransformation(sc);
renderer.renderBox(new Vec3dCube(0, 0, 0, 1, 1, 1), simple);
renderer.setRenderFromInside(true);
renderer.renderBox(new Vec3dCube(0, 0, 0, 1, 1, 1), simple);
renderer.setRenderFromInside(false);
renderer.removeTransformations(2);
return true;
}
@Override
public boolean handleRenderType(ItemStack item, ItemRenderType type) {
return true;
}
@Override
public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) {
return true;
}
public static final PartFrame renderer = new PartFrame();
@Override
public void renderItem(ItemRenderType type, ItemStack item, Object... data) {
boolean blend = GL11.glGetBoolean(GL11.GL_BLEND);
boolean alpha = GL11.glGetBoolean(GL11.GL_ALPHA_TEST);
GL11.glEnable(GL11.GL_BLEND);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
GL11.glEnable(GL11.GL_ALPHA_TEST);
GL11.glPushMatrix();
{
if (type == ItemRenderType.INVENTORY)
GL11.glTranslated(0, -0.0625, 0);
if (type == ItemRenderType.ENTITY) {
GL11.glScaled(0.5, 0.5, 0.5);
GL11.glTranslated(-0.5, -0.45, -0.5);
}
Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationBlocksTexture);
IFrame f = ((IFrame) ((ItemPartFrame) item.getItem()).newPart(item, Framez.proxy.getPlayer(), Framez.proxy.getWorld(), null, 0,
null));
if (f != null)
f.renderItem(item, type);
}
GL11.glPopMatrix();
if (!blend)
GL11.glDisable(GL11.GL_BLEND);
if (!alpha)
GL11.glDisable(GL11.GL_ALPHA_TEST);
}
}