package com.cricketcraft.chisel.client.render.tile; import java.util.HashMap; import net.minecraft.client.model.ModelChest; import net.minecraft.client.model.ModelLargeChest; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.IItemRenderer; import net.minecraftforge.common.util.ForgeDirection; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; import com.cricketcraft.chisel.Chisel; import com.cricketcraft.chisel.block.tileentity.TileEntityPresent; import com.cricketcraft.chisel.init.ChiselBlocks; import com.google.common.collect.Maps; import cpw.mods.fml.client.FMLClientHandler; public class RenderPresent extends TileEntitySpecialRenderer implements IItemRenderer { private ModelChest smallChest = new ModelChest(); private ModelChest largeChest = new ModelLargeChest(); private HashMap<Integer, ResourceLocation> textureCache = Maps.newHashMap(); public void renderTileEntityAt(TileEntityPresent present, double x, double y, double z, float partialTicks) { GL11.glPushMatrix(); GL11.glEnable(GL12.GL_RESCALE_NORMAL); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); GL11.glTranslatef((float) x, (float) y + 1.0F, (float) z + 1.0F); GL11.glScalef(1.0F, -1.0F, -1.0F); int rotation = present.getRotation(); bindTexture(present); if (!present.isConnected()) { GL11.glRotatef(90 * rotation + 180, 0, 1, 0); switch(rotation) { case 0: GL11.glTranslatef(-1, 0, -1); break; case 1: GL11.glTranslatef(0, 0, -1); break; case 3: GL11.glTranslatef(-1, 0, 0); break; } smallChest.renderAll(); } else if (present.isParent()) { ForgeDirection dir = present.getConnectionDir(); switch(dir) { case NORTH: GL11.glRotatef(-90, 0, 1, 0); GL11.glTranslatef(0, 0, -1); break; case SOUTH: GL11.glRotatef(-90, 0, 1, 0); GL11.glTranslatef(-1, 0, -1); break; case WEST: GL11.glTranslatef(-1, 0, 0); break; default: break; } if (rotation == 0 || rotation == 3) { GL11.glRotatef(180, 0, 1, 0); GL11.glTranslatef(-2, 0, -1); } largeChest.renderAll(); } GL11.glPopMatrix(); } private void bindTexture(TileEntityPresent present) { int idx = present.getWorldObj().getBlockMetadata(present.xCoord, present.yCoord, present.zCoord) + (present.isConnected() ? 0 : 16); ResourceLocation rl = textureCache.get(idx); if (rl == null) { String res = ChiselBlocks.present.getModelTexture(idx % 16); res += present.isConnected() ? "_double.png" : ".png"; rl = new ResourceLocation("chisel", res); textureCache.put(idx, rl); } bindTexture(rl); } @Override public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float partialTicks) { this.renderTileEntityAt((TileEntityPresent) tileEntity, x, y, z, partialTicks); } @Override public boolean handleRenderType(ItemStack item, ItemRenderType type) { return type != ItemRenderType.FIRST_PERSON_MAP; } @Override public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { return true; } @Override public void renderItem(ItemRenderType type, ItemStack item, Object... data) { FMLClientHandler.instance().getClient().renderEngine.bindTexture(new ResourceLocation(Chisel.MOD_ID, ChiselBlocks.present.getModelTexture(item.getItemDamage()) + ".png")); switch (type) { case ENTITY: renderBlock(0.0F, 1.0F, 0.0F); break; case EQUIPPED: renderBlock(0.5F, 1.5F, 0.5F); break; case EQUIPPED_FIRST_PERSON: renderBlock(0.5F, 1.0F, 0.5F); break; case INVENTORY: renderInventory(1.0F, 1.0F, 1.0F); break; default: break; } } private void renderBlock(float x, float y, float z) { GL11.glPushMatrix(); GL11.glTranslatef(x, y, z); GL11.glScaled(-1, -1, 1); smallChest.renderAll(); GL11.glPopMatrix(); } private void renderInventory(float x, float y, float z) { GL11.glPushMatrix(); GL11.glTranslatef(x, y, z); GL11.glRotatef(180F, 1F, 0, 0); GL11.glRotatef(-90F, 0, 1F, 0); GL11.glScalef(1.0F, 1.0F, 1.0F); smallChest.renderAll(); GL11.glPopMatrix(); } }