001package net.minecraft.client.renderer.entity;
002
003import cpw.mods.fml.relauncher.Side;
004import cpw.mods.fml.relauncher.SideOnly;
005import java.util.HashMap;
006import java.util.Iterator;
007import java.util.Map;
008import net.minecraft.block.Block;
009import net.minecraft.client.gui.FontRenderer;
010import net.minecraft.client.model.ModelBiped;
011import net.minecraft.client.model.ModelChicken;
012import net.minecraft.client.model.ModelCow;
013import net.minecraft.client.model.ModelOcelot;
014import net.minecraft.client.model.ModelPig;
015import net.minecraft.client.model.ModelSheep1;
016import net.minecraft.client.model.ModelSheep2;
017import net.minecraft.client.model.ModelSlime;
018import net.minecraft.client.model.ModelSquid;
019import net.minecraft.client.model.ModelWolf;
020import net.minecraft.client.model.ModelZombie;
021import net.minecraft.client.renderer.ItemRenderer;
022import net.minecraft.client.renderer.OpenGlHelper;
023import net.minecraft.client.renderer.RenderEngine;
024import net.minecraft.client.renderer.Tessellator;
025import net.minecraft.client.renderer.tileentity.RenderEnderCrystal;
026import net.minecraft.client.renderer.tileentity.RenderItemFrame;
027import net.minecraft.client.renderer.tileentity.RenderWitherSkull;
028import net.minecraft.client.settings.GameSettings;
029import net.minecraft.crash.CrashReport;
030import net.minecraft.crash.CrashReportCategory;
031import net.minecraft.entity.Entity;
032import net.minecraft.entity.EntityLiving;
033import net.minecraft.entity.boss.EntityDragon;
034import net.minecraft.entity.boss.EntityWither;
035import net.minecraft.entity.effect.EntityLightningBolt;
036import net.minecraft.entity.item.EntityBoat;
037import net.minecraft.entity.item.EntityEnderCrystal;
038import net.minecraft.entity.item.EntityEnderEye;
039import net.minecraft.entity.item.EntityEnderPearl;
040import net.minecraft.entity.item.EntityExpBottle;
041import net.minecraft.entity.item.EntityFallingSand;
042import net.minecraft.entity.item.EntityFireworkRocket;
043import net.minecraft.entity.item.EntityItem;
044import net.minecraft.entity.item.EntityItemFrame;
045import net.minecraft.entity.item.EntityMinecart;
046import net.minecraft.entity.item.EntityPainting;
047import net.minecraft.entity.item.EntityTNTPrimed;
048import net.minecraft.entity.item.EntityXPOrb;
049import net.minecraft.entity.monster.EntityBlaze;
050import net.minecraft.entity.monster.EntityCaveSpider;
051import net.minecraft.entity.monster.EntityCreeper;
052import net.minecraft.entity.monster.EntityEnderman;
053import net.minecraft.entity.monster.EntityGhast;
054import net.minecraft.entity.monster.EntityGiantZombie;
055import net.minecraft.entity.monster.EntityIronGolem;
056import net.minecraft.entity.monster.EntityMagmaCube;
057import net.minecraft.entity.monster.EntitySilverfish;
058import net.minecraft.entity.monster.EntitySkeleton;
059import net.minecraft.entity.monster.EntitySlime;
060import net.minecraft.entity.monster.EntitySnowman;
061import net.minecraft.entity.monster.EntitySpider;
062import net.minecraft.entity.monster.EntityWitch;
063import net.minecraft.entity.monster.EntityZombie;
064import net.minecraft.entity.passive.EntityBat;
065import net.minecraft.entity.passive.EntityChicken;
066import net.minecraft.entity.passive.EntityCow;
067import net.minecraft.entity.passive.EntityMooshroom;
068import net.minecraft.entity.passive.EntityOcelot;
069import net.minecraft.entity.passive.EntityPig;
070import net.minecraft.entity.passive.EntitySheep;
071import net.minecraft.entity.passive.EntitySquid;
072import net.minecraft.entity.passive.EntityVillager;
073import net.minecraft.entity.passive.EntityWolf;
074import net.minecraft.entity.player.EntityPlayer;
075import net.minecraft.entity.projectile.EntityArrow;
076import net.minecraft.entity.projectile.EntityEgg;
077import net.minecraft.entity.projectile.EntityFishHook;
078import net.minecraft.entity.projectile.EntityLargeFireball;
079import net.minecraft.entity.projectile.EntityPotion;
080import net.minecraft.entity.projectile.EntitySmallFireball;
081import net.minecraft.entity.projectile.EntitySnowball;
082import net.minecraft.entity.projectile.EntityWitherSkull;
083import net.minecraft.item.Item;
084import net.minecraft.util.MathHelper;
085import net.minecraft.util.ReportedException;
086import net.minecraft.world.World;
087import org.lwjgl.opengl.GL11;
088
089@SideOnly(Side.CLIENT)
090public class RenderManager
091{
092    /** A map of entity classes and the associated renderer. */
093    public Map entityRenderMap = new HashMap();
094
095    /** The static instance of RenderManager. */
096    public static RenderManager instance = new RenderManager();
097
098    /** Renders fonts */
099    private FontRenderer fontRenderer;
100    public static double renderPosX;
101    public static double renderPosY;
102    public static double renderPosZ;
103    public RenderEngine renderEngine;
104    public ItemRenderer itemRenderer;
105
106    /** Reference to the World object. */
107    public World worldObj;
108
109    /** Rendermanager's variable for the player */
110    public EntityLiving livingPlayer;
111    public float playerViewY;
112    public float playerViewX;
113
114    /** Reference to the GameSettings object. */
115    public GameSettings options;
116    public double viewerPosX;
117    public double viewerPosY;
118    public double viewerPosZ;
119    public static boolean field_85095_o = false;
120
121    private RenderManager()
122    {
123        this.entityRenderMap.put(EntitySpider.class, new RenderSpider());
124        this.entityRenderMap.put(EntityCaveSpider.class, new RenderSpider());
125        this.entityRenderMap.put(EntityPig.class, new RenderPig(new ModelPig(), new ModelPig(0.5F), 0.7F));
126        this.entityRenderMap.put(EntitySheep.class, new RenderSheep(new ModelSheep2(), new ModelSheep1(), 0.7F));
127        this.entityRenderMap.put(EntityCow.class, new RenderCow(new ModelCow(), 0.7F));
128        this.entityRenderMap.put(EntityMooshroom.class, new RenderMooshroom(new ModelCow(), 0.7F));
129        this.entityRenderMap.put(EntityWolf.class, new RenderWolf(new ModelWolf(), new ModelWolf(), 0.5F));
130        this.entityRenderMap.put(EntityChicken.class, new RenderChicken(new ModelChicken(), 0.3F));
131        this.entityRenderMap.put(EntityOcelot.class, new RenderOcelot(new ModelOcelot(), 0.4F));
132        this.entityRenderMap.put(EntitySilverfish.class, new RenderSilverfish());
133        this.entityRenderMap.put(EntityCreeper.class, new RenderCreeper());
134        this.entityRenderMap.put(EntityEnderman.class, new RenderEnderman());
135        this.entityRenderMap.put(EntitySnowman.class, new RenderSnowMan());
136        this.entityRenderMap.put(EntitySkeleton.class, new RenderSkeleton());
137        this.entityRenderMap.put(EntityWitch.class, new RenderWitch());
138        this.entityRenderMap.put(EntityBlaze.class, new RenderBlaze());
139        this.entityRenderMap.put(EntityZombie.class, new RenderZombie());
140        this.entityRenderMap.put(EntitySlime.class, new RenderSlime(new ModelSlime(16), new ModelSlime(0), 0.25F));
141        this.entityRenderMap.put(EntityMagmaCube.class, new RenderMagmaCube());
142        this.entityRenderMap.put(EntityPlayer.class, new RenderPlayer());
143        this.entityRenderMap.put(EntityGiantZombie.class, new RenderGiantZombie(new ModelZombie(), 0.5F, 6.0F));
144        this.entityRenderMap.put(EntityGhast.class, new RenderGhast());
145        this.entityRenderMap.put(EntitySquid.class, new RenderSquid(new ModelSquid(), 0.7F));
146        this.entityRenderMap.put(EntityVillager.class, new RenderVillager());
147        this.entityRenderMap.put(EntityIronGolem.class, new RenderIronGolem());
148        this.entityRenderMap.put(EntityLiving.class, new RenderLiving(new ModelBiped(), 0.5F));
149        this.entityRenderMap.put(EntityBat.class, new RenderBat());
150        this.entityRenderMap.put(EntityDragon.class, new RenderDragon());
151        this.entityRenderMap.put(EntityEnderCrystal.class, new RenderEnderCrystal());
152        this.entityRenderMap.put(EntityWither.class, new RenderWither());
153        this.entityRenderMap.put(Entity.class, new RenderEntity());
154        this.entityRenderMap.put(EntityPainting.class, new RenderPainting());
155        this.entityRenderMap.put(EntityItemFrame.class, new RenderItemFrame());
156        this.entityRenderMap.put(EntityArrow.class, new RenderArrow());
157        this.entityRenderMap.put(EntitySnowball.class, new RenderSnowball(Item.snowball.getIconFromDamage(0)));
158        this.entityRenderMap.put(EntityEnderPearl.class, new RenderSnowball(Item.enderPearl.getIconFromDamage(0)));
159        this.entityRenderMap.put(EntityEnderEye.class, new RenderSnowball(Item.eyeOfEnder.getIconFromDamage(0)));
160        this.entityRenderMap.put(EntityEgg.class, new RenderSnowball(Item.egg.getIconFromDamage(0)));
161        this.entityRenderMap.put(EntityPotion.class, new RenderSnowball(154));
162        this.entityRenderMap.put(EntityExpBottle.class, new RenderSnowball(Item.expBottle.getIconFromDamage(0)));
163        this.entityRenderMap.put(EntityFireworkRocket.class, new RenderSnowball(Item.firework.getIconFromDamage(0)));
164        this.entityRenderMap.put(EntityLargeFireball.class, new RenderFireball(2.0F));
165        this.entityRenderMap.put(EntitySmallFireball.class, new RenderFireball(0.5F));
166        this.entityRenderMap.put(EntityWitherSkull.class, new RenderWitherSkull());
167        this.entityRenderMap.put(EntityItem.class, new RenderItem());
168        this.entityRenderMap.put(EntityXPOrb.class, new RenderXPOrb());
169        this.entityRenderMap.put(EntityTNTPrimed.class, new RenderTNTPrimed());
170        this.entityRenderMap.put(EntityFallingSand.class, new RenderFallingSand());
171        this.entityRenderMap.put(EntityMinecart.class, new RenderMinecart());
172        this.entityRenderMap.put(EntityBoat.class, new RenderBoat());
173        this.entityRenderMap.put(EntityFishHook.class, new RenderFish());
174        this.entityRenderMap.put(EntityLightningBolt.class, new RenderLightningBolt());
175        Iterator var1 = this.entityRenderMap.values().iterator();
176
177        while (var1.hasNext())
178        {
179            Render var2 = (Render)var1.next();
180            var2.setRenderManager(this);
181        }
182    }
183
184    public Render getEntityClassRenderObject(Class par1Class)
185    {
186        Render var2 = (Render)this.entityRenderMap.get(par1Class);
187
188        if (var2 == null && par1Class != Entity.class)
189        {
190            var2 = this.getEntityClassRenderObject(par1Class.getSuperclass());
191            this.entityRenderMap.put(par1Class, var2);
192        }
193
194        return var2;
195    }
196
197    public Render getEntityRenderObject(Entity par1Entity)
198    {
199        return this.getEntityClassRenderObject(par1Entity.getClass());
200    }
201
202    /**
203     * Caches the current frame's active render info, including the current World, RenderEngine, GameSettings and
204     * FontRenderer settings, as well as interpolated player position, pitch and yaw.
205     */
206    public void cacheActiveRenderInfo(World par1World, RenderEngine par2RenderEngine, FontRenderer par3FontRenderer, EntityLiving par4EntityLiving, GameSettings par5GameSettings, float par6)
207    {
208        this.worldObj = par1World;
209        this.renderEngine = par2RenderEngine;
210        this.options = par5GameSettings;
211        this.livingPlayer = par4EntityLiving;
212        this.fontRenderer = par3FontRenderer;
213
214        if (par4EntityLiving.isPlayerSleeping())
215        {
216            int x = MathHelper.floor_double(par4EntityLiving.posX);
217            int y = MathHelper.floor_double(par4EntityLiving.posY);
218            int z = MathHelper.floor_double(par4EntityLiving.posZ);
219            Block block = Block.blocksList[par1World.getBlockId(x, y, z)];
220
221            if (block != null && block.isBed(par1World, x, y, z, par4EntityLiving))
222            {
223                int var9 = block.getBedDirection(par1World, x, y, z);;
224                this.playerViewY = (float)(var9 * 90 + 180);
225                this.playerViewX = 0.0F;
226            }
227        }
228        else
229        {
230            this.playerViewY = par4EntityLiving.prevRotationYaw + (par4EntityLiving.rotationYaw - par4EntityLiving.prevRotationYaw) * par6;
231            this.playerViewX = par4EntityLiving.prevRotationPitch + (par4EntityLiving.rotationPitch - par4EntityLiving.prevRotationPitch) * par6;
232        }
233
234        if (par5GameSettings.thirdPersonView == 2)
235        {
236            this.playerViewY += 180.0F;
237        }
238
239        this.viewerPosX = par4EntityLiving.lastTickPosX + (par4EntityLiving.posX - par4EntityLiving.lastTickPosX) * (double)par6;
240        this.viewerPosY = par4EntityLiving.lastTickPosY + (par4EntityLiving.posY - par4EntityLiving.lastTickPosY) * (double)par6;
241        this.viewerPosZ = par4EntityLiving.lastTickPosZ + (par4EntityLiving.posZ - par4EntityLiving.lastTickPosZ) * (double)par6;
242    }
243
244    /**
245     * Will render the specified entity at the specified partial tick time. Args: entity, partialTickTime
246     */
247    public void renderEntity(Entity par1Entity, float par2)
248    {
249        if (par1Entity.ticksExisted == 0)
250        {
251            par1Entity.lastTickPosX = par1Entity.posX;
252            par1Entity.lastTickPosY = par1Entity.posY;
253            par1Entity.lastTickPosZ = par1Entity.posZ;
254        }
255
256        double var3 = par1Entity.lastTickPosX + (par1Entity.posX - par1Entity.lastTickPosX) * (double)par2;
257        double var5 = par1Entity.lastTickPosY + (par1Entity.posY - par1Entity.lastTickPosY) * (double)par2;
258        double var7 = par1Entity.lastTickPosZ + (par1Entity.posZ - par1Entity.lastTickPosZ) * (double)par2;
259        float var9 = par1Entity.prevRotationYaw + (par1Entity.rotationYaw - par1Entity.prevRotationYaw) * par2;
260        int var10 = par1Entity.getBrightnessForRender(par2);
261
262        if (par1Entity.isBurning())
263        {
264            var10 = 15728880;
265        }
266
267        int var11 = var10 % 65536;
268        int var12 = var10 / 65536;
269        OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float)var11 / 1.0F, (float)var12 / 1.0F);
270        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
271        this.renderEntityWithPosYaw(par1Entity, var3 - renderPosX, var5 - renderPosY, var7 - renderPosZ, var9, par2);
272    }
273
274    /**
275     * Renders the specified entity with the passed in position, yaw, and partialTickTime. Args: entity, x, y, z, yaw,
276     * partialTickTime
277     */
278    public void renderEntityWithPosYaw(Entity par1Entity, double par2, double par4, double par6, float par8, float par9)
279    {
280        Render var10 = null;
281
282        try
283        {
284            var10 = this.getEntityRenderObject(par1Entity);
285
286            if (var10 != null && this.renderEngine != null)
287            {
288                if (field_85095_o && !par1Entity.getHasActivePotion())
289                {
290                    try
291                    {
292                        this.func_85094_b(par1Entity, par2, par4, par6, par8, par9);
293                    }
294                    catch (Throwable var17)
295                    {
296                        throw new ReportedException(CrashReport.makeCrashReport(var17, "Rendering entity hitbox in world"));
297                    }
298                }
299
300                try
301                {
302                    var10.doRender(par1Entity, par2, par4, par6, par8, par9);
303                }
304                catch (Throwable var16)
305                {
306                    throw new ReportedException(CrashReport.makeCrashReport(var16, "Rendering entity in world"));
307                }
308
309                try
310                {
311                    var10.doRenderShadowAndFire(par1Entity, par2, par4, par6, par8, par9);
312                }
313                catch (Throwable var15)
314                {
315                    throw new ReportedException(CrashReport.makeCrashReport(var15, "Post-rendering entity in world"));
316                }
317            }
318        }
319        catch (Throwable var18)
320        {
321            CrashReport var12 = CrashReport.makeCrashReport(var18, "Rendering entity in world");
322            CrashReportCategory var13 = var12.makeCategory("Entity being rendered");
323            par1Entity.func_85029_a(var13);
324            CrashReportCategory var14 = var12.makeCategory("Renderer details");
325            var14.addCrashSection("Assigned renderer", var10);
326            var14.addCrashSection("Location", CrashReportCategory.func_85074_a(par2, par4, par6));
327            var14.addCrashSection("Rotation", Float.valueOf(par8));
328            var14.addCrashSection("Delta", Float.valueOf(par9));
329            throw new ReportedException(var12);
330        }
331    }
332
333    private void func_85094_b(Entity par1Entity, double par2, double par4, double par6, float par8, float par9)
334    {
335        GL11.glDepthMask(false);
336        GL11.glDisable(GL11.GL_TEXTURE_2D);
337        GL11.glDisable(GL11.GL_LIGHTING);
338        GL11.glDisable(GL11.GL_CULL_FACE);
339        GL11.glDisable(GL11.GL_BLEND);
340        GL11.glPushMatrix();
341        Tessellator var10 = Tessellator.instance;
342        var10.startDrawingQuads();
343        var10.setColorRGBA(255, 255, 255, 32);
344        double var11 = (double)(-par1Entity.width / 2.0F);
345        double var13 = (double)(-par1Entity.width / 2.0F);
346        double var15 = (double)(par1Entity.width / 2.0F);
347        double var17 = (double)(-par1Entity.width / 2.0F);
348        double var19 = (double)(-par1Entity.width / 2.0F);
349        double var21 = (double)(par1Entity.width / 2.0F);
350        double var23 = (double)(par1Entity.width / 2.0F);
351        double var25 = (double)(par1Entity.width / 2.0F);
352        double var27 = (double)par1Entity.height;
353        var10.addVertex(par2 + var11, par4 + var27, par6 + var13);
354        var10.addVertex(par2 + var11, par4, par6 + var13);
355        var10.addVertex(par2 + var15, par4, par6 + var17);
356        var10.addVertex(par2 + var15, par4 + var27, par6 + var17);
357        var10.addVertex(par2 + var23, par4 + var27, par6 + var25);
358        var10.addVertex(par2 + var23, par4, par6 + var25);
359        var10.addVertex(par2 + var19, par4, par6 + var21);
360        var10.addVertex(par2 + var19, par4 + var27, par6 + var21);
361        var10.addVertex(par2 + var15, par4 + var27, par6 + var17);
362        var10.addVertex(par2 + var15, par4, par6 + var17);
363        var10.addVertex(par2 + var23, par4, par6 + var25);
364        var10.addVertex(par2 + var23, par4 + var27, par6 + var25);
365        var10.addVertex(par2 + var19, par4 + var27, par6 + var21);
366        var10.addVertex(par2 + var19, par4, par6 + var21);
367        var10.addVertex(par2 + var11, par4, par6 + var13);
368        var10.addVertex(par2 + var11, par4 + var27, par6 + var13);
369        var10.draw();
370        GL11.glPopMatrix();
371        GL11.glEnable(GL11.GL_TEXTURE_2D);
372        GL11.glEnable(GL11.GL_LIGHTING);
373        GL11.glEnable(GL11.GL_CULL_FACE);
374        GL11.glDisable(GL11.GL_BLEND);
375        GL11.glDepthMask(true);
376    }
377
378    /**
379     * World sets this RenderManager's worldObj to the world provided
380     */
381    public void set(World par1World)
382    {
383        this.worldObj = par1World;
384    }
385
386    public double getDistanceToCamera(double par1, double par3, double par5)
387    {
388        double var7 = par1 - this.viewerPosX;
389        double var9 = par3 - this.viewerPosY;
390        double var11 = par5 - this.viewerPosZ;
391        return var7 * var7 + var9 * var9 + var11 * var11;
392    }
393
394    /**
395     * Returns the font renderer
396     */
397    public FontRenderer getFontRenderer()
398    {
399        return this.fontRenderer;
400    }
401}