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