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