001 package net.minecraft.src; 002 003 import cpw.mods.fml.common.Side; 004 import cpw.mods.fml.common.asm.SideOnly; 005 import java.util.Random; 006 import net.minecraft.client.Minecraft; 007 import net.minecraftforge.client.ForgeHooksClient; 008 009 import org.lwjgl.opengl.GL11; 010 import org.lwjgl.opengl.GL12; 011 012 @SideOnly(Side.CLIENT) 013 public class RenderItem extends Render 014 { 015 private RenderBlocks renderBlocks = new RenderBlocks(); 016 017 /** The RNG used in RenderItem (for bobbing itemstacks on the ground) */ 018 private Random random = new Random(); 019 public boolean field_77024_a = true; 020 021 /** Defines the zLevel of rendering of item on GUI. */ 022 public float zLevel = 0.0F; 023 024 public RenderItem() 025 { 026 this.shadowSize = 0.15F; 027 this.shadowOpaque = 0.75F; 028 } 029 030 /** 031 * Renders the item 032 */ 033 public void doRenderItem(EntityItem par1EntityItem, double par2, double par4, double par6, float par8, float par9) 034 { 035 this.random.setSeed(187L); 036 ItemStack var10 = par1EntityItem.item; 037 GL11.glPushMatrix(); 038 float var11 = MathHelper.sin(((float)par1EntityItem.age + par9) / 10.0F + par1EntityItem.hoverStart) * 0.1F + 0.1F; 039 float var12 = (((float)par1EntityItem.age + par9) / 20.0F + par1EntityItem.hoverStart) * (180F / (float)Math.PI); 040 byte var13 = 1; 041 042 if (par1EntityItem.item.stackSize > 1) 043 { 044 var13 = 2; 045 } 046 047 if (par1EntityItem.item.stackSize > 5) 048 { 049 var13 = 3; 050 } 051 052 if (par1EntityItem.item.stackSize > 20) 053 { 054 var13 = 4; 055 } 056 057 GL11.glTranslatef((float)par2, (float)par4 + var11, (float)par6); 058 GL11.glEnable(GL12.GL_RESCALE_NORMAL); 059 int var16; 060 float var19; 061 float var20; 062 float var24; 063 064 if (ForgeHooksClient.renderEntityItem(par1EntityItem, var10, var11, var12, random, renderManager.renderEngine, renderBlocks)) 065 { 066 ; 067 } 068 else if (var10.getItem() instanceof ItemBlock && RenderBlocks.renderItemIn3d(Block.blocksList[var10.itemID].getRenderType())) 069 { 070 GL11.glRotatef(var12, 0.0F, 1.0F, 0.0F); 071 this.loadTexture(Block.blocksList[var10.itemID].getTextureFile()); 072 float var22 = 0.25F; 073 var16 = Block.blocksList[var10.itemID].getRenderType(); 074 075 if (var16 == 1 || var16 == 19 || var16 == 12 || var16 == 2) 076 { 077 var22 = 0.5F; 078 } 079 080 GL11.glScalef(var22, var22, var22); 081 082 for (int var23 = 0; var23 < var13; ++var23) 083 { 084 GL11.glPushMatrix(); 085 086 if (var23 > 0) 087 { 088 var24 = (this.random.nextFloat() * 2.0F - 1.0F) * 0.2F / var22; 089 var19 = (this.random.nextFloat() * 2.0F - 1.0F) * 0.2F / var22; 090 var20 = (this.random.nextFloat() * 2.0F - 1.0F) * 0.2F / var22; 091 GL11.glTranslatef(var24, var19, var20); 092 } 093 094 var24 = 1.0F; 095 this.renderBlocks.renderBlockAsItem(Block.blocksList[var10.itemID], var10.getItemDamage(), var24); 096 GL11.glPopMatrix(); 097 } 098 } 099 else 100 { 101 int var15; 102 float var17; 103 104 if (var10.getItem().requiresMultipleRenderPasses()) 105 { 106 GL11.glScalef(0.5F, 0.5F, 0.5F); 107 this.loadTexture(Item.itemsList[var10.itemID].getTextureFile()); 108 109 for (var15 = 0; var15 <= var10.getItem().getRenderPasses(var10.getItemDamage()); ++var15) 110 { 111 this.random.setSeed(187L); //Fixes Vanilla bug where layers would not render aligns properly. 112 var16 = var10.getItem().getIconFromDamageForRenderPass(var10.getItemDamage(), var15); 113 var17 = 1.0F; 114 115 if (this.field_77024_a) 116 { 117 int var18 = Item.itemsList[var10.itemID].getColorFromDamage(var10.getItemDamage(), var15); 118 var19 = (float)(var18 >> 16 & 255) / 255.0F; 119 var20 = (float)(var18 >> 8 & 255) / 255.0F; 120 float var21 = (float)(var18 & 255) / 255.0F; 121 GL11.glColor4f(var19 * var17, var20 * var17, var21 * var17, 1.0F); 122 } 123 124 this.func_77020_a(var16, var13); 125 } 126 } 127 else 128 { 129 GL11.glScalef(0.5F, 0.5F, 0.5F); 130 var15 = var10.getIconIndex(); 131 132 this.loadTexture(var10.getItem().getTextureFile()); 133 134 if (this.field_77024_a) 135 { 136 var16 = Item.itemsList[var10.itemID].getColorFromDamage(var10.getItemDamage(), 0); 137 var17 = (float)(var16 >> 16 & 255) / 255.0F; 138 var24 = (float)(var16 >> 8 & 255) / 255.0F; 139 var19 = (float)(var16 & 255) / 255.0F; 140 var20 = 1.0F; 141 GL11.glColor4f(var17 * var20, var24 * var20, var19 * var20, 1.0F); 142 } 143 144 this.func_77020_a(var15, var13); 145 } 146 } 147 148 GL11.glDisable(GL12.GL_RESCALE_NORMAL); 149 GL11.glPopMatrix(); 150 } 151 152 private void func_77020_a(int par1, int par2) 153 { 154 Tessellator var3 = Tessellator.instance; 155 float var4 = (float)(par1 % 16 * 16 + 0) / 256.0F; 156 float var5 = (float)(par1 % 16 * 16 + 16) / 256.0F; 157 float var6 = (float)(par1 / 16 * 16 + 0) / 256.0F; 158 float var7 = (float)(par1 / 16 * 16 + 16) / 256.0F; 159 float var8 = 1.0F; 160 float var9 = 0.5F; 161 float var10 = 0.25F; 162 163 for (int var11 = 0; var11 < par2; ++var11) 164 { 165 GL11.glPushMatrix(); 166 167 if (var11 > 0) 168 { 169 float var12 = (this.random.nextFloat() * 2.0F - 1.0F) * 0.3F; 170 float var13 = (this.random.nextFloat() * 2.0F - 1.0F) * 0.3F; 171 float var14 = (this.random.nextFloat() * 2.0F - 1.0F) * 0.3F; 172 GL11.glTranslatef(var12, var13, var14); 173 } 174 175 GL11.glRotatef(180.0F - this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F); 176 var3.startDrawingQuads(); 177 var3.setNormal(0.0F, 1.0F, 0.0F); 178 var3.addVertexWithUV((double)(0.0F - var9), (double)(0.0F - var10), 0.0D, (double)var4, (double)var7); 179 var3.addVertexWithUV((double)(var8 - var9), (double)(0.0F - var10), 0.0D, (double)var5, (double)var7); 180 var3.addVertexWithUV((double)(var8 - var9), (double)(1.0F - var10), 0.0D, (double)var5, (double)var6); 181 var3.addVertexWithUV((double)(0.0F - var9), (double)(1.0F - var10), 0.0D, (double)var4, (double)var6); 182 var3.draw(); 183 GL11.glPopMatrix(); 184 } 185 } 186 187 public void drawItemIntoGui(FontRenderer par1FontRenderer, RenderEngine par2RenderEngine, int par3, int par4, int par5, int par6, int par7) 188 { 189 float var16; 190 int var9; 191 float var11; 192 float var12; 193 194 if (Item.itemsList[par3] instanceof ItemBlock && RenderBlocks.renderItemIn3d(Block.blocksList[par3].getRenderType())) 195 { 196 par2RenderEngine.bindTexture(par2RenderEngine.getTexture(Block.blocksList[par3].getTextureFile())); 197 Block var15 = Block.blocksList[par3]; 198 GL11.glPushMatrix(); 199 GL11.glTranslatef((float)(par6 - 2), (float)(par7 + 3), -3.0F + this.zLevel); 200 GL11.glScalef(10.0F, 10.0F, 10.0F); 201 GL11.glTranslatef(1.0F, 0.5F, 1.0F); 202 GL11.glScalef(1.0F, 1.0F, -1.0F); 203 GL11.glRotatef(210.0F, 1.0F, 0.0F, 0.0F); 204 GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); 205 var9 = Item.itemsList[par3].getColorFromDamage(par4, 0); 206 var16 = (float)(var9 >> 16 & 255) / 255.0F; 207 var11 = (float)(var9 >> 8 & 255) / 255.0F; 208 var12 = (float)(var9 & 255) / 255.0F; 209 210 if (this.field_77024_a) 211 { 212 GL11.glColor4f(var16, var11, var12, 1.0F); 213 } 214 215 GL11.glRotatef(-90.0F, 0.0F, 1.0F, 0.0F); 216 this.renderBlocks.useInventoryTint = this.field_77024_a; 217 this.renderBlocks.renderBlockAsItem(var15, par4, 1.0F); 218 this.renderBlocks.useInventoryTint = true; 219 GL11.glPopMatrix(); 220 } 221 else 222 { 223 int var8; 224 225 if (Item.itemsList[par3].requiresMultipleRenderPasses()) 226 { 227 GL11.glDisable(GL11.GL_LIGHTING); 228 par2RenderEngine.bindTexture(par2RenderEngine.getTexture(Item.itemsList[par3].getTextureFile())); 229 230 for (var8 = 0; var8 <= Item.itemsList[par3].getRenderPasses(par4); ++var8) 231 { 232 var9 = Item.itemsList[par3].getIconFromDamageForRenderPass(par4, var8); 233 int var10 = Item.itemsList[par3].getColorFromDamage(par4, var8); 234 var11 = (float)(var10 >> 16 & 255) / 255.0F; 235 var12 = (float)(var10 >> 8 & 255) / 255.0F; 236 float var13 = (float)(var10 & 255) / 255.0F; 237 238 if (this.field_77024_a) 239 { 240 GL11.glColor4f(var11, var12, var13, 1.0F); 241 } 242 243 this.renderTexturedQuad(par6, par7, var9 % 16 * 16, var9 / 16 * 16, 16, 16); 244 } 245 246 GL11.glEnable(GL11.GL_LIGHTING); 247 } 248 else if (par5 >= 0) 249 { 250 GL11.glDisable(GL11.GL_LIGHTING); 251 252 par2RenderEngine.bindTexture(par2RenderEngine.getTexture(Item.itemsList[par3].getTextureFile())); 253 254 var8 = Item.itemsList[par3].getColorFromDamage(par4, 0); 255 float var14 = (float)(var8 >> 16 & 255) / 255.0F; 256 var16 = (float)(var8 >> 8 & 255) / 255.0F; 257 var11 = (float)(var8 & 255) / 255.0F; 258 259 if (this.field_77024_a) 260 { 261 GL11.glColor4f(var14, var16, var11, 1.0F); 262 } 263 264 this.renderTexturedQuad(par6, par7, par5 % 16 * 16, par5 / 16 * 16, 16, 16); 265 GL11.glEnable(GL11.GL_LIGHTING); 266 } 267 } 268 269 GL11.glEnable(GL11.GL_CULL_FACE); 270 } 271 272 /** 273 * Renders the item's icon or block into the UI at the specified position. 274 */ 275 public void renderItemIntoGUI(FontRenderer par1FontRenderer, RenderEngine par2RenderEngine, ItemStack par3ItemStack, int par4, int par5) 276 { 277 if (par3ItemStack != null) 278 { 279 if (!ForgeHooksClient.renderInventoryItem(renderBlocks, par2RenderEngine, par3ItemStack, field_77024_a, zLevel, (float)par4, (float)par5)) 280 { 281 this.drawItemIntoGui(par1FontRenderer, par2RenderEngine, par3ItemStack.itemID, par3ItemStack.getItemDamage(), par3ItemStack.getIconIndex(), par4, par5); 282 } 283 284 if (par3ItemStack != null && par3ItemStack.hasEffect()) 285 { 286 GL11.glDepthFunc(GL11.GL_GREATER); 287 GL11.glDisable(GL11.GL_LIGHTING); 288 GL11.glDepthMask(false); 289 par2RenderEngine.bindTexture(par2RenderEngine.getTexture("%blur%/misc/glint.png")); 290 this.zLevel -= 50.0F; 291 GL11.glEnable(GL11.GL_BLEND); 292 GL11.glBlendFunc(GL11.GL_DST_COLOR, GL11.GL_DST_COLOR); 293 GL11.glColor4f(0.5F, 0.25F, 0.8F, 1.0F); 294 this.func_77018_a(par4 * 431278612 + par5 * 32178161, par4 - 2, par5 - 2, 20, 20); 295 GL11.glDisable(GL11.GL_BLEND); 296 GL11.glDepthMask(true); 297 this.zLevel += 50.0F; 298 GL11.glEnable(GL11.GL_LIGHTING); 299 GL11.glDepthFunc(GL11.GL_LEQUAL); 300 } 301 } 302 } 303 304 private void func_77018_a(int par1, int par2, int par3, int par4, int par5) 305 { 306 for (int var6 = 0; var6 < 2; ++var6) 307 { 308 if (var6 == 0) 309 { 310 GL11.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE); 311 } 312 313 if (var6 == 1) 314 { 315 GL11.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE); 316 } 317 318 float var7 = 0.00390625F; 319 float var8 = 0.00390625F; 320 float var9 = (float)(Minecraft.getSystemTime() % (long)(3000 + var6 * 1873)) / (3000.0F + (float)(var6 * 1873)) * 256.0F; 321 float var10 = 0.0F; 322 Tessellator var11 = Tessellator.instance; 323 float var12 = 4.0F; 324 325 if (var6 == 1) 326 { 327 var12 = -1.0F; 328 } 329 330 var11.startDrawingQuads(); 331 var11.addVertexWithUV((double)(par2 + 0), (double)(par3 + par5), (double)this.zLevel, (double)((var9 + (float)par5 * var12) * var7), (double)((var10 + (float)par5) * var8)); 332 var11.addVertexWithUV((double)(par2 + par4), (double)(par3 + par5), (double)this.zLevel, (double)((var9 + (float)par4 + (float)par5 * var12) * var7), (double)((var10 + (float)par5) * var8)); 333 var11.addVertexWithUV((double)(par2 + par4), (double)(par3 + 0), (double)this.zLevel, (double)((var9 + (float)par4) * var7), (double)((var10 + 0.0F) * var8)); 334 var11.addVertexWithUV((double)(par2 + 0), (double)(par3 + 0), (double)this.zLevel, (double)((var9 + 0.0F) * var7), (double)((var10 + 0.0F) * var8)); 335 var11.draw(); 336 } 337 } 338 339 /** 340 * Renders the item's overlay information. Examples being stack count or damage on top of the item's image at the 341 * specified position. 342 */ 343 public void renderItemOverlayIntoGUI(FontRenderer par1FontRenderer, RenderEngine par2RenderEngine, ItemStack par3ItemStack, int par4, int par5) 344 { 345 if (par3ItemStack != null) 346 { 347 if (par3ItemStack.stackSize > 1) 348 { 349 String var6 = "" + par3ItemStack.stackSize; 350 GL11.glDisable(GL11.GL_LIGHTING); 351 GL11.glDisable(GL11.GL_DEPTH_TEST); 352 par1FontRenderer.drawStringWithShadow(var6, par4 + 19 - 2 - par1FontRenderer.getStringWidth(var6), par5 + 6 + 3, 16777215); 353 GL11.glEnable(GL11.GL_LIGHTING); 354 GL11.glEnable(GL11.GL_DEPTH_TEST); 355 } 356 357 if (par3ItemStack.isItemDamaged()) 358 { 359 int var11 = (int)Math.round(13.0D - (double)par3ItemStack.getItemDamageForDisplay() * 13.0D / (double)par3ItemStack.getMaxDamage()); 360 int var7 = (int)Math.round(255.0D - (double)par3ItemStack.getItemDamageForDisplay() * 255.0D / (double)par3ItemStack.getMaxDamage()); 361 GL11.glDisable(GL11.GL_LIGHTING); 362 GL11.glDisable(GL11.GL_DEPTH_TEST); 363 GL11.glDisable(GL11.GL_TEXTURE_2D); 364 Tessellator var8 = Tessellator.instance; 365 int var9 = 255 - var7 << 16 | var7 << 8; 366 int var10 = (255 - var7) / 4 << 16 | 16128; 367 this.renderQuad(var8, par4 + 2, par5 + 13, 13, 2, 0); 368 this.renderQuad(var8, par4 + 2, par5 + 13, 12, 1, var10); 369 this.renderQuad(var8, par4 + 2, par5 + 13, var11, 1, var9); 370 GL11.glEnable(GL11.GL_TEXTURE_2D); 371 GL11.glEnable(GL11.GL_LIGHTING); 372 GL11.glEnable(GL11.GL_DEPTH_TEST); 373 GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); 374 } 375 } 376 } 377 378 /** 379 * Adds a quad to the tesselator at the specified position with the set width and height and color. Args: 380 * tessellator, x, y, width, height, color 381 */ 382 private void renderQuad(Tessellator par1Tessellator, int par2, int par3, int par4, int par5, int par6) 383 { 384 par1Tessellator.startDrawingQuads(); 385 par1Tessellator.setColorOpaque_I(par6); 386 par1Tessellator.addVertex((double)(par2 + 0), (double)(par3 + 0), 0.0D); 387 par1Tessellator.addVertex((double)(par2 + 0), (double)(par3 + par5), 0.0D); 388 par1Tessellator.addVertex((double)(par2 + par4), (double)(par3 + par5), 0.0D); 389 par1Tessellator.addVertex((double)(par2 + par4), (double)(par3 + 0), 0.0D); 390 par1Tessellator.draw(); 391 } 392 393 /** 394 * Adds a textured quad to the tesselator at the specified position with the specified texture coords, width and 395 * height. Args: x, y, u, v, width, height 396 */ 397 public void renderTexturedQuad(int par1, int par2, int par3, int par4, int par5, int par6) 398 { 399 float var7 = 0.00390625F; 400 float var8 = 0.00390625F; 401 Tessellator var9 = Tessellator.instance; 402 var9.startDrawingQuads(); 403 var9.addVertexWithUV((double)(par1 + 0), (double)(par2 + par6), (double)this.zLevel, (double)((float)(par3 + 0) * var7), (double)((float)(par4 + par6) * var8)); 404 var9.addVertexWithUV((double)(par1 + par5), (double)(par2 + par6), (double)this.zLevel, (double)((float)(par3 + par5) * var7), (double)((float)(par4 + par6) * var8)); 405 var9.addVertexWithUV((double)(par1 + par5), (double)(par2 + 0), (double)this.zLevel, (double)((float)(par3 + par5) * var7), (double)((float)(par4 + 0) * var8)); 406 var9.addVertexWithUV((double)(par1 + 0), (double)(par2 + 0), (double)this.zLevel, (double)((float)(par3 + 0) * var7), (double)((float)(par4 + 0) * var8)); 407 var9.draw(); 408 } 409 410 /** 411 * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then 412 * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic 413 * (Render<T extends Entity) and this method has signature public void doRender(T entity, double d, double d1, 414 * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that. 415 */ 416 public void doRender(Entity par1Entity, double par2, double par4, double par6, float par8, float par9) 417 { 418 this.doRenderItem((EntityItem)par1Entity, par2, par4, par6, par8, par9); 419 } 420 }