001 package net.minecraft.client.renderer.tileentity; 002 003 import cpw.mods.fml.relauncher.Side; 004 import cpw.mods.fml.relauncher.SideOnly; 005 import java.util.HashMap; 006 import java.util.Iterator; 007 import java.util.Map; 008 import net.minecraft.client.gui.FontRenderer; 009 import net.minecraft.client.renderer.OpenGlHelper; 010 import net.minecraft.client.renderer.RenderEngine; 011 import net.minecraft.client.renderer.entity.RenderEnchantmentTable; 012 import net.minecraft.entity.EntityLiving; 013 import net.minecraft.tileentity.TileEntity; 014 import net.minecraft.tileentity.TileEntityBeacon; 015 import net.minecraft.tileentity.TileEntityChest; 016 import net.minecraft.tileentity.TileEntityEnchantmentTable; 017 import net.minecraft.tileentity.TileEntityEndPortal; 018 import net.minecraft.tileentity.TileEntityEnderChest; 019 import net.minecraft.tileentity.TileEntityMobSpawner; 020 import net.minecraft.tileentity.TileEntityPiston; 021 import net.minecraft.tileentity.TileEntitySign; 022 import net.minecraft.tileentity.TileEntitySkull; 023 import net.minecraft.world.World; 024 import org.lwjgl.opengl.GL11; 025 026 @SideOnly(Side.CLIENT) 027 public class TileEntityRenderer 028 { 029 /** 030 * A mapping of TileEntitySpecialRenderers used for each TileEntity that has one 031 */ 032 public Map specialRendererMap = new HashMap(); 033 034 /** The static instance of TileEntityRenderer */ 035 public static TileEntityRenderer instance = new TileEntityRenderer(); 036 037 /** The FontRenderer instance used by the TileEntityRenderer */ 038 private FontRenderer fontRenderer; 039 040 /** The player's current X position (same as playerX) */ 041 public static double staticPlayerX; 042 043 /** The player's current Y position (same as playerY) */ 044 public static double staticPlayerY; 045 046 /** The player's current Z position (same as playerZ) */ 047 public static double staticPlayerZ; 048 049 /** The RenderEngine instance used by the TileEntityRenderer */ 050 public RenderEngine renderEngine; 051 052 /** Reference to the World object. */ 053 public World worldObj; 054 public EntityLiving entityLivingPlayer; 055 public float playerYaw; 056 public float playerPitch; 057 058 /** The player's X position in this rendering context */ 059 public double playerX; 060 061 /** The player's Y position in this rendering context */ 062 public double playerY; 063 064 /** The player's Z position in this rendering context */ 065 public double playerZ; 066 067 private TileEntityRenderer() 068 { 069 this.specialRendererMap.put(TileEntitySign.class, new TileEntitySignRenderer()); 070 this.specialRendererMap.put(TileEntityMobSpawner.class, new TileEntityMobSpawnerRenderer()); 071 this.specialRendererMap.put(TileEntityPiston.class, new TileEntityRendererPiston()); 072 this.specialRendererMap.put(TileEntityChest.class, new TileEntityChestRenderer()); 073 this.specialRendererMap.put(TileEntityEnderChest.class, new TileEntityEnderChestRenderer()); 074 this.specialRendererMap.put(TileEntityEnchantmentTable.class, new RenderEnchantmentTable()); 075 this.specialRendererMap.put(TileEntityEndPortal.class, new RenderEndPortal()); 076 this.specialRendererMap.put(TileEntityBeacon.class, new TileEntityBeaconRenderer()); 077 this.specialRendererMap.put(TileEntitySkull.class, new TileEntitySkullRenderer()); 078 Iterator var1 = this.specialRendererMap.values().iterator(); 079 080 while (var1.hasNext()) 081 { 082 TileEntitySpecialRenderer var2 = (TileEntitySpecialRenderer)var1.next(); 083 var2.setTileEntityRenderer(this); 084 } 085 } 086 087 /** 088 * Returns the TileEntitySpecialRenderer used to render this TileEntity class, or null if it has no special renderer 089 */ 090 public TileEntitySpecialRenderer getSpecialRendererForClass(Class par1Class) 091 { 092 TileEntitySpecialRenderer var2 = (TileEntitySpecialRenderer)this.specialRendererMap.get(par1Class); 093 094 if (var2 == null && par1Class != TileEntity.class) 095 { 096 var2 = this.getSpecialRendererForClass(par1Class.getSuperclass()); 097 this.specialRendererMap.put(par1Class, var2); 098 } 099 100 return var2; 101 } 102 103 /** 104 * Returns true if this TileEntity instance has a TileEntitySpecialRenderer associated with it, false otherwise. 105 */ 106 public boolean hasSpecialRenderer(TileEntity par1TileEntity) 107 { 108 return this.getSpecialRendererForEntity(par1TileEntity) != null; 109 } 110 111 /** 112 * Returns the TileEntitySpecialRenderer used to render this TileEntity instance, or null if it has no special 113 * renderer 114 */ 115 public TileEntitySpecialRenderer getSpecialRendererForEntity(TileEntity par1TileEntity) 116 { 117 return par1TileEntity == null ? null : this.getSpecialRendererForClass(par1TileEntity.getClass()); 118 } 119 120 /** 121 * Caches several render-related references, including the active World, RenderEngine, FontRenderer, and the camera- 122 * bound EntityLiving's interpolated pitch, yaw and position. Args: world, renderengine, fontrenderer, entityliving, 123 * partialTickTime 124 */ 125 public void cacheActiveRenderInfo(World par1World, RenderEngine par2RenderEngine, FontRenderer par3FontRenderer, EntityLiving par4EntityLiving, float par5) 126 { 127 if (this.worldObj != par1World) 128 { 129 this.setWorld(par1World); 130 } 131 132 this.renderEngine = par2RenderEngine; 133 this.entityLivingPlayer = par4EntityLiving; 134 this.fontRenderer = par3FontRenderer; 135 this.playerYaw = par4EntityLiving.prevRotationYaw + (par4EntityLiving.rotationYaw - par4EntityLiving.prevRotationYaw) * par5; 136 this.playerPitch = par4EntityLiving.prevRotationPitch + (par4EntityLiving.rotationPitch - par4EntityLiving.prevRotationPitch) * par5; 137 this.playerX = par4EntityLiving.lastTickPosX + (par4EntityLiving.posX - par4EntityLiving.lastTickPosX) * (double)par5; 138 this.playerY = par4EntityLiving.lastTickPosY + (par4EntityLiving.posY - par4EntityLiving.lastTickPosY) * (double)par5; 139 this.playerZ = par4EntityLiving.lastTickPosZ + (par4EntityLiving.posZ - par4EntityLiving.lastTickPosZ) * (double)par5; 140 } 141 142 /** 143 * Render this TileEntity at its current position from the player 144 */ 145 public void renderTileEntity(TileEntity par1TileEntity, float par2) 146 { 147 if (par1TileEntity.getDistanceFrom(this.playerX, this.playerY, this.playerZ) < par1TileEntity.func_82115_m()) 148 { 149 int var3 = this.worldObj.getLightBrightnessForSkyBlocks(par1TileEntity.xCoord, par1TileEntity.yCoord, par1TileEntity.zCoord, 0); 150 int var4 = var3 % 65536; 151 int var5 = var3 / 65536; 152 OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float)var4 / 1.0F, (float)var5 / 1.0F); 153 GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); 154 this.renderTileEntityAt(par1TileEntity, (double)par1TileEntity.xCoord - staticPlayerX, (double)par1TileEntity.yCoord - staticPlayerY, (double)par1TileEntity.zCoord - staticPlayerZ, par2); 155 } 156 } 157 158 /** 159 * Render this TileEntity at a given set of coordinates 160 */ 161 public void renderTileEntityAt(TileEntity par1TileEntity, double par2, double par4, double par6, float par8) 162 { 163 TileEntitySpecialRenderer var9 = this.getSpecialRendererForEntity(par1TileEntity); 164 165 if (var9 != null) 166 { 167 var9.renderTileEntityAt(par1TileEntity, par2, par4, par6, par8); 168 } 169 } 170 171 /** 172 * Sets the world used by all TileEntitySpecialRender instances and notifies them of this change. 173 */ 174 public void setWorld(World par1World) 175 { 176 this.worldObj = par1World; 177 Iterator var2 = this.specialRendererMap.values().iterator(); 178 179 while (var2.hasNext()) 180 { 181 TileEntitySpecialRenderer var3 = (TileEntitySpecialRenderer)var2.next(); 182 183 if (var3 != null) 184 { 185 var3.onWorldChange(par1World); 186 } 187 } 188 } 189 190 public FontRenderer getFontRenderer() 191 { 192 return this.fontRenderer; 193 } 194 }