package crazypants.enderio.machine.obelisk;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess;
import net.minecraftforge.common.util.ForgeDirection;
import org.lwjgl.opengl.GL11;
import com.enderio.core.api.client.render.VertexTransform;
import com.enderio.core.client.render.BoundingBox;
import com.enderio.core.client.render.CubeRenderer;
import com.enderio.core.client.render.IconUtil;
import com.enderio.core.client.render.RenderUtil;
import com.enderio.core.common.vecmath.Vector3d;
import com.enderio.core.common.vecmath.Vector3f;
import com.enderio.core.common.vecmath.Vertex;
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
public class ObeliskRenderer implements ISimpleBlockRenderingHandler {
private static final VertXForm2 xform2 = new VertXForm2();
private static final VertXForm3 xform3 = new VertXForm3();
private static final float WIDE_PINCH = 0.9f;
private static final float WIDTH = 18f / 32f * WIDE_PINCH;
private static final float HEIGHT = 0.475f;
private static final BoundingBox bb1 = BoundingBox.UNIT_CUBE.scale(WIDTH, HEIGHT, 1).translate(0, -0.5f + HEIGHT / 2, 0);
private static final BoundingBox bb2 = BoundingBox.UNIT_CUBE.scale(1, HEIGHT, WIDTH).translate(0, -0.5f + HEIGHT / 2, 0);
private static final int BOTTOM = ForgeDirection.DOWN.ordinal();
private static final int TOP = ForgeDirection.UP.ordinal();
@Override
public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) {
GL11.glDisable(GL11.GL_LIGHTING);
GL11.glEnable(GL11.GL_ALPHA_TEST);
Tessellator.instance.startDrawingQuads();
renderWorldBlock(null, 0, 0, 0, block, 0, renderer);
Tessellator.instance.draw();
GL11.glDisable(GL11.GL_ALPHA_TEST);
GL11.glEnable(GL11.GL_LIGHTING);
}
@Override
public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) {
IIcon[] icons;
if (world != null) { // block
RenderUtil.setTesselatorBrightness(world, x, y, z);
if (renderer.hasOverrideBlockTexture()) { // "block breaking" overlay
icons = new IIcon[6];
for (int i = 0; i < icons.length; i++) {
icons[i] = renderer.overrideBlockTexture;
}
} else {
icons = RenderUtil.getBlockTextures(world, x, y, z);
}
} else { // item
icons = RenderUtil.getBlockTextures(block, 0);
}
// bottom texture goes into its own BB
IIcon[] bottomIcons = new IIcon[6];
for (int i = 1; i < bottomIcons.length; i++) {
bottomIcons[i] = IconUtil.blankTexture;
}
bottomIcons[BOTTOM] = icons[BOTTOM];
icons[BOTTOM] = IconUtil.blankTexture;
Tessellator.instance.addTranslation(x, y, z);
xform2.isX = false;
CubeRenderer.render(bb1, icons, xform2, true);
xform2.isX = true;
icons[TOP] = IconUtil.blankTexture;
CubeRenderer.render(bb2, icons, xform2, true);
CubeRenderer.render(BoundingBox.UNIT_CUBE, bottomIcons, xform3, true);
Tessellator.instance.addTranslation(-x, -y, -z);
return true;
}
@Override
public boolean shouldRender3DInInventory(int modelId) {
return true;
}
@Override
public int getRenderId() {
return BlockObeliskAbstract.defaultObeliskRenderId;
}
private static class VertXForm2 implements VertexTransform {
boolean isX = true;
public VertXForm2() {
}
@Override
public void apply(Vertex vertex) {
apply(vertex.xyz);
}
@Override
public void apply(Vector3d vec) {
double pinch = WIDE_PINCH;
if(vec.y > 0.2) {
pinch = 0.5;
}
if(isX) {
vec.x -= 0.5;
vec.x *= pinch;
vec.x += 0.5;
} else {
vec.z -= 0.5;
vec.z *= pinch;
vec.z += 0.5;
}
}
@Override
public void applyToNormal(Vector3f vec) {
}
}
private static class VertXForm3 implements VertexTransform {
public VertXForm3() {
}
@Override
public void apply(Vertex vertex) {
apply(vertex.xyz);
}
@Override
public void apply(Vector3d vec) {
vec.x -= 0.5;
vec.x *= WIDE_PINCH;
vec.x += 0.5;
vec.z -= 0.5;
vec.z *= WIDE_PINCH;
vec.z += 0.5;
}
@Override
public void applyToNormal(Vector3f vec) {
}
}
}