    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    }