001 package net.minecraft.src;
002
003 import cpw.mods.fml.common.Side;
004 import cpw.mods.fml.common.asm.SideOnly;
005 import java.awt.image.BufferedImage;
006 import java.nio.FloatBuffer;
007 import java.util.List;
008 import java.util.Random;
009 import net.minecraft.client.Minecraft;
010 import net.minecraftforge.client.ForgeHooksClient;
011 import net.minecraftforge.client.event.DrawBlockHighlightEvent;
012 import net.minecraftforge.client.event.RenderWorldLastEvent;
013 import net.minecraftforge.common.MinecraftForge;
014
015 import org.lwjgl.input.Mouse;
016 import org.lwjgl.opengl.Display;
017 import org.lwjgl.opengl.GL11;
018 import org.lwjgl.opengl.GLContext;
019 import org.lwjgl.util.glu.GLU;
020
021 @SideOnly(Side.CLIENT)
022 public class EntityRenderer
023 {
024 public static boolean anaglyphEnable = false;
025
026 /** Anaglyph field (0=R, 1=GB) */
027 public static int anaglyphField;
028
029 /** A reference to the Minecraft object. */
030 private Minecraft mc;
031 private float farPlaneDistance = 0.0F;
032 public ItemRenderer itemRenderer;
033
034 /** Entity renderer update count */
035 private int rendererUpdateCount;
036
037 /** Pointed entity */
038 private Entity pointedEntity = null;
039 private MouseFilter mouseFilterXAxis = new MouseFilter();
040 private MouseFilter mouseFilterYAxis = new MouseFilter();
041
042 /** Mouse filter dummy 1 */
043 private MouseFilter mouseFilterDummy1 = new MouseFilter();
044
045 /** Mouse filter dummy 2 */
046 private MouseFilter mouseFilterDummy2 = new MouseFilter();
047
048 /** Mouse filter dummy 3 */
049 private MouseFilter mouseFilterDummy3 = new MouseFilter();
050
051 /** Mouse filter dummy 4 */
052 private MouseFilter mouseFilterDummy4 = new MouseFilter();
053 private float thirdPersonDistance = 4.0F;
054
055 /** Third person distance temp */
056 private float thirdPersonDistanceTemp = 4.0F;
057 private float debugCamYaw = 0.0F;
058 private float prevDebugCamYaw = 0.0F;
059 private float debugCamPitch = 0.0F;
060 private float prevDebugCamPitch = 0.0F;
061
062 /** Smooth cam yaw */
063 private float smoothCamYaw;
064
065 /** Smooth cam pitch */
066 private float smoothCamPitch;
067
068 /** Smooth cam filter X */
069 private float smoothCamFilterX;
070
071 /** Smooth cam filter Y */
072 private float smoothCamFilterY;
073
074 /** Smooth cam partial ticks */
075 private float smoothCamPartialTicks;
076 private float debugCamFOV = 0.0F;
077 private float prevDebugCamFOV = 0.0F;
078 private float camRoll = 0.0F;
079 private float prevCamRoll = 0.0F;
080
081 /**
082 * The texture id of the blocklight/skylight texture used for lighting effects
083 */
084 public int lightmapTexture;
085
086 /**
087 * Colors computed in updateLightmap() and loaded into the lightmap emptyTexture
088 */
089 private int[] lightmapColors;
090
091 /** FOV modifier hand */
092 private float fovModifierHand;
093
094 /** FOV modifier hand prev */
095 private float fovModifierHandPrev;
096
097 /** FOV multiplier temp */
098 private float fovMultiplierTemp;
099 private float field_82831_U;
100 private float field_82832_V;
101
102 /** Cloud fog mode */
103 private boolean cloudFog = false;
104 private double cameraZoom = 1.0D;
105 private double cameraYaw = 0.0D;
106 private double cameraPitch = 0.0D;
107
108 /** Previous frame time in milliseconds */
109 private long prevFrameTime = Minecraft.getSystemTime();
110
111 /** End time of last render (ns) */
112 private long renderEndNanoTime = 0L;
113
114 /**
115 * Is set, updateCameraAndRender() calls updateLightmap(); set by updateTorchFlicker()
116 */
117 private boolean lightmapUpdateNeeded = false;
118
119 /** Torch flicker X */
120 float torchFlickerX = 0.0F;
121
122 /** Torch flicker DX */
123 float torchFlickerDX = 0.0F;
124
125 /** Torch flicker Y */
126 float torchFlickerY = 0.0F;
127
128 /** Torch flicker DY */
129 float torchFlickerDY = 0.0F;
130 private Random random = new Random();
131
132 /** Rain sound counter */
133 private int rainSoundCounter = 0;
134
135 /** Rain X coords */
136 float[] rainXCoords;
137
138 /** Rain Y coords */
139 float[] rainYCoords;
140 volatile int field_78523_k = 0;
141 volatile int field_78520_l = 0;
142
143 /** Fog color buffer */
144 FloatBuffer fogColorBuffer = GLAllocation.createDirectFloatBuffer(16);
145
146 /** red component of the fog color */
147 float fogColorRed;
148
149 /** green component of the fog color */
150 float fogColorGreen;
151
152 /** blue component of the fog color */
153 float fogColorBlue;
154
155 /** Fog color 2 */
156 private float fogColor2;
157
158 /** Fog color 1 */
159 private float fogColor1;
160
161 /**
162 * Debug view direction (0=OFF, 1=Front, 2=Right, 3=Back, 4=Left, 5=TiltLeft, 6=TiltRight)
163 */
164 public int debugViewDirection;
165
166 public EntityRenderer(Minecraft par1Minecraft)
167 {
168 this.mc = par1Minecraft;
169 this.itemRenderer = new ItemRenderer(par1Minecraft);
170 this.lightmapTexture = par1Minecraft.renderEngine.allocateAndSetupTexture(new BufferedImage(16, 16, 1));
171 this.lightmapColors = new int[256];
172 }
173
174 /**
175 * Updates the entity renderer
176 */
177 public void updateRenderer()
178 {
179 this.updateFovModifierHand();
180 this.updateTorchFlicker();
181 this.fogColor2 = this.fogColor1;
182 this.thirdPersonDistanceTemp = this.thirdPersonDistance;
183 this.prevDebugCamYaw = this.debugCamYaw;
184 this.prevDebugCamPitch = this.debugCamPitch;
185 this.prevDebugCamFOV = this.debugCamFOV;
186 this.prevCamRoll = this.camRoll;
187 float var1;
188 float var2;
189
190 if (this.mc.gameSettings.smoothCamera)
191 {
192 var1 = this.mc.gameSettings.mouseSensitivity * 0.6F + 0.2F;
193 var2 = var1 * var1 * var1 * 8.0F;
194 this.smoothCamFilterX = this.mouseFilterXAxis.func_76333_a(this.smoothCamYaw, 0.05F * var2);
195 this.smoothCamFilterY = this.mouseFilterYAxis.func_76333_a(this.smoothCamPitch, 0.05F * var2);
196 this.smoothCamPartialTicks = 0.0F;
197 this.smoothCamYaw = 0.0F;
198 this.smoothCamPitch = 0.0F;
199 }
200
201 if (this.mc.renderViewEntity == null)
202 {
203 this.mc.renderViewEntity = this.mc.thePlayer;
204 }
205
206 var1 = this.mc.theWorld.getLightBrightness(MathHelper.floor_double(this.mc.renderViewEntity.posX), MathHelper.floor_double(this.mc.renderViewEntity.posY), MathHelper.floor_double(this.mc.renderViewEntity.posZ));
207 var2 = (float)(3 - this.mc.gameSettings.renderDistance) / 3.0F;
208 float var3 = var1 * (1.0F - var2) + var2;
209 this.fogColor1 += (var3 - this.fogColor1) * 0.1F;
210 ++this.rendererUpdateCount;
211 this.itemRenderer.updateEquippedItem();
212 this.addRainParticles();
213 this.field_82832_V = this.field_82831_U;
214
215 if (BossStatus.field_82825_d)
216 {
217 this.field_82831_U += 0.05F;
218
219 if (this.field_82831_U > 1.0F)
220 {
221 this.field_82831_U = 1.0F;
222 }
223
224 BossStatus.field_82825_d = false;
225 }
226 else if (this.field_82831_U > 0.0F)
227 {
228 this.field_82831_U -= 0.0125F;
229 }
230 }
231
232 /**
233 * Finds what block or object the mouse is over at the specified partial tick time. Args: partialTickTime
234 */
235 public void getMouseOver(float par1)
236 {
237 if (this.mc.renderViewEntity != null)
238 {
239 if (this.mc.theWorld != null)
240 {
241 double var2 = (double)this.mc.playerController.getBlockReachDistance();
242 this.mc.objectMouseOver = this.mc.renderViewEntity.rayTrace(var2, par1);
243 double var4 = var2;
244 Vec3 var6 = this.mc.renderViewEntity.getPosition(par1);
245
246 if (this.mc.playerController.extendedReach())
247 {
248 var2 = 6.0D;
249 var4 = 6.0D;
250 }
251 else
252 {
253 if (var2 > 3.0D)
254 {
255 var4 = 3.0D;
256 }
257
258 var2 = var4;
259 }
260
261 if (this.mc.objectMouseOver != null)
262 {
263 var4 = this.mc.objectMouseOver.hitVec.distanceTo(var6);
264 }
265
266 Vec3 var7 = this.mc.renderViewEntity.getLook(par1);
267 Vec3 var8 = var6.addVector(var7.xCoord * var2, var7.yCoord * var2, var7.zCoord * var2);
268 this.pointedEntity = null;
269 float var9 = 1.0F;
270 List var10 = this.mc.theWorld.getEntitiesWithinAABBExcludingEntity(this.mc.renderViewEntity, this.mc.renderViewEntity.boundingBox.addCoord(var7.xCoord * var2, var7.yCoord * var2, var7.zCoord * var2).expand((double)var9, (double)var9, (double)var9));
271 double var11 = var4;
272
273 for (int var13 = 0; var13 < var10.size(); ++var13)
274 {
275 Entity var14 = (Entity)var10.get(var13);
276
277 if (var14.canBeCollidedWith())
278 {
279 float var15 = var14.getCollisionBorderSize();
280 AxisAlignedBB var16 = var14.boundingBox.expand((double)var15, (double)var15, (double)var15);
281 MovingObjectPosition var17 = var16.calculateIntercept(var6, var8);
282
283 if (var16.isVecInside(var6))
284 {
285 if (0.0D < var11 || var11 == 0.0D)
286 {
287 this.pointedEntity = var14;
288 var11 = 0.0D;
289 }
290 }
291 else if (var17 != null)
292 {
293 double var18 = var6.distanceTo(var17.hitVec);
294
295 if (var18 < var11 || var11 == 0.0D)
296 {
297 this.pointedEntity = var14;
298 var11 = var18;
299 }
300 }
301 }
302 }
303
304 if (this.pointedEntity != null && (var11 < var4 || this.mc.objectMouseOver == null))
305 {
306 this.mc.objectMouseOver = new MovingObjectPosition(this.pointedEntity);
307 }
308 }
309 }
310 }
311
312 /**
313 * Update FOV modifier hand
314 */
315 private void updateFovModifierHand()
316 {
317 if (mc.renderViewEntity instanceof EntityPlayerSP)
318 {
319 EntityPlayerSP var1 = (EntityPlayerSP)this.mc.renderViewEntity;
320 this.fovMultiplierTemp = var1.getFOVMultiplier();
321 }
322 else
323 {
324 this.fovMultiplierTemp = mc.thePlayer.getFOVMultiplier();
325 }
326 this.fovModifierHandPrev = this.fovModifierHand;
327 this.fovModifierHand += (this.fovMultiplierTemp - this.fovModifierHand) * 0.5F;
328 }
329
330 /**
331 * Changes the field of view of the player depending on if they are underwater or not
332 */
333 private float getFOVModifier(float par1, boolean par2)
334 {
335 if (this.debugViewDirection > 0)
336 {
337 return 90.0F;
338 }
339 else
340 {
341 EntityLiving var3 = (EntityLiving)this.mc.renderViewEntity;
342 float var4 = 70.0F;
343
344 if (par2)
345 {
346 var4 += this.mc.gameSettings.fovSetting * 40.0F;
347 var4 *= this.fovModifierHandPrev + (this.fovModifierHand - this.fovModifierHandPrev) * par1;
348 }
349
350 if (var3.getHealth() <= 0)
351 {
352 float var5 = (float)var3.deathTime + par1;
353 var4 /= (1.0F - 500.0F / (var5 + 500.0F)) * 2.0F + 1.0F;
354 }
355
356 int var6 = ActiveRenderInfo.getBlockIdAtEntityViewpoint(this.mc.theWorld, var3, par1);
357
358 if (var6 != 0 && Block.blocksList[var6].blockMaterial == Material.water)
359 {
360 var4 = var4 * 60.0F / 70.0F;
361 }
362
363 return var4 + this.prevDebugCamFOV + (this.debugCamFOV - this.prevDebugCamFOV) * par1;
364 }
365 }
366
367 private void hurtCameraEffect(float par1)
368 {
369 EntityLiving var2 = this.mc.renderViewEntity;
370 float var3 = (float)var2.hurtTime - par1;
371 float var4;
372
373 if (var2.getHealth() <= 0)
374 {
375 var4 = (float)var2.deathTime + par1;
376 GL11.glRotatef(40.0F - 8000.0F / (var4 + 200.0F), 0.0F, 0.0F, 1.0F);
377 }
378
379 if (var3 >= 0.0F)
380 {
381 var3 /= (float)var2.maxHurtTime;
382 var3 = MathHelper.sin(var3 * var3 * var3 * var3 * (float)Math.PI);
383 var4 = var2.attackedAtYaw;
384 GL11.glRotatef(-var4, 0.0F, 1.0F, 0.0F);
385 GL11.glRotatef(-var3 * 14.0F, 0.0F, 0.0F, 1.0F);
386 GL11.glRotatef(var4, 0.0F, 1.0F, 0.0F);
387 }
388 }
389
390 /**
391 * Setups all the GL settings for view bobbing. Args: partialTickTime
392 */
393 private void setupViewBobbing(float par1)
394 {
395 if (this.mc.renderViewEntity instanceof EntityPlayer)
396 {
397 EntityPlayer var2 = (EntityPlayer)this.mc.renderViewEntity;
398 float var3 = var2.distanceWalkedModified - var2.prevDistanceWalkedModified;
399 float var4 = -(var2.distanceWalkedModified + var3 * par1);
400 float var5 = var2.prevCameraYaw + (var2.cameraYaw - var2.prevCameraYaw) * par1;
401 float var6 = var2.prevCameraPitch + (var2.cameraPitch - var2.prevCameraPitch) * par1;
402 GL11.glTranslatef(MathHelper.sin(var4 * (float)Math.PI) * var5 * 0.5F, -Math.abs(MathHelper.cos(var4 * (float)Math.PI) * var5), 0.0F);
403 GL11.glRotatef(MathHelper.sin(var4 * (float)Math.PI) * var5 * 3.0F, 0.0F, 0.0F, 1.0F);
404 GL11.glRotatef(Math.abs(MathHelper.cos(var4 * (float)Math.PI - 0.2F) * var5) * 5.0F, 1.0F, 0.0F, 0.0F);
405 GL11.glRotatef(var6, 1.0F, 0.0F, 0.0F);
406 }
407 }
408
409 /**
410 * sets up player's eye (or camera in third person mode)
411 */
412 private void orientCamera(float par1)
413 {
414 EntityLiving var2 = this.mc.renderViewEntity;
415 float var3 = var2.yOffset - 1.62F;
416 double var4 = var2.prevPosX + (var2.posX - var2.prevPosX) * (double)par1;
417 double var6 = var2.prevPosY + (var2.posY - var2.prevPosY) * (double)par1 - (double)var3;
418 double var8 = var2.prevPosZ + (var2.posZ - var2.prevPosZ) * (double)par1;
419 GL11.glRotatef(this.prevCamRoll + (this.camRoll - this.prevCamRoll) * par1, 0.0F, 0.0F, 1.0F);
420
421 if (var2.isPlayerSleeping())
422 {
423 var3 = (float)((double)var3 + 1.0D);
424 GL11.glTranslatef(0.0F, 0.3F, 0.0F);
425
426 if (!this.mc.gameSettings.debugCamEnable)
427 {
428 ForgeHooksClient.orientBedCamera(mc, var2);
429 GL11.glRotatef(var2.prevRotationYaw + (var2.rotationYaw - var2.prevRotationYaw) * par1 + 180.0F, 0.0F, -1.0F, 0.0F);
430 GL11.glRotatef(var2.prevRotationPitch + (var2.rotationPitch - var2.prevRotationPitch) * par1, -1.0F, 0.0F, 0.0F);
431 }
432 }
433 else if (this.mc.gameSettings.thirdPersonView > 0)
434 {
435 double var27 = (double)(this.thirdPersonDistanceTemp + (this.thirdPersonDistance - this.thirdPersonDistanceTemp) * par1);
436 float var13;
437 float var28;
438
439 if (this.mc.gameSettings.debugCamEnable)
440 {
441 var28 = this.prevDebugCamYaw + (this.debugCamYaw - this.prevDebugCamYaw) * par1;
442 var13 = this.prevDebugCamPitch + (this.debugCamPitch - this.prevDebugCamPitch) * par1;
443 GL11.glTranslatef(0.0F, 0.0F, (float)(-var27));
444 GL11.glRotatef(var13, 1.0F, 0.0F, 0.0F);
445 GL11.glRotatef(var28, 0.0F, 1.0F, 0.0F);
446 }
447 else
448 {
449 var28 = var2.rotationYaw;
450 var13 = var2.rotationPitch;
451
452 if (this.mc.gameSettings.thirdPersonView == 2)
453 {
454 var13 += 180.0F;
455 }
456
457 double var14 = (double)(-MathHelper.sin(var28 / 180.0F * (float)Math.PI) * MathHelper.cos(var13 / 180.0F * (float)Math.PI)) * var27;
458 double var16 = (double)(MathHelper.cos(var28 / 180.0F * (float)Math.PI) * MathHelper.cos(var13 / 180.0F * (float)Math.PI)) * var27;
459 double var18 = (double)(-MathHelper.sin(var13 / 180.0F * (float)Math.PI)) * var27;
460
461 for (int var20 = 0; var20 < 8; ++var20)
462 {
463 float var21 = (float)((var20 & 1) * 2 - 1);
464 float var22 = (float)((var20 >> 1 & 1) * 2 - 1);
465 float var23 = (float)((var20 >> 2 & 1) * 2 - 1);
466 var21 *= 0.1F;
467 var22 *= 0.1F;
468 var23 *= 0.1F;
469 MovingObjectPosition var24 = this.mc.theWorld.rayTraceBlocks(this.mc.theWorld.getWorldVec3Pool().getVecFromPool(var4 + (double)var21, var6 + (double)var22, var8 + (double)var23), this.mc.theWorld.getWorldVec3Pool().getVecFromPool(var4 - var14 + (double)var21 + (double)var23, var6 - var18 + (double)var22, var8 - var16 + (double)var23));
470
471 if (var24 != null)
472 {
473 double var25 = var24.hitVec.distanceTo(this.mc.theWorld.getWorldVec3Pool().getVecFromPool(var4, var6, var8));
474
475 if (var25 < var27)
476 {
477 var27 = var25;
478 }
479 }
480 }
481
482 if (this.mc.gameSettings.thirdPersonView == 2)
483 {
484 GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F);
485 }
486
487 GL11.glRotatef(var2.rotationPitch - var13, 1.0F, 0.0F, 0.0F);
488 GL11.glRotatef(var2.rotationYaw - var28, 0.0F, 1.0F, 0.0F);
489 GL11.glTranslatef(0.0F, 0.0F, (float)(-var27));
490 GL11.glRotatef(var28 - var2.rotationYaw, 0.0F, 1.0F, 0.0F);
491 GL11.glRotatef(var13 - var2.rotationPitch, 1.0F, 0.0F, 0.0F);
492 }
493 }
494 else
495 {
496 GL11.glTranslatef(0.0F, 0.0F, -0.1F);
497 }
498
499 if (!this.mc.gameSettings.debugCamEnable)
500 {
501 GL11.glRotatef(var2.prevRotationPitch + (var2.rotationPitch - var2.prevRotationPitch) * par1, 1.0F, 0.0F, 0.0F);
502 GL11.glRotatef(var2.prevRotationYaw + (var2.rotationYaw - var2.prevRotationYaw) * par1 + 180.0F, 0.0F, 1.0F, 0.0F);
503 }
504
505 GL11.glTranslatef(0.0F, var3, 0.0F);
506 var4 = var2.prevPosX + (var2.posX - var2.prevPosX) * (double)par1;
507 var6 = var2.prevPosY + (var2.posY - var2.prevPosY) * (double)par1 - (double)var3;
508 var8 = var2.prevPosZ + (var2.posZ - var2.prevPosZ) * (double)par1;
509 this.cloudFog = this.mc.renderGlobal.func_72721_a(var4, var6, var8, par1);
510 }
511
512 /**
513 * sets up projection, view effects, camera position/rotation
514 */
515 private void setupCameraTransform(float par1, int par2)
516 {
517 this.farPlaneDistance = (float)(256 >> this.mc.gameSettings.renderDistance);
518 GL11.glMatrixMode(GL11.GL_PROJECTION);
519 GL11.glLoadIdentity();
520 float var3 = 0.07F;
521
522 if (this.mc.gameSettings.anaglyph)
523 {
524 GL11.glTranslatef((float)(-(par2 * 2 - 1)) * var3, 0.0F, 0.0F);
525 }
526
527 if (this.cameraZoom != 1.0D)
528 {
529 GL11.glTranslatef((float)this.cameraYaw, (float)(-this.cameraPitch), 0.0F);
530 GL11.glScaled(this.cameraZoom, this.cameraZoom, 1.0D);
531 }
532
533 GLU.gluPerspective(this.getFOVModifier(par1, true), (float)this.mc.displayWidth / (float)this.mc.displayHeight, 0.05F, this.farPlaneDistance * 2.0F);
534 float var4;
535
536 if (this.mc.playerController.func_78747_a())
537 {
538 var4 = 0.6666667F;
539 GL11.glScalef(1.0F, var4, 1.0F);
540 }
541
542 GL11.glMatrixMode(GL11.GL_MODELVIEW);
543 GL11.glLoadIdentity();
544
545 if (this.mc.gameSettings.anaglyph)
546 {
547 GL11.glTranslatef((float)(par2 * 2 - 1) * 0.1F, 0.0F, 0.0F);
548 }
549
550 this.hurtCameraEffect(par1);
551
552 if (this.mc.gameSettings.viewBobbing)
553 {
554 this.setupViewBobbing(par1);
555 }
556
557 var4 = this.mc.thePlayer.prevTimeInPortal + (this.mc.thePlayer.timeInPortal - this.mc.thePlayer.prevTimeInPortal) * par1;
558
559 if (var4 > 0.0F)
560 {
561 byte var5 = 20;
562
563 if (this.mc.thePlayer.isPotionActive(Potion.confusion))
564 {
565 var5 = 7;
566 }
567
568 float var6 = 5.0F / (var4 * var4 + 5.0F) - var4 * 0.04F;
569 var6 *= var6;
570 GL11.glRotatef(((float)this.rendererUpdateCount + par1) * (float)var5, 0.0F, 1.0F, 1.0F);
571 GL11.glScalef(1.0F / var6, 1.0F, 1.0F);
572 GL11.glRotatef(-((float)this.rendererUpdateCount + par1) * (float)var5, 0.0F, 1.0F, 1.0F);
573 }
574
575 this.orientCamera(par1);
576
577 if (this.debugViewDirection > 0)
578 {
579 int var7 = this.debugViewDirection - 1;
580
581 if (var7 == 1)
582 {
583 GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F);
584 }
585
586 if (var7 == 2)
587 {
588 GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F);
589 }
590
591 if (var7 == 3)
592 {
593 GL11.glRotatef(-90.0F, 0.0F, 1.0F, 0.0F);
594 }
595
596 if (var7 == 4)
597 {
598 GL11.glRotatef(90.0F, 1.0F, 0.0F, 0.0F);
599 }
600
601 if (var7 == 5)
602 {
603 GL11.glRotatef(-90.0F, 1.0F, 0.0F, 0.0F);
604 }
605 }
606 }
607
608 /**
609 * Render player hand
610 */
611 private void renderHand(float par1, int par2)
612 {
613 if (this.debugViewDirection <= 0)
614 {
615 GL11.glMatrixMode(GL11.GL_PROJECTION);
616 GL11.glLoadIdentity();
617 float var3 = 0.07F;
618
619 if (this.mc.gameSettings.anaglyph)
620 {
621 GL11.glTranslatef((float)(-(par2 * 2 - 1)) * var3, 0.0F, 0.0F);
622 }
623
624 if (this.cameraZoom != 1.0D)
625 {
626 GL11.glTranslatef((float)this.cameraYaw, (float)(-this.cameraPitch), 0.0F);
627 GL11.glScaled(this.cameraZoom, this.cameraZoom, 1.0D);
628 }
629
630 GLU.gluPerspective(this.getFOVModifier(par1, false), (float)this.mc.displayWidth / (float)this.mc.displayHeight, 0.05F, this.farPlaneDistance * 2.0F);
631
632 if (this.mc.playerController.func_78747_a())
633 {
634 float var4 = 0.6666667F;
635 GL11.glScalef(1.0F, var4, 1.0F);
636 }
637
638 GL11.glMatrixMode(GL11.GL_MODELVIEW);
639 GL11.glLoadIdentity();
640
641 if (this.mc.gameSettings.anaglyph)
642 {
643 GL11.glTranslatef((float)(par2 * 2 - 1) * 0.1F, 0.0F, 0.0F);
644 }
645
646 GL11.glPushMatrix();
647 this.hurtCameraEffect(par1);
648
649 if (this.mc.gameSettings.viewBobbing)
650 {
651 this.setupViewBobbing(par1);
652 }
653
654 if (this.mc.gameSettings.thirdPersonView == 0 && !this.mc.renderViewEntity.isPlayerSleeping() && !this.mc.gameSettings.hideGUI && !this.mc.playerController.func_78747_a())
655 {
656 this.enableLightmap((double)par1);
657 this.itemRenderer.renderItemInFirstPerson(par1);
658 this.disableLightmap((double)par1);
659 }
660
661 GL11.glPopMatrix();
662
663 if (this.mc.gameSettings.thirdPersonView == 0 && !this.mc.renderViewEntity.isPlayerSleeping())
664 {
665 this.itemRenderer.renderOverlays(par1);
666 this.hurtCameraEffect(par1);
667 }
668
669 if (this.mc.gameSettings.viewBobbing)
670 {
671 this.setupViewBobbing(par1);
672 }
673 }
674 }
675
676 /**
677 * Disable secondary texture unit used by lightmap
678 */
679 public void disableLightmap(double par1)
680 {
681 OpenGlHelper.setActiveTexture(OpenGlHelper.lightmapTexUnit);
682 GL11.glDisable(GL11.GL_TEXTURE_2D);
683 OpenGlHelper.setActiveTexture(OpenGlHelper.defaultTexUnit);
684 }
685
686 /**
687 * Enable lightmap in secondary texture unit
688 */
689 public void enableLightmap(double par1)
690 {
691 OpenGlHelper.setActiveTexture(OpenGlHelper.lightmapTexUnit);
692 GL11.glMatrixMode(GL11.GL_TEXTURE);
693 GL11.glLoadIdentity();
694 float var3 = 0.00390625F;
695 GL11.glScalef(var3, var3, var3);
696 GL11.glTranslatef(8.0F, 8.0F, 8.0F);
697 GL11.glMatrixMode(GL11.GL_MODELVIEW);
698 this.mc.renderEngine.bindTexture(this.lightmapTexture);
699 GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
700 GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
701 GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
702 GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
703 GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_CLAMP);
704 GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_CLAMP);
705 GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
706 GL11.glEnable(GL11.GL_TEXTURE_2D);
707 OpenGlHelper.setActiveTexture(OpenGlHelper.defaultTexUnit);
708 }
709
710 /**
711 * Recompute a random value that is applied to block color in updateLightmap()
712 */
713 private void updateTorchFlicker()
714 {
715 this.torchFlickerDX = (float)((double)this.torchFlickerDX + (Math.random() - Math.random()) * Math.random() * Math.random());
716 this.torchFlickerDY = (float)((double)this.torchFlickerDY + (Math.random() - Math.random()) * Math.random() * Math.random());
717 this.torchFlickerDX = (float)((double)this.torchFlickerDX * 0.9D);
718 this.torchFlickerDY = (float)((double)this.torchFlickerDY * 0.9D);
719 this.torchFlickerX += (this.torchFlickerDX - this.torchFlickerX) * 1.0F;
720 this.torchFlickerY += (this.torchFlickerDY - this.torchFlickerY) * 1.0F;
721 this.lightmapUpdateNeeded = true;
722 }
723
724 private void updateLightmap(float par1)
725 {
726 WorldClient var2 = this.mc.theWorld;
727
728 if (var2 != null)
729 {
730 for (int var3 = 0; var3 < 256; ++var3)
731 {
732 float var4 = var2.func_72971_b(1.0F) * 0.95F + 0.05F;
733 float var5 = var2.provider.lightBrightnessTable[var3 / 16] * var4;
734 float var6 = var2.provider.lightBrightnessTable[var3 % 16] * (this.torchFlickerX * 0.1F + 1.5F);
735
736 if (var2.lightningFlash > 0)
737 {
738 var5 = var2.provider.lightBrightnessTable[var3 / 16];
739 }
740
741 float var7 = var5 * (var2.func_72971_b(1.0F) * 0.65F + 0.35F);
742 float var8 = var5 * (var2.func_72971_b(1.0F) * 0.65F + 0.35F);
743 float var11 = var6 * ((var6 * 0.6F + 0.4F) * 0.6F + 0.4F);
744 float var12 = var6 * (var6 * var6 * 0.6F + 0.4F);
745 float var13 = var7 + var6;
746 float var14 = var8 + var11;
747 float var15 = var5 + var12;
748 var13 = var13 * 0.96F + 0.03F;
749 var14 = var14 * 0.96F + 0.03F;
750 var15 = var15 * 0.96F + 0.03F;
751 float var16;
752
753 if (this.field_82831_U > 0.0F)
754 {
755 var16 = this.field_82832_V + (this.field_82831_U - this.field_82832_V) * par1;
756 var13 = var13 * (1.0F - var16) + var13 * 0.7F * var16;
757 var14 = var14 * (1.0F - var16) + var14 * 0.6F * var16;
758 var15 = var15 * (1.0F - var16) + var15 * 0.6F * var16;
759 }
760
761 if (var2.provider.dimensionId == 1)
762 {
763 var13 = 0.22F + var6 * 0.75F;
764 var14 = 0.28F + var11 * 0.75F;
765 var15 = 0.25F + var12 * 0.75F;
766 }
767
768 float var17;
769
770 if (this.mc.thePlayer.isPotionActive(Potion.nightVision))
771 {
772 var16 = this.func_82830_a(this.mc.thePlayer, par1);
773 var17 = 1.0F / var13;
774
775 if (var17 > 1.0F / var14)
776 {
777 var17 = 1.0F / var14;
778 }
779
780 if (var17 > 1.0F / var15)
781 {
782 var17 = 1.0F / var15;
783 }
784
785 var13 = var13 * (1.0F - var16) + var13 * var17 * var16;
786 var14 = var14 * (1.0F - var16) + var14 * var17 * var16;
787 var15 = var15 * (1.0F - var16) + var15 * var17 * var16;
788 }
789
790 if (var13 > 1.0F)
791 {
792 var13 = 1.0F;
793 }
794
795 if (var14 > 1.0F)
796 {
797 var14 = 1.0F;
798 }
799
800 if (var15 > 1.0F)
801 {
802 var15 = 1.0F;
803 }
804
805 var16 = this.mc.gameSettings.gammaSetting;
806 var17 = 1.0F - var13;
807 float var18 = 1.0F - var14;
808 float var19 = 1.0F - var15;
809 var17 = 1.0F - var17 * var17 * var17 * var17;
810 var18 = 1.0F - var18 * var18 * var18 * var18;
811 var19 = 1.0F - var19 * var19 * var19 * var19;
812 var13 = var13 * (1.0F - var16) + var17 * var16;
813 var14 = var14 * (1.0F - var16) + var18 * var16;
814 var15 = var15 * (1.0F - var16) + var19 * var16;
815 var13 = var13 * 0.96F + 0.03F;
816 var14 = var14 * 0.96F + 0.03F;
817 var15 = var15 * 0.96F + 0.03F;
818
819 if (var13 > 1.0F)
820 {
821 var13 = 1.0F;
822 }
823
824 if (var14 > 1.0F)
825 {
826 var14 = 1.0F;
827 }
828
829 if (var15 > 1.0F)
830 {
831 var15 = 1.0F;
832 }
833
834 if (var13 < 0.0F)
835 {
836 var13 = 0.0F;
837 }
838
839 if (var14 < 0.0F)
840 {
841 var14 = 0.0F;
842 }
843
844 if (var15 < 0.0F)
845 {
846 var15 = 0.0F;
847 }
848
849 short var20 = 255;
850 int var21 = (int)(var13 * 255.0F);
851 int var22 = (int)(var14 * 255.0F);
852 int var23 = (int)(var15 * 255.0F);
853 this.lightmapColors[var3] = var20 << 24 | var21 << 16 | var22 << 8 | var23;
854 }
855
856 this.mc.renderEngine.createTextureFromBytes(this.lightmapColors, 16, 16, this.lightmapTexture);
857 }
858 }
859
860 private float func_82830_a(EntityPlayer par1EntityPlayer, float par2)
861 {
862 int var3 = par1EntityPlayer.getActivePotionEffect(Potion.nightVision).getDuration();
863 return var3 > 200 ? 1.0F : 0.7F + MathHelper.sin(((float)var3 - par2) * (float)Math.PI * 0.2F) * 0.3F;
864 }
865
866 /**
867 * Will update any inputs that effect the camera angle (mouse) and then render the world and GUI
868 */
869 public void updateCameraAndRender(float par1)
870 {
871 this.mc.mcProfiler.startSection("lightTex");
872
873 if (this.lightmapUpdateNeeded)
874 {
875 this.updateLightmap(par1);
876 }
877
878 this.mc.mcProfiler.endSection();
879 boolean var2 = Display.isActive();
880
881 if (!var2 && this.mc.gameSettings.pauseOnLostFocus && (!this.mc.gameSettings.field_85185_A || !Mouse.isButtonDown(1)))
882 {
883 if (Minecraft.getSystemTime() - this.prevFrameTime > 500L)
884 {
885 this.mc.displayInGameMenu();
886 }
887 }
888 else
889 {
890 this.prevFrameTime = Minecraft.getSystemTime();
891 }
892
893 this.mc.mcProfiler.startSection("mouse");
894
895 if (this.mc.inGameHasFocus && var2)
896 {
897 this.mc.mouseHelper.mouseXYChange();
898 float var3 = this.mc.gameSettings.mouseSensitivity * 0.6F + 0.2F;
899 float var4 = var3 * var3 * var3 * 8.0F;
900 float var5 = (float)this.mc.mouseHelper.deltaX * var4;
901 float var6 = (float)this.mc.mouseHelper.deltaY * var4;
902 byte var7 = 1;
903
904 if (this.mc.gameSettings.invertMouse)
905 {
906 var7 = -1;
907 }
908
909 if (this.mc.gameSettings.smoothCamera)
910 {
911 this.smoothCamYaw += var5;
912 this.smoothCamPitch += var6;
913 float var8 = par1 - this.smoothCamPartialTicks;
914 this.smoothCamPartialTicks = par1;
915 var5 = this.smoothCamFilterX * var8;
916 var6 = this.smoothCamFilterY * var8;
917 this.mc.thePlayer.setAngles(var5, var6 * (float)var7);
918 }
919 else
920 {
921 this.mc.thePlayer.setAngles(var5, var6 * (float)var7);
922 }
923 }
924
925 this.mc.mcProfiler.endSection();
926
927 if (!this.mc.skipRenderWorld)
928 {
929 anaglyphEnable = this.mc.gameSettings.anaglyph;
930 ScaledResolution var13 = new ScaledResolution(this.mc.gameSettings, this.mc.displayWidth, this.mc.displayHeight);
931 int var14 = var13.getScaledWidth();
932 int var15 = var13.getScaledHeight();
933 int var16 = Mouse.getX() * var14 / this.mc.displayWidth;
934 int var17 = var15 - Mouse.getY() * var15 / this.mc.displayHeight - 1;
935 int var18 = func_78465_a(this.mc.gameSettings.limitFramerate);
936
937 if (this.mc.theWorld != null)
938 {
939 this.mc.mcProfiler.startSection("level");
940
941 if (this.mc.gameSettings.limitFramerate == 0)
942 {
943 this.renderWorld(par1, 0L);
944 }
945 else
946 {
947 this.renderWorld(par1, this.renderEndNanoTime + (long)(1000000000 / var18));
948 }
949
950 this.renderEndNanoTime = System.nanoTime();
951 this.mc.mcProfiler.endStartSection("gui");
952
953 if (!this.mc.gameSettings.hideGUI || this.mc.currentScreen != null)
954 {
955 this.mc.ingameGUI.renderGameOverlay(par1, this.mc.currentScreen != null, var16, var17);
956 }
957
958 this.mc.mcProfiler.endSection();
959 }
960 else
961 {
962 GL11.glViewport(0, 0, this.mc.displayWidth, this.mc.displayHeight);
963 GL11.glMatrixMode(GL11.GL_PROJECTION);
964 GL11.glLoadIdentity();
965 GL11.glMatrixMode(GL11.GL_MODELVIEW);
966 GL11.glLoadIdentity();
967 this.setupOverlayRendering();
968 this.renderEndNanoTime = System.nanoTime();
969 }
970
971 if (this.mc.currentScreen != null)
972 {
973 GL11.glClear(256);
974
975 try
976 {
977 this.mc.currentScreen.drawScreen(var16, var17, par1);
978 }
979 catch (Throwable var12)
980 {
981 CrashReport var10 = CrashReport.func_85055_a(var12, "Rendering screen");
982 CrashReportCategory var11 = var10.func_85058_a("Screen render details");
983 var11.addCrashSectionCallable("Screen name", new CallableScreenName(this));
984 var11.addCrashSectionCallable("Mouse location", new CallableMouseLocation(this, var16, var17));
985 var11.addCrashSectionCallable("Screen size", new CallableScreenSize(this, var13));
986 throw new ReportedException(var10);
987 }
988
989 if (this.mc.currentScreen != null && this.mc.currentScreen.guiParticles != null)
990 {
991 this.mc.currentScreen.guiParticles.draw(par1);
992 }
993 }
994 }
995 }
996
997 public void renderWorld(float par1, long par2)
998 {
999 this.mc.mcProfiler.startSection("lightTex");
1000
1001 if (this.lightmapUpdateNeeded)
1002 {
1003 this.updateLightmap(par1);
1004 }
1005
1006 GL11.glEnable(GL11.GL_CULL_FACE);
1007 GL11.glEnable(GL11.GL_DEPTH_TEST);
1008
1009 if (this.mc.renderViewEntity == null)
1010 {
1011 this.mc.renderViewEntity = this.mc.thePlayer;
1012 }
1013
1014 this.mc.mcProfiler.endStartSection("pick");
1015 this.getMouseOver(par1);
1016 EntityLiving var4 = this.mc.renderViewEntity;
1017 RenderGlobal var5 = this.mc.renderGlobal;
1018 EffectRenderer var6 = this.mc.effectRenderer;
1019 double var7 = var4.lastTickPosX + (var4.posX - var4.lastTickPosX) * (double)par1;
1020 double var9 = var4.lastTickPosY + (var4.posY - var4.lastTickPosY) * (double)par1;
1021 double var11 = var4.lastTickPosZ + (var4.posZ - var4.lastTickPosZ) * (double)par1;
1022 this.mc.mcProfiler.endStartSection("center");
1023
1024 for (int var13 = 0; var13 < 2; ++var13)
1025 {
1026 if (this.mc.gameSettings.anaglyph)
1027 {
1028 anaglyphField = var13;
1029
1030 if (anaglyphField == 0)
1031 {
1032 GL11.glColorMask(false, true, true, false);
1033 }
1034 else
1035 {
1036 GL11.glColorMask(true, false, false, false);
1037 }
1038 }
1039
1040 this.mc.mcProfiler.endStartSection("clear");
1041 GL11.glViewport(0, 0, this.mc.displayWidth, this.mc.displayHeight);
1042 this.updateFogColor(par1);
1043 GL11.glClear(16640);
1044 GL11.glEnable(GL11.GL_CULL_FACE);
1045 this.mc.mcProfiler.endStartSection("camera");
1046 this.setupCameraTransform(par1, var13);
1047 ActiveRenderInfo.updateRenderInfo(this.mc.thePlayer, this.mc.gameSettings.thirdPersonView == 2);
1048 this.mc.mcProfiler.endStartSection("frustrum");
1049 ClippingHelperImpl.getInstance();
1050
1051 if (this.mc.gameSettings.renderDistance < 2)
1052 {
1053 this.setupFog(-1, par1);
1054 this.mc.mcProfiler.endStartSection("sky");
1055 var5.renderSky(par1);
1056 }
1057
1058 GL11.glEnable(GL11.GL_FOG);
1059 this.setupFog(1, par1);
1060
1061 if (this.mc.gameSettings.ambientOcclusion)
1062 {
1063 GL11.glShadeModel(GL11.GL_SMOOTH);
1064 }
1065
1066 this.mc.mcProfiler.endStartSection("culling");
1067 Frustrum var14 = new Frustrum();
1068 var14.setPosition(var7, var9, var11);
1069 this.mc.renderGlobal.clipRenderersByFrustum(var14, par1);
1070
1071 if (var13 == 0)
1072 {
1073 this.mc.mcProfiler.endStartSection("updatechunks");
1074
1075 while (!this.mc.renderGlobal.updateRenderers(var4, false) && par2 != 0L)
1076 {
1077 long var15 = par2 - System.nanoTime();
1078
1079 if (var15 < 0L || var15 > 1000000000L)
1080 {
1081 break;
1082 }
1083 }
1084 }
1085
1086 if (var4.posY < 128.0D)
1087 {
1088 this.func_82829_a(var5, par1);
1089 }
1090
1091 this.setupFog(0, par1);
1092 GL11.glEnable(GL11.GL_FOG);
1093 GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/terrain.png"));
1094 RenderHelper.disableStandardItemLighting();
1095 this.mc.mcProfiler.endStartSection("terrain");
1096 var5.sortAndRender(var4, 0, (double)par1);
1097 GL11.glShadeModel(GL11.GL_FLAT);
1098 EntityPlayer var17;
1099
1100 if (this.debugViewDirection == 0)
1101 {
1102 RenderHelper.enableStandardItemLighting();
1103 this.mc.mcProfiler.endStartSection("entities");
1104 var5.renderEntities(var4.getPosition(par1), var14, par1);
1105 this.enableLightmap((double)par1);
1106 this.mc.mcProfiler.endStartSection("litParticles");
1107 var6.renderLitParticles(var4, par1);
1108 RenderHelper.disableStandardItemLighting();
1109 this.setupFog(0, par1);
1110 this.mc.mcProfiler.endStartSection("particles");
1111 var6.renderParticles(var4, par1);
1112 this.disableLightmap((double)par1);
1113
1114 if (this.mc.objectMouseOver != null && var4.isInsideOfMaterial(Material.water) && var4 instanceof EntityPlayer && !this.mc.gameSettings.hideGUI)
1115 {
1116 var17 = (EntityPlayer)var4;
1117 GL11.glDisable(GL11.GL_ALPHA_TEST);
1118 this.mc.mcProfiler.endStartSection("outline");
1119 if (!ForgeHooksClient.onDrawBlockHighlight(var5, var17, mc.objectMouseOver, 0, var17.inventory.getCurrentItem(), par1))
1120 {
1121 var5.drawBlockBreaking(var17, this.mc.objectMouseOver, 0, var17.inventory.getCurrentItem(), par1);
1122 var5.drawSelectionBox(var17, this.mc.objectMouseOver, 0, var17.inventory.getCurrentItem(), par1);
1123 }
1124 GL11.glEnable(GL11.GL_ALPHA_TEST);
1125 }
1126 }
1127
1128 GL11.glDisable(GL11.GL_BLEND);
1129 GL11.glEnable(GL11.GL_CULL_FACE);
1130 GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
1131 GL11.glDepthMask(true);
1132 this.setupFog(0, par1);
1133 GL11.glEnable(GL11.GL_BLEND);
1134 GL11.glDisable(GL11.GL_CULL_FACE);
1135 GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/terrain.png"));
1136
1137 if (this.mc.gameSettings.fancyGraphics)
1138 {
1139 this.mc.mcProfiler.endStartSection("water");
1140
1141 if (this.mc.gameSettings.ambientOcclusion)
1142 {
1143 GL11.glShadeModel(GL11.GL_SMOOTH);
1144 }
1145
1146 GL11.glColorMask(false, false, false, false);
1147 int var18 = var5.sortAndRender(var4, 1, (double)par1);
1148
1149 if (this.mc.gameSettings.anaglyph)
1150 {
1151 if (anaglyphField == 0)
1152 {
1153 GL11.glColorMask(false, true, true, true);
1154 }
1155 else
1156 {
1157 GL11.glColorMask(true, false, false, true);
1158 }
1159 }
1160 else
1161 {
1162 GL11.glColorMask(true, true, true, true);
1163 }
1164
1165 if (var18 > 0)
1166 {
1167 var5.renderAllRenderLists(1, (double)par1);
1168 }
1169
1170 GL11.glShadeModel(GL11.GL_FLAT);
1171 }
1172 else
1173 {
1174 this.mc.mcProfiler.endStartSection("water");
1175 var5.sortAndRender(var4, 1, (double)par1);
1176 }
1177
1178 GL11.glDepthMask(true);
1179 GL11.glEnable(GL11.GL_CULL_FACE);
1180 GL11.glDisable(GL11.GL_BLEND);
1181
1182 if (this.cameraZoom == 1.0D && var4 instanceof EntityPlayer && !this.mc.gameSettings.hideGUI && this.mc.objectMouseOver != null && !var4.isInsideOfMaterial(Material.water))
1183 {
1184 var17 = (EntityPlayer)var4;
1185 GL11.glDisable(GL11.GL_ALPHA_TEST);
1186 this.mc.mcProfiler.endStartSection("outline");
1187 if (!ForgeHooksClient.onDrawBlockHighlight(var5, var17, mc.objectMouseOver, 0, var17.inventory.getCurrentItem(), par1))
1188 {
1189 var5.drawBlockBreaking(var17, this.mc.objectMouseOver, 0, var17.inventory.getCurrentItem(), par1);
1190 var5.drawSelectionBox(var17, this.mc.objectMouseOver, 0, var17.inventory.getCurrentItem(), par1);
1191 }
1192 GL11.glEnable(GL11.GL_ALPHA_TEST);
1193 }
1194
1195 this.mc.mcProfiler.endStartSection("destroyProgress");
1196 GL11.glEnable(GL11.GL_BLEND);
1197 GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE);
1198 var5.drawBlockDamageTexture(Tessellator.instance, var4, par1);
1199 GL11.glDisable(GL11.GL_BLEND);
1200 this.mc.mcProfiler.endStartSection("weather");
1201 this.renderRainSnow(par1);
1202 GL11.glDisable(GL11.GL_FOG);
1203
1204 if (var4.posY >= 128.0D)
1205 {
1206 this.func_82829_a(var5, par1);
1207 }
1208
1209 this.mc.mcProfiler.endStartSection("FRenderLast");
1210 ForgeHooksClient.dispatchRenderLast(var5, par1);
1211
1212 this.mc.mcProfiler.endStartSection("hand");
1213
1214 if (this.cameraZoom == 1.0D)
1215 {
1216 GL11.glClear(256);
1217 this.renderHand(par1, var13);
1218 }
1219
1220 if (!this.mc.gameSettings.anaglyph)
1221 {
1222 this.mc.mcProfiler.endSection();
1223 return;
1224 }
1225 }
1226
1227 GL11.glColorMask(true, true, true, false);
1228 this.mc.mcProfiler.endSection();
1229 }
1230
1231 private void func_82829_a(RenderGlobal par1RenderGlobal, float par2)
1232 {
1233 if (this.mc.gameSettings.shouldRenderClouds())
1234 {
1235 this.mc.mcProfiler.endStartSection("clouds");
1236 GL11.glPushMatrix();
1237 this.setupFog(0, par2);
1238 GL11.glEnable(GL11.GL_FOG);
1239 par1RenderGlobal.renderClouds(par2);
1240 GL11.glDisable(GL11.GL_FOG);
1241 this.setupFog(1, par2);
1242 GL11.glPopMatrix();
1243 }
1244 }
1245
1246 private void addRainParticles()
1247 {
1248 float var1 = this.mc.theWorld.getRainStrength(1.0F);
1249
1250 if (!this.mc.gameSettings.fancyGraphics)
1251 {
1252 var1 /= 2.0F;
1253 }
1254
1255 if (var1 != 0.0F)
1256 {
1257 this.random.setSeed((long)this.rendererUpdateCount * 312987231L);
1258 EntityLiving var2 = this.mc.renderViewEntity;
1259 WorldClient var3 = this.mc.theWorld;
1260 int var4 = MathHelper.floor_double(var2.posX);
1261 int var5 = MathHelper.floor_double(var2.posY);
1262 int var6 = MathHelper.floor_double(var2.posZ);
1263 byte var7 = 10;
1264 double var8 = 0.0D;
1265 double var10 = 0.0D;
1266 double var12 = 0.0D;
1267 int var14 = 0;
1268 int var15 = (int)(100.0F * var1 * var1);
1269
1270 if (this.mc.gameSettings.particleSetting == 1)
1271 {
1272 var15 >>= 1;
1273 }
1274 else if (this.mc.gameSettings.particleSetting == 2)
1275 {
1276 var15 = 0;
1277 }
1278
1279 for (int var16 = 0; var16 < var15; ++var16)
1280 {
1281 int var17 = var4 + this.random.nextInt(var7) - this.random.nextInt(var7);
1282 int var18 = var6 + this.random.nextInt(var7) - this.random.nextInt(var7);
1283 int var19 = var3.getPrecipitationHeight(var17, var18);
1284 int var20 = var3.getBlockId(var17, var19 - 1, var18);
1285 BiomeGenBase var21 = var3.getBiomeGenForCoords(var17, var18);
1286
1287 if (var19 <= var5 + var7 && var19 >= var5 - var7 && var21.canSpawnLightningBolt() && var21.getFloatTemperature() >= 0.2F)
1288 {
1289 float var22 = this.random.nextFloat();
1290 float var23 = this.random.nextFloat();
1291
1292 if (var20 > 0)
1293 {
1294 if (Block.blocksList[var20].blockMaterial == Material.lava)
1295 {
1296 this.mc.effectRenderer.addEffect(new EntitySmokeFX(var3, (double)((float)var17 + var22), (double)((float)var19 + 0.1F) - Block.blocksList[var20].getBlockBoundsMinY(), (double)((float)var18 + var23), 0.0D, 0.0D, 0.0D));
1297 }
1298 else
1299 {
1300 ++var14;
1301
1302 if (this.random.nextInt(var14) == 0)
1303 {
1304 var8 = (double)((float)var17 + var22);
1305 var10 = (double)((float)var19 + 0.1F) - Block.blocksList[var20].getBlockBoundsMinY();
1306 var12 = (double)((float)var18 + var23);
1307 }
1308
1309 this.mc.effectRenderer.addEffect(new EntityRainFX(var3, (double)((float)var17 + var22), (double)((float)var19 + 0.1F) - Block.blocksList[var20].getBlockBoundsMinY(), (double)((float)var18 + var23)));
1310 }
1311 }
1312 }
1313 }
1314
1315 if (var14 > 0 && this.random.nextInt(3) < this.rainSoundCounter++)
1316 {
1317 this.rainSoundCounter = 0;
1318
1319 if (var10 > var2.posY + 1.0D && var3.getPrecipitationHeight(MathHelper.floor_double(var2.posX), MathHelper.floor_double(var2.posZ)) > MathHelper.floor_double(var2.posY))
1320 {
1321 this.mc.theWorld.playSound(var8, var10, var12, "ambient.weather.rain", 0.1F, 0.5F);
1322 }
1323 else
1324 {
1325 this.mc.theWorld.playSound(var8, var10, var12, "ambient.weather.rain", 0.2F, 1.0F);
1326 }
1327 }
1328 }
1329 }
1330
1331 /**
1332 * Render rain and snow
1333 */
1334 protected void renderRainSnow(float par1)
1335 {
1336 float var2 = this.mc.theWorld.getRainStrength(par1);
1337
1338 if (var2 > 0.0F)
1339 {
1340 this.enableLightmap((double)par1);
1341
1342 if (this.rainXCoords == null)
1343 {
1344 this.rainXCoords = new float[1024];
1345 this.rainYCoords = new float[1024];
1346
1347 for (int var3 = 0; var3 < 32; ++var3)
1348 {
1349 for (int var4 = 0; var4 < 32; ++var4)
1350 {
1351 float var5 = (float)(var4 - 16);
1352 float var6 = (float)(var3 - 16);
1353 float var7 = MathHelper.sqrt_float(var5 * var5 + var6 * var6);
1354 this.rainXCoords[var3 << 5 | var4] = -var6 / var7;
1355 this.rainYCoords[var3 << 5 | var4] = var5 / var7;
1356 }
1357 }
1358 }
1359
1360 EntityLiving var41 = this.mc.renderViewEntity;
1361 WorldClient var42 = this.mc.theWorld;
1362 int var43 = MathHelper.floor_double(var41.posX);
1363 int var44 = MathHelper.floor_double(var41.posY);
1364 int var45 = MathHelper.floor_double(var41.posZ);
1365 Tessellator var8 = Tessellator.instance;
1366 GL11.glDisable(GL11.GL_CULL_FACE);
1367 GL11.glNormal3f(0.0F, 1.0F, 0.0F);
1368 GL11.glEnable(GL11.GL_BLEND);
1369 GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
1370 GL11.glAlphaFunc(GL11.GL_GREATER, 0.01F);
1371 GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/environment/snow.png"));
1372 double var9 = var41.lastTickPosX + (var41.posX - var41.lastTickPosX) * (double)par1;
1373 double var11 = var41.lastTickPosY + (var41.posY - var41.lastTickPosY) * (double)par1;
1374 double var13 = var41.lastTickPosZ + (var41.posZ - var41.lastTickPosZ) * (double)par1;
1375 int var15 = MathHelper.floor_double(var11);
1376 byte var16 = 5;
1377
1378 if (this.mc.gameSettings.fancyGraphics)
1379 {
1380 var16 = 10;
1381 }
1382
1383 boolean var17 = false;
1384 byte var18 = -1;
1385 float var19 = (float)this.rendererUpdateCount + par1;
1386
1387 if (this.mc.gameSettings.fancyGraphics)
1388 {
1389 var16 = 10;
1390 }
1391
1392 GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
1393 var17 = false;
1394
1395 for (int var20 = var45 - var16; var20 <= var45 + var16; ++var20)
1396 {
1397 for (int var21 = var43 - var16; var21 <= var43 + var16; ++var21)
1398 {
1399 int var22 = (var20 - var45 + 16) * 32 + var21 - var43 + 16;
1400 float var23 = this.rainXCoords[var22] * 0.5F;
1401 float var24 = this.rainYCoords[var22] * 0.5F;
1402 BiomeGenBase var25 = var42.getBiomeGenForCoords(var21, var20);
1403
1404 if (var25.canSpawnLightningBolt() || var25.getEnableSnow())
1405 {
1406 int var26 = var42.getPrecipitationHeight(var21, var20);
1407 int var27 = var44 - var16;
1408 int var28 = var44 + var16;
1409
1410 if (var27 < var26)
1411 {
1412 var27 = var26;
1413 }
1414
1415 if (var28 < var26)
1416 {
1417 var28 = var26;
1418 }
1419
1420 float var29 = 1.0F;
1421 int var30 = var26;
1422
1423 if (var26 < var15)
1424 {
1425 var30 = var15;
1426 }
1427
1428 if (var27 != var28)
1429 {
1430 this.random.setSeed((long)(var21 * var21 * 3121 + var21 * 45238971 ^ var20 * var20 * 418711 + var20 * 13761));
1431 float var31 = var25.getFloatTemperature();
1432 double var35;
1433 float var32;
1434
1435 if (var42.getWorldChunkManager().getTemperatureAtHeight(var31, var26) >= 0.15F)
1436 {
1437 if (var18 != 0)
1438 {
1439 if (var18 >= 0)
1440 {
1441 var8.draw();
1442 }
1443
1444 var18 = 0;
1445 GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/environment/rain.png"));
1446 var8.startDrawingQuads();
1447 }
1448
1449 var32 = ((float)(this.rendererUpdateCount + var21 * var21 * 3121 + var21 * 45238971 + var20 * var20 * 418711 + var20 * 13761 & 31) + par1) / 32.0F * (3.0F + this.random.nextFloat());
1450 double var33 = (double)((float)var21 + 0.5F) - var41.posX;
1451 var35 = (double)((float)var20 + 0.5F) - var41.posZ;
1452 float var37 = MathHelper.sqrt_double(var33 * var33 + var35 * var35) / (float)var16;
1453 float var38 = 1.0F;
1454 var8.setBrightness(var42.getLightBrightnessForSkyBlocks(var21, var30, var20, 0));
1455 var8.setColorRGBA_F(var38, var38, var38, ((1.0F - var37 * var37) * 0.5F + 0.5F) * var2);
1456 var8.setTranslation(-var9 * 1.0D, -var11 * 1.0D, -var13 * 1.0D);
1457 var8.addVertexWithUV((double)((float)var21 - var23) + 0.5D, (double)var27, (double)((float)var20 - var24) + 0.5D, (double)(0.0F * var29), (double)((float)var27 * var29 / 4.0F + var32 * var29));
1458 var8.addVertexWithUV((double)((float)var21 + var23) + 0.5D, (double)var27, (double)((float)var20 + var24) + 0.5D, (double)(1.0F * var29), (double)((float)var27 * var29 / 4.0F + var32 * var29));
1459 var8.addVertexWithUV((double)((float)var21 + var23) + 0.5D, (double)var28, (double)((float)var20 + var24) + 0.5D, (double)(1.0F * var29), (double)((float)var28 * var29 / 4.0F + var32 * var29));
1460 var8.addVertexWithUV((double)((float)var21 - var23) + 0.5D, (double)var28, (double)((float)var20 - var24) + 0.5D, (double)(0.0F * var29), (double)((float)var28 * var29 / 4.0F + var32 * var29));
1461 var8.setTranslation(0.0D, 0.0D, 0.0D);
1462 }
1463 else
1464 {
1465 if (var18 != 1)
1466 {
1467 if (var18 >= 0)
1468 {
1469 var8.draw();
1470 }
1471
1472 var18 = 1;
1473 GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/environment/snow.png"));
1474 var8.startDrawingQuads();
1475 }
1476
1477 var32 = ((float)(this.rendererUpdateCount & 511) + par1) / 512.0F;
1478 float var46 = this.random.nextFloat() + var19 * 0.01F * (float)this.random.nextGaussian();
1479 float var34 = this.random.nextFloat() + var19 * (float)this.random.nextGaussian() * 0.001F;
1480 var35 = (double)((float)var21 + 0.5F) - var41.posX;
1481 double var47 = (double)((float)var20 + 0.5F) - var41.posZ;
1482 float var39 = MathHelper.sqrt_double(var35 * var35 + var47 * var47) / (float)var16;
1483 float var40 = 1.0F;
1484 var8.setBrightness((var42.getLightBrightnessForSkyBlocks(var21, var30, var20, 0) * 3 + 15728880) / 4);
1485 var8.setColorRGBA_F(var40, var40, var40, ((1.0F - var39 * var39) * 0.3F + 0.5F) * var2);
1486 var8.setTranslation(-var9 * 1.0D, -var11 * 1.0D, -var13 * 1.0D);
1487 var8.addVertexWithUV((double)((float)var21 - var23) + 0.5D, (double)var27, (double)((float)var20 - var24) + 0.5D, (double)(0.0F * var29 + var46), (double)((float)var27 * var29 / 4.0F + var32 * var29 + var34));
1488 var8.addVertexWithUV((double)((float)var21 + var23) + 0.5D, (double)var27, (double)((float)var20 + var24) + 0.5D, (double)(1.0F * var29 + var46), (double)((float)var27 * var29 / 4.0F + var32 * var29 + var34));
1489 var8.addVertexWithUV((double)((float)var21 + var23) + 0.5D, (double)var28, (double)((float)var20 + var24) + 0.5D, (double)(1.0F * var29 + var46), (double)((float)var28 * var29 / 4.0F + var32 * var29 + var34));
1490 var8.addVertexWithUV((double)((float)var21 - var23) + 0.5D, (double)var28, (double)((float)var20 - var24) + 0.5D, (double)(0.0F * var29 + var46), (double)((float)var28 * var29 / 4.0F + var32 * var29 + var34));
1491 var8.setTranslation(0.0D, 0.0D, 0.0D);
1492 }
1493 }
1494 }
1495 }
1496 }
1497
1498 if (var18 >= 0)
1499 {
1500 var8.draw();
1501 }
1502
1503 GL11.glEnable(GL11.GL_CULL_FACE);
1504 GL11.glDisable(GL11.GL_BLEND);
1505 GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F);
1506 this.disableLightmap((double)par1);
1507 }
1508 }
1509
1510 /**
1511 * Setup orthogonal projection for rendering GUI screen overlays
1512 */
1513 public void setupOverlayRendering()
1514 {
1515 ScaledResolution var1 = new ScaledResolution(this.mc.gameSettings, this.mc.displayWidth, this.mc.displayHeight);
1516 GL11.glClear(256);
1517 GL11.glMatrixMode(GL11.GL_PROJECTION);
1518 GL11.glLoadIdentity();
1519 GL11.glOrtho(0.0D, var1.getScaledWidth_double(), var1.getScaledHeight_double(), 0.0D, 1000.0D, 3000.0D);
1520 GL11.glMatrixMode(GL11.GL_MODELVIEW);
1521 GL11.glLoadIdentity();
1522 GL11.glTranslatef(0.0F, 0.0F, -2000.0F);
1523 }
1524
1525 /**
1526 * calculates fog and calls glClearColor
1527 */
1528 private void updateFogColor(float par1)
1529 {
1530 WorldClient var2 = this.mc.theWorld;
1531 EntityLiving var3 = this.mc.renderViewEntity;
1532 float var4 = 1.0F / (float)(4 - this.mc.gameSettings.renderDistance);
1533 var4 = 1.0F - (float)Math.pow((double)var4, 0.25D);
1534 Vec3 var5 = var2.getSkyColor(this.mc.renderViewEntity, par1);
1535 float var6 = (float)var5.xCoord;
1536 float var7 = (float)var5.yCoord;
1537 float var8 = (float)var5.zCoord;
1538 Vec3 var9 = var2.getFogColor(par1);
1539 this.fogColorRed = (float)var9.xCoord;
1540 this.fogColorGreen = (float)var9.yCoord;
1541 this.fogColorBlue = (float)var9.zCoord;
1542 float var11;
1543
1544 if (this.mc.gameSettings.renderDistance < 2)
1545 {
1546 Vec3 var10 = MathHelper.sin(var2.getCelestialAngleRadians(par1)) > 0.0F ? var2.getWorldVec3Pool().getVecFromPool(-1.0D, 0.0D, 0.0D) : var2.getWorldVec3Pool().getVecFromPool(1.0D, 0.0D, 0.0D);
1547 var11 = (float)var3.getLook(par1).dotProduct(var10);
1548
1549 if (var11 < 0.0F)
1550 {
1551 var11 = 0.0F;
1552 }
1553
1554 if (var11 > 0.0F)
1555 {
1556 float[] var12 = var2.provider.calcSunriseSunsetColors(var2.getCelestialAngle(par1), par1);
1557
1558 if (var12 != null)
1559 {
1560 var11 *= var12[3];
1561 this.fogColorRed = this.fogColorRed * (1.0F - var11) + var12[0] * var11;
1562 this.fogColorGreen = this.fogColorGreen * (1.0F - var11) + var12[1] * var11;
1563 this.fogColorBlue = this.fogColorBlue * (1.0F - var11) + var12[2] * var11;
1564 }
1565 }
1566 }
1567
1568 this.fogColorRed += (var6 - this.fogColorRed) * var4;
1569 this.fogColorGreen += (var7 - this.fogColorGreen) * var4;
1570 this.fogColorBlue += (var8 - this.fogColorBlue) * var4;
1571 float var19 = var2.getRainStrength(par1);
1572 float var20;
1573
1574 if (var19 > 0.0F)
1575 {
1576 var11 = 1.0F - var19 * 0.5F;
1577 var20 = 1.0F - var19 * 0.4F;
1578 this.fogColorRed *= var11;
1579 this.fogColorGreen *= var11;
1580 this.fogColorBlue *= var20;
1581 }
1582
1583 var11 = var2.getWeightedThunderStrength(par1);
1584
1585 if (var11 > 0.0F)
1586 {
1587 var20 = 1.0F - var11 * 0.5F;
1588 this.fogColorRed *= var20;
1589 this.fogColorGreen *= var20;
1590 this.fogColorBlue *= var20;
1591 }
1592
1593 int var21 = ActiveRenderInfo.getBlockIdAtEntityViewpoint(this.mc.theWorld, var3, par1);
1594
1595 if (this.cloudFog)
1596 {
1597 Vec3 var13 = var2.drawClouds(par1);
1598 this.fogColorRed = (float)var13.xCoord;
1599 this.fogColorGreen = (float)var13.yCoord;
1600 this.fogColorBlue = (float)var13.zCoord;
1601 }
1602 else if (var21 != 0 && Block.blocksList[var21].blockMaterial == Material.water)
1603 {
1604 this.fogColorRed = 0.02F;
1605 this.fogColorGreen = 0.02F;
1606 this.fogColorBlue = 0.2F;
1607 }
1608 else if (var21 != 0 && Block.blocksList[var21].blockMaterial == Material.lava)
1609 {
1610 this.fogColorRed = 0.6F;
1611 this.fogColorGreen = 0.1F;
1612 this.fogColorBlue = 0.0F;
1613 }
1614
1615 float var22 = this.fogColor2 + (this.fogColor1 - this.fogColor2) * par1;
1616 this.fogColorRed *= var22;
1617 this.fogColorGreen *= var22;
1618 this.fogColorBlue *= var22;
1619 double var14 = (var3.lastTickPosY + (var3.posY - var3.lastTickPosY) * (double)par1) * var2.provider.getVoidFogYFactor();
1620
1621 if (var3.isPotionActive(Potion.blindness))
1622 {
1623 int var16 = var3.getActivePotionEffect(Potion.blindness).getDuration();
1624
1625 if (var16 < 20)
1626 {
1627 var14 *= (double)(1.0F - (float)var16 / 20.0F);
1628 }
1629 else
1630 {
1631 var14 = 0.0D;
1632 }
1633 }
1634
1635 if (var14 < 1.0D)
1636 {
1637 if (var14 < 0.0D)
1638 {
1639 var14 = 0.0D;
1640 }
1641
1642 var14 *= var14;
1643 this.fogColorRed = (float)((double)this.fogColorRed * var14);
1644 this.fogColorGreen = (float)((double)this.fogColorGreen * var14);
1645 this.fogColorBlue = (float)((double)this.fogColorBlue * var14);
1646 }
1647
1648 float var23;
1649
1650 if (this.field_82831_U > 0.0F)
1651 {
1652 var23 = this.field_82832_V + (this.field_82831_U - this.field_82832_V) * par1;
1653 this.fogColorRed = this.fogColorRed * (1.0F - var23) + this.fogColorRed * 0.7F * var23;
1654 this.fogColorGreen = this.fogColorGreen * (1.0F - var23) + this.fogColorGreen * 0.6F * var23;
1655 this.fogColorBlue = this.fogColorBlue * (1.0F - var23) + this.fogColorBlue * 0.6F * var23;
1656 }
1657
1658 float var17;
1659
1660 if (var3.isPotionActive(Potion.nightVision))
1661 {
1662 var23 = this.func_82830_a(this.mc.thePlayer, par1);
1663 var17 = 1.0F / this.fogColorRed;
1664
1665 if (var17 > 1.0F / this.fogColorGreen)
1666 {
1667 var17 = 1.0F / this.fogColorGreen;
1668 }
1669
1670 if (var17 > 1.0F / this.fogColorBlue)
1671 {
1672 var17 = 1.0F / this.fogColorBlue;
1673 }
1674
1675 this.fogColorRed = this.fogColorRed * (1.0F - var23) + this.fogColorRed * var17 * var23;
1676 this.fogColorGreen = this.fogColorGreen * (1.0F - var23) + this.fogColorGreen * var17 * var23;
1677 this.fogColorBlue = this.fogColorBlue * (1.0F - var23) + this.fogColorBlue * var17 * var23;
1678 }
1679
1680 if (this.mc.gameSettings.anaglyph)
1681 {
1682 var23 = (this.fogColorRed * 30.0F + this.fogColorGreen * 59.0F + this.fogColorBlue * 11.0F) / 100.0F;
1683 var17 = (this.fogColorRed * 30.0F + this.fogColorGreen * 70.0F) / 100.0F;
1684 float var18 = (this.fogColorRed * 30.0F + this.fogColorBlue * 70.0F) / 100.0F;
1685 this.fogColorRed = var23;
1686 this.fogColorGreen = var17;
1687 this.fogColorBlue = var18;
1688 }
1689
1690 GL11.glClearColor(this.fogColorRed, this.fogColorGreen, this.fogColorBlue, 0.0F);
1691 }
1692
1693 /**
1694 * Sets up the fog to be rendered. If the arg passed in is -1 the fog starts at 0 and goes to 80% of far plane
1695 * distance and is used for sky rendering.
1696 */
1697 private void setupFog(int par1, float par2)
1698 {
1699 EntityLiving var3 = this.mc.renderViewEntity;
1700 boolean var4 = false;
1701
1702 if (var3 instanceof EntityPlayer)
1703 {
1704 var4 = ((EntityPlayer)var3).capabilities.isCreativeMode;
1705 }
1706
1707 if (par1 == 999)
1708 {
1709 GL11.glFog(GL11.GL_FOG_COLOR, this.setFogColorBuffer(0.0F, 0.0F, 0.0F, 1.0F));
1710 GL11.glFogi(GL11.GL_FOG_MODE, GL11.GL_LINEAR);
1711 GL11.glFogf(GL11.GL_FOG_START, 0.0F);
1712 GL11.glFogf(GL11.GL_FOG_END, 8.0F);
1713
1714 if (GLContext.getCapabilities().GL_NV_fog_distance)
1715 {
1716 GL11.glFogi(34138, 34139);
1717 }
1718
1719 GL11.glFogf(GL11.GL_FOG_START, 0.0F);
1720 }
1721 else
1722 {
1723 GL11.glFog(GL11.GL_FOG_COLOR, this.setFogColorBuffer(this.fogColorRed, this.fogColorGreen, this.fogColorBlue, 1.0F));
1724 GL11.glNormal3f(0.0F, -1.0F, 0.0F);
1725 GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
1726 int var5 = ActiveRenderInfo.getBlockIdAtEntityViewpoint(this.mc.theWorld, var3, par2);
1727 float var6;
1728
1729 if (var3.isPotionActive(Potion.blindness))
1730 {
1731 var6 = 5.0F;
1732 int var7 = var3.getActivePotionEffect(Potion.blindness).getDuration();
1733
1734 if (var7 < 20)
1735 {
1736 var6 = 5.0F + (this.farPlaneDistance - 5.0F) * (1.0F - (float)var7 / 20.0F);
1737 }
1738
1739 GL11.glFogi(GL11.GL_FOG_MODE, GL11.GL_LINEAR);
1740
1741 if (par1 < 0)
1742 {
1743 GL11.glFogf(GL11.GL_FOG_START, 0.0F);
1744 GL11.glFogf(GL11.GL_FOG_END, var6 * 0.8F);
1745 }
1746 else
1747 {
1748 GL11.glFogf(GL11.GL_FOG_START, var6 * 0.25F);
1749 GL11.glFogf(GL11.GL_FOG_END, var6);
1750 }
1751
1752 if (GLContext.getCapabilities().GL_NV_fog_distance)
1753 {
1754 GL11.glFogi(34138, 34139);
1755 }
1756 }
1757 else
1758 {
1759 float var8;
1760 float var9;
1761 float var10;
1762 float var11;
1763 float var12;
1764
1765 if (this.cloudFog)
1766 {
1767 GL11.glFogi(GL11.GL_FOG_MODE, GL11.GL_EXP);
1768 GL11.glFogf(GL11.GL_FOG_DENSITY, 0.1F);
1769 var6 = 1.0F;
1770 var12 = 1.0F;
1771 var8 = 1.0F;
1772
1773 if (this.mc.gameSettings.anaglyph)
1774 {
1775 var9 = (var6 * 30.0F + var12 * 59.0F + var8 * 11.0F) / 100.0F;
1776 var10 = (var6 * 30.0F + var12 * 70.0F) / 100.0F;
1777 var11 = (var6 * 30.0F + var8 * 70.0F) / 100.0F;
1778 }
1779 }
1780 else if (var5 > 0 && Block.blocksList[var5].blockMaterial == Material.water)
1781 {
1782 GL11.glFogi(GL11.GL_FOG_MODE, GL11.GL_EXP);
1783
1784 if (var3.isPotionActive(Potion.waterBreathing))
1785 {
1786 GL11.glFogf(GL11.GL_FOG_DENSITY, 0.05F);
1787 }
1788 else
1789 {
1790 GL11.glFogf(GL11.GL_FOG_DENSITY, 0.1F);
1791 }
1792
1793 var6 = 0.4F;
1794 var12 = 0.4F;
1795 var8 = 0.9F;
1796
1797 if (this.mc.gameSettings.anaglyph)
1798 {
1799 var9 = (var6 * 30.0F + var12 * 59.0F + var8 * 11.0F) / 100.0F;
1800 var10 = (var6 * 30.0F + var12 * 70.0F) / 100.0F;
1801 var11 = (var6 * 30.0F + var8 * 70.0F) / 100.0F;
1802 }
1803 }
1804 else if (var5 > 0 && Block.blocksList[var5].blockMaterial == Material.lava)
1805 {
1806 GL11.glFogi(GL11.GL_FOG_MODE, GL11.GL_EXP);
1807 GL11.glFogf(GL11.GL_FOG_DENSITY, 2.0F);
1808 var6 = 0.4F;
1809 var12 = 0.3F;
1810 var8 = 0.3F;
1811
1812 if (this.mc.gameSettings.anaglyph)
1813 {
1814 var9 = (var6 * 30.0F + var12 * 59.0F + var8 * 11.0F) / 100.0F;
1815 var10 = (var6 * 30.0F + var12 * 70.0F) / 100.0F;
1816 var11 = (var6 * 30.0F + var8 * 70.0F) / 100.0F;
1817 }
1818 }
1819 else
1820 {
1821 var6 = this.farPlaneDistance;
1822
1823 if (this.mc.theWorld.provider.getWorldHasVoidParticles() && !var4)
1824 {
1825 double var13 = (double)((var3.getBrightnessForRender(par2) & 15728640) >> 20) / 16.0D + (var3.lastTickPosY + (var3.posY - var3.lastTickPosY) * (double)par2 + 4.0D) / 32.0D;
1826
1827 if (var13 < 1.0D)
1828 {
1829 if (var13 < 0.0D)
1830 {
1831 var13 = 0.0D;
1832 }
1833
1834 var13 *= var13;
1835 var9 = 100.0F * (float)var13;
1836
1837 if (var9 < 5.0F)
1838 {
1839 var9 = 5.0F;
1840 }
1841
1842 if (var6 > var9)
1843 {
1844 var6 = var9;
1845 }
1846 }
1847 }
1848
1849 GL11.glFogi(GL11.GL_FOG_MODE, GL11.GL_LINEAR);
1850
1851 if (par1 < 0)
1852 {
1853 GL11.glFogf(GL11.GL_FOG_START, 0.0F);
1854 GL11.glFogf(GL11.GL_FOG_END, var6 * 0.8F);
1855 }
1856 else
1857 {
1858 GL11.glFogf(GL11.GL_FOG_START, var6 * 0.25F);
1859 GL11.glFogf(GL11.GL_FOG_END, var6);
1860 }
1861
1862 if (GLContext.getCapabilities().GL_NV_fog_distance)
1863 {
1864 GL11.glFogi(34138, 34139);
1865 }
1866
1867 if (this.mc.theWorld.provider.doesXZShowFog((int)var3.posX, (int)var3.posZ))
1868 {
1869 GL11.glFogf(GL11.GL_FOG_START, var6 * 0.05F);
1870 GL11.glFogf(GL11.GL_FOG_END, Math.min(var6, 192.0F) * 0.5F);
1871 }
1872 }
1873 }
1874
1875 GL11.glEnable(GL11.GL_COLOR_MATERIAL);
1876 GL11.glColorMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT);
1877 }
1878 }
1879
1880 /**
1881 * Update and return fogColorBuffer with the RGBA values passed as arguments
1882 */
1883 private FloatBuffer setFogColorBuffer(float par1, float par2, float par3, float par4)
1884 {
1885 this.fogColorBuffer.clear();
1886 this.fogColorBuffer.put(par1).put(par2).put(par3).put(par4);
1887 this.fogColorBuffer.flip();
1888 return this.fogColorBuffer;
1889 }
1890
1891 public static int func_78465_a(int par0)
1892 {
1893 short var1 = 200;
1894
1895 if (par0 == 1)
1896 {
1897 var1 = 120;
1898 }
1899
1900 if (par0 == 2)
1901 {
1902 var1 = 35;
1903 }
1904
1905 return var1;
1906 }
1907
1908 static Minecraft func_90030_a(EntityRenderer par0EntityRenderer)
1909 {
1910 return par0EntityRenderer.mc;
1911 }
1912 }