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