package com.cricketcraft.chisel.client.render.tile;
import java.util.Random;
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.entity.RenderItem;
import net.minecraft.client.renderer.entity.RenderManager;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.client.settings.GameSettings;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.IIcon;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.IBlockAccess;
import net.minecraftforge.client.IItemRenderer;
import net.minecraftforge.client.model.obj.Face;
import net.minecraftforge.client.model.obj.GroupObject;
import net.minecraftforge.client.model.obj.TextureCoordinate;
import net.minecraftforge.client.model.obj.Vertex;
import net.minecraftforge.client.model.obj.WavefrontObject;
import com.cricketcraft.chisel.Chisel;
import com.cricketcraft.chisel.block.tileentity.TileEntityAutoChisel;
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
import cpw.mods.fml.client.registry.RenderingRegistry;
import static org.lwjgl.opengl.GL11.*;
public class RenderAutoChisel extends TileEntitySpecialRenderer implements ISimpleBlockRenderingHandler, IItemRenderer {
private static final WavefrontObject model = new WavefrontObject(new ResourceLocation(Chisel.MOD_ID, "models/autoChisel/autoChisel.obj"));
private static final ResourceLocation texture = new ResourceLocation(Chisel.MOD_ID, "textures/blocks/autoChisel/autoChisel.png");
@Override
public boolean handleRenderType(ItemStack item, ItemRenderType type) {
return true;
}
@Override
public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) {
return helper == ItemRendererHelper.INVENTORY_BLOCK || helper == ItemRendererHelper.ENTITY_BOBBING || helper == ItemRendererHelper.ENTITY_ROTATION;
}
@Override
public void renderItem(ItemRenderType type, ItemStack item, Object... data) {
switch (type) {
case ENTITY:
glTranslatef(-0.5f, 0, 0.5f);
break;
case EQUIPPED:
glRotatef(20, 0, 1, 0);
glRotatef(-15, 1, 0, -1);
glScalef(0.65f, 0.65f, 0.65f);
glTranslatef(0.75f, -0.5f, 1.25f);
break;
case EQUIPPED_FIRST_PERSON:
glRotatef(20, 0, 0, 1);
glRotatef(30, 0, 1, 0);
glTranslatef(0.2f, 0, -0.1f);
glScalef(0.5f, 0.5f, 0.5f);
break;
case FIRST_PERSON_MAP:
break;
case INVENTORY:
glTranslatef(-0.5f, -0.5f, 0.5f);
break;
}
Minecraft.getMinecraft().renderEngine.bindTexture(texture);
model.renderAll();
}
@Override
public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) {
;
}
@Override
public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) {
Tessellator tes = Tessellator.instance;
IIcon icon = renderer.hasOverrideBlockTexture() ? renderer.overrideBlockTexture : block.getIcon(0, 0);
tes.setBrightness(block.getMixedBrightnessForBlock(world, x, y, z));
tes.setColorOpaque_F(1, 1, 1);
tes.addTranslation(x, y, z + 1);
for (GroupObject go : model.groupObjects) {
for (Face f : go.faces) {
Vertex n = f.faceNormal;
tes.setNormal(n.x, n.y, n.z);
for (int i = 0; i < f.vertices.length; i++) {
Vertex vert = f.vertices[i];
TextureCoordinate t = f.textureCoordinates[i];
if (!renderer.hasOverrideBlockTexture()) {
tes.addVertexWithUV(vert.x, vert.y, vert.z, icon.getInterpolatedU(t.u * 16), icon.getInterpolatedV(t.v * 16));
} else {
tes.addVertexWithUV(vert.x, vert.y, vert.z, icon.getInterpolatedU((t.u * 64) % 16), icon.getInterpolatedV((t.v * 64) % 16));
}
}
}
}
tes.addTranslation(-x, -y, -z - 1);
return true;
}
@Override
public boolean shouldRender3DInInventory(int modelId) {
return true;
}
@Override
public int getRenderId() {
return Chisel.renderAutoChiselId;
}
private final RenderItem renderItem;
public RenderAutoChisel() {
Chisel.renderAutoChiselId = RenderingRegistry.getNextAvailableRenderId();
renderItem = new RenderItem() {
@Override
public boolean shouldBob() {
return false;
}
};
renderItem.setRenderManager(RenderManager.instance);
}
private static final Random rand = new Random();
@Override
public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float scale) {
// Render Blocks
TileEntityAutoChisel autoChisel = (TileEntityAutoChisel) tile;
EntityItem item = autoChisel.getItemForRendering(TileEntityAutoChisel.TARGET);
rand.setSeed(tile.xCoord + tile.yCoord + tile.zCoord);
rand.nextBoolean();
float max = 0.35f;
if (!Minecraft.getMinecraft().isGamePaused()) {
autoChisel.xRot += (rand.nextFloat() * max) - (max / 2);
autoChisel.yRot += (rand.nextFloat() * max) - (max / 2);
autoChisel.zRot += (rand.nextFloat() * max) - (max / 2);
}
if (item != null) {
glPushMatrix();
glPushAttrib(GL_ALL_ATTRIB_BITS);
glTranslated(x + 0.5, y + 1.5, z + 0.5);
glRotatef(autoChisel.xRot, 1, 0, 0);
glRotatef(autoChisel.yRot, 0, 1, 0);
glRotatef(autoChisel.zRot, 0, 0, 1);
glEnable(GL_BLEND);
glDepthMask(false);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA);
renderItem.doRender(item, 0, 0, 0, 0, 0);
glPopMatrix();
glPopAttrib();
}
item = autoChisel.getItemForRendering(TileEntityAutoChisel.BASE);
if (item != null) {
glPushMatrix();
glTranslated(x + 0.35, y + 0.934, z + 0.5);
item.getEntityItem().stackSize = autoChisel.getLastBase() == null ? 1 : autoChisel.getLastBase().stackSize;
renderItem.doRender(item, 0, 0, 0, 0, 0);
glPopMatrix();
}
GameSettings settings = Minecraft.getMinecraft().gameSettings;
item = autoChisel.getItemForRendering(TileEntityAutoChisel.CHISEL);
if (item != null) {
glPushMatrix();
glTranslated(x + 0.7, y + 1.01, z + 0.5);
float rot = autoChisel.chiselRot == 0 ? 0 : autoChisel.chiseling ? autoChisel.chiselRot + (TileEntityAutoChisel.rotAmnt * scale) : autoChisel.chiselRot
- (TileEntityAutoChisel.rotAmnt * scale);
glRotatef(rot, 0, 0, 1);
glTranslated(-0.12, 0, 0);
glScalef(0.9f, 0.9f, 0.9f);
boolean was = settings.fancyGraphics;
settings.fancyGraphics = true;
renderItem.doRender(item, 0, 0, 0, 0, 0);
settings.fancyGraphics = was;
glPopMatrix();
}
}
}