001 package net.minecraft.client.renderer; 002 003 import cpw.mods.fml.client.TextureFXManager; 004 import cpw.mods.fml.common.FMLLog; 005 import cpw.mods.fml.relauncher.Side; 006 import cpw.mods.fml.relauncher.SideOnly; 007 import java.awt.Color; 008 import java.awt.Dimension; 009 import java.awt.Graphics; 010 import java.awt.image.BufferedImage; 011 import java.awt.image.ImageObserver; 012 import java.io.IOException; 013 import java.io.InputStream; 014 import java.nio.ByteBuffer; 015 import java.nio.IntBuffer; 016 import java.util.ArrayList; 017 import java.util.HashMap; 018 import java.util.Iterator; 019 import java.util.List; 020 import java.util.Map; 021 import java.util.logging.Level; 022 import java.util.logging.Logger; 023 024 import javax.imageio.ImageIO; 025 import net.minecraft.client.renderer.texturefx.TextureFX; 026 import net.minecraft.client.settings.GameSettings; 027 import net.minecraft.client.texturepacks.ITexturePack; 028 import net.minecraft.client.texturepacks.TexturePackList; 029 import net.minecraft.util.IntHashMap; 030 import org.lwjgl.opengl.GL11; 031 032 import net.minecraftforge.client.ForgeHooksClient; 033 034 @SideOnly(Side.CLIENT) 035 public class RenderEngine 036 { 037 private HashMap textureMap = new HashMap(); 038 039 /** Texture contents map (key: texture name, value: int[] contents) */ 040 private HashMap textureContentsMap = new HashMap(); 041 042 /** A mapping from GL texture names (integers) to BufferedImage instances */ 043 private IntHashMap textureNameToImageMap = new IntHashMap(); 044 045 /** An IntBuffer storing 1 int used as scratch space in RenderEngine */ 046 private IntBuffer singleIntBuffer = GLAllocation.createDirectIntBuffer(1); 047 048 /** Stores the image data for the texture. */ 049 private ByteBuffer imageData = GLAllocation.createDirectByteBuffer(16777216); 050 public List textureList = new ArrayList(); 051 052 /** A mapping from image URLs to ThreadDownloadImageData instances */ 053 private Map urlToImageDataMap = new HashMap(); 054 055 /** Reference to the GameSettings object */ 056 private GameSettings options; 057 058 /** Flag set when a texture should not be repeated */ 059 public boolean clampTexture = false; 060 061 /** Flag set when a texture should use blurry resizing */ 062 public boolean blurTexture = false; 063 064 /** Texture pack */ 065 public TexturePackList texturePack; 066 067 /** Missing texture image */ 068 private BufferedImage missingTextureImage = new BufferedImage(64, 64, 2); 069 070 public static Logger log = FMLLog.getLogger(); 071 072 public RenderEngine(TexturePackList par1TexturePackList, GameSettings par2GameSettings) 073 { 074 this.texturePack = par1TexturePackList; 075 this.options = par2GameSettings; 076 Graphics var3 = this.missingTextureImage.getGraphics(); 077 var3.setColor(Color.WHITE); 078 var3.fillRect(0, 0, 64, 64); 079 var3.setColor(Color.BLACK); 080 var3.drawString("missingtex", 1, 10); 081 var3.dispose(); 082 } 083 084 public int[] getTextureContents(String par1Str) 085 { 086 ITexturePack var2 = this.texturePack.getSelectedTexturePack(); 087 int[] var3 = (int[])this.textureContentsMap.get(par1Str); 088 089 if (var3 != null) 090 { 091 return var3; 092 } 093 else 094 { 095 try 096 { 097 Object var4 = null; 098 int[] var7; 099 100 if (par1Str.startsWith("##")) 101 { 102 var7 = this.getImageContentsAndAllocate(this.unwrapImageByColumns(this.readTextureImage(var2.getResourceAsStream(par1Str.substring(2))))); 103 } 104 else if (par1Str.startsWith("%clamp%")) 105 { 106 this.clampTexture = true; 107 var7 = this.getImageContentsAndAllocate(this.readTextureImage(var2.getResourceAsStream(par1Str.substring(7)))); 108 this.clampTexture = false; 109 } 110 else if (par1Str.startsWith("%blur%")) 111 { 112 this.blurTexture = true; 113 this.clampTexture = true; 114 var7 = this.getImageContentsAndAllocate(this.readTextureImage(var2.getResourceAsStream(par1Str.substring(6)))); 115 this.clampTexture = false; 116 this.blurTexture = false; 117 } 118 else 119 { 120 InputStream var8 = var2.getResourceAsStream(par1Str); 121 122 if (var8 == null) 123 { 124 var7 = this.getImageContentsAndAllocate(this.missingTextureImage); 125 } 126 else 127 { 128 var7 = this.getImageContentsAndAllocate(this.readTextureImage(var8)); 129 } 130 } 131 132 this.textureContentsMap.put(par1Str, var7); 133 return var7; 134 } 135 catch (Exception var6) 136 { 137 log.log(Level.INFO, String.format("An error occured reading texture file %s (getTexture)", par1Str), var6); 138 var6.printStackTrace(); 139 int[] var5 = this.getImageContentsAndAllocate(this.missingTextureImage); 140 this.textureContentsMap.put(par1Str, var5); 141 return var5; 142 } 143 } 144 } 145 146 private int[] getImageContentsAndAllocate(BufferedImage par1BufferedImage) 147 { 148 int var2 = par1BufferedImage.getWidth(); 149 int var3 = par1BufferedImage.getHeight(); 150 int[] var4 = new int[var2 * var3]; 151 par1BufferedImage.getRGB(0, 0, var2, var3, var4, 0, var2); 152 return var4; 153 } 154 155 private int[] getImageContents(BufferedImage par1BufferedImage, int[] par2ArrayOfInteger) 156 { 157 int var3 = par1BufferedImage.getWidth(); 158 int var4 = par1BufferedImage.getHeight(); 159 par1BufferedImage.getRGB(0, 0, var3, var4, par2ArrayOfInteger, 0, var3); 160 return par2ArrayOfInteger; 161 } 162 163 public int getTexture(String par1Str) 164 { 165 Integer var2 = (Integer)this.textureMap.get(par1Str); 166 167 if (var2 != null) 168 { 169 return var2.intValue(); 170 } 171 else 172 { 173 ITexturePack var6 = this.texturePack.getSelectedTexturePack(); 174 175 try 176 { 177 ForgeHooksClient.onTextureLoadPre(par1Str); 178 this.singleIntBuffer.clear(); 179 GLAllocation.generateTextureNames(this.singleIntBuffer); 180 int var3 = this.singleIntBuffer.get(0); 181 182 if (par1Str.startsWith("##")) 183 { 184 this.setupTexture(this.unwrapImageByColumns(this.readTextureImage(var6.getResourceAsStream(par1Str.substring(2)))), var3); 185 } 186 else if (par1Str.startsWith("%clamp%")) 187 { 188 this.clampTexture = true; 189 this.setupTexture(this.readTextureImage(var6.getResourceAsStream(par1Str.substring(7))), var3); 190 this.clampTexture = false; 191 } 192 else if (par1Str.startsWith("%blur%")) 193 { 194 this.blurTexture = true; 195 this.setupTexture(this.readTextureImage(var6.getResourceAsStream(par1Str.substring(6))), var3); 196 this.blurTexture = false; 197 } 198 else if (par1Str.startsWith("%blurclamp%")) 199 { 200 this.blurTexture = true; 201 this.clampTexture = true; 202 this.setupTexture(this.readTextureImage(var6.getResourceAsStream(par1Str.substring(11))), var3); 203 this.blurTexture = false; 204 this.clampTexture = false; 205 } 206 else 207 { 208 InputStream var7 = var6.getResourceAsStream(par1Str); 209 210 if (var7 == null) 211 { 212 this.setupTexture(this.missingTextureImage, var3); 213 } 214 else 215 { 216 this.setupTexture(this.readTextureImage(var7), var3); 217 } 218 } 219 220 this.textureMap.put(par1Str, Integer.valueOf(var3)); 221 ForgeHooksClient.onTextureLoad(par1Str, var6); 222 return var3; 223 } 224 catch (Exception var5) 225 { 226 var5.printStackTrace(); 227 GLAllocation.generateTextureNames(this.singleIntBuffer); 228 int var4 = this.singleIntBuffer.get(0); 229 this.setupTexture(this.missingTextureImage, var4); 230 this.textureMap.put(par1Str, Integer.valueOf(var4)); 231 return var4; 232 } 233 } 234 } 235 236 /** 237 * Takes an image with multiple 16-pixel-wide columns and creates a new 16-pixel-wide image where the columns are 238 * stacked vertically 239 */ 240 private BufferedImage unwrapImageByColumns(BufferedImage par1BufferedImage) 241 { 242 int var2 = par1BufferedImage.getWidth() / 16; 243 BufferedImage var3 = new BufferedImage(16, par1BufferedImage.getHeight() * var2, 2); 244 Graphics var4 = var3.getGraphics(); 245 246 for (int var5 = 0; var5 < var2; ++var5) 247 { 248 var4.drawImage(par1BufferedImage, -var5 * 16, var5 * par1BufferedImage.getHeight(), (ImageObserver)null); 249 } 250 251 var4.dispose(); 252 return var3; 253 } 254 255 /** 256 * Copy the supplied image onto a newly-allocated OpenGL texture, returning the allocated texture name 257 */ 258 public int allocateAndSetupTexture(BufferedImage par1BufferedImage) 259 { 260 this.singleIntBuffer.clear(); 261 GLAllocation.generateTextureNames(this.singleIntBuffer); 262 int var2 = this.singleIntBuffer.get(0); 263 this.setupTexture(par1BufferedImage, var2); 264 this.textureNameToImageMap.addKey(var2, par1BufferedImage); 265 return var2; 266 } 267 268 /** 269 * Copy the supplied image onto the specified OpenGL texture 270 */ 271 public void setupTexture(BufferedImage par1BufferedImage, int par2) 272 { 273 GL11.glBindTexture(GL11.GL_TEXTURE_2D, par2); 274 GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); 275 GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); 276 277 if (this.blurTexture) 278 { 279 GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); 280 GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR); 281 } 282 283 if (this.clampTexture) 284 { 285 GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_CLAMP); 286 GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_CLAMP); 287 } 288 else 289 { 290 GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT); 291 GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT); 292 } 293 294 int var3 = par1BufferedImage.getWidth(); 295 int var4 = par1BufferedImage.getHeight(); 296 TextureFXManager.instance().setTextureDimensions(par2, var3, var4, (List<TextureFX>)textureList); 297 int[] var5 = new int[var3 * var4]; 298 byte[] var6 = new byte[var3 * var4 * 4]; 299 par1BufferedImage.getRGB(0, 0, var3, var4, var5, 0, var3); 300 301 for (int var7 = 0; var7 < var5.length; ++var7) 302 { 303 int var8 = var5[var7] >> 24 & 255; 304 int var9 = var5[var7] >> 16 & 255; 305 int var10 = var5[var7] >> 8 & 255; 306 int var11 = var5[var7] & 255; 307 308 if (this.options != null && this.options.anaglyph) 309 { 310 int var12 = (var9 * 30 + var10 * 59 + var11 * 11) / 100; 311 int var13 = (var9 * 30 + var10 * 70) / 100; 312 int var14 = (var9 * 30 + var11 * 70) / 100; 313 var9 = var12; 314 var10 = var13; 315 var11 = var14; 316 } 317 318 var6[var7 * 4 + 0] = (byte)var9; 319 var6[var7 * 4 + 1] = (byte)var10; 320 var6[var7 * 4 + 2] = (byte)var11; 321 var6[var7 * 4 + 3] = (byte)var8; 322 } 323 324 this.imageData.clear(); 325 this.imageData.put(var6); 326 this.imageData.position(0).limit(var6.length); 327 GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, var3, var4, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, this.imageData); 328 } 329 330 public void createTextureFromBytes(int[] par1ArrayOfInteger, int par2, int par3, int par4) 331 { 332 GL11.glBindTexture(GL11.GL_TEXTURE_2D, par4); 333 GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); 334 GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); 335 336 if (this.blurTexture) 337 { 338 GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); 339 GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR); 340 } 341 342 if (this.clampTexture) 343 { 344 GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_CLAMP); 345 GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_CLAMP); 346 } 347 else 348 { 349 GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT); 350 GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT); 351 } 352 353 byte[] var5 = new byte[par2 * par3 * 4]; 354 355 for (int var6 = 0; var6 < par1ArrayOfInteger.length; ++var6) 356 { 357 int var7 = par1ArrayOfInteger[var6] >> 24 & 255; 358 int var8 = par1ArrayOfInteger[var6] >> 16 & 255; 359 int var9 = par1ArrayOfInteger[var6] >> 8 & 255; 360 int var10 = par1ArrayOfInteger[var6] & 255; 361 362 if (this.options != null && this.options.anaglyph) 363 { 364 int var11 = (var8 * 30 + var9 * 59 + var10 * 11) / 100; 365 int var12 = (var8 * 30 + var9 * 70) / 100; 366 int var13 = (var8 * 30 + var10 * 70) / 100; 367 var8 = var11; 368 var9 = var12; 369 var10 = var13; 370 } 371 372 var5[var6 * 4 + 0] = (byte)var8; 373 var5[var6 * 4 + 1] = (byte)var9; 374 var5[var6 * 4 + 2] = (byte)var10; 375 var5[var6 * 4 + 3] = (byte)var7; 376 } 377 378 this.imageData.clear(); 379 this.imageData.put(var5); 380 this.imageData.position(0).limit(var5.length); 381 GL11.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, par2, par3, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, this.imageData); 382 } 383 384 /** 385 * Deletes a single GL texture 386 */ 387 public void deleteTexture(int par1) 388 { 389 this.textureNameToImageMap.removeObject(par1); 390 this.singleIntBuffer.clear(); 391 this.singleIntBuffer.put(par1); 392 this.singleIntBuffer.flip(); 393 GL11.glDeleteTextures(this.singleIntBuffer); 394 } 395 396 /** 397 * Takes a URL of a downloadable image and the name of the local image to be used as a fallback. If the image has 398 * been downloaded, returns the GL texture of the downloaded image, otherwise returns the GL texture of the fallback 399 * image. 400 */ 401 public int getTextureForDownloadableImage(String par1Str, String par2Str) 402 { 403 ThreadDownloadImageData var3 = (ThreadDownloadImageData)this.urlToImageDataMap.get(par1Str); 404 405 if (var3 != null && var3.image != null && !var3.textureSetupComplete) 406 { 407 if (var3.textureName < 0) 408 { 409 var3.textureName = this.allocateAndSetupTexture(var3.image); 410 } 411 else 412 { 413 this.setupTexture(var3.image, var3.textureName); 414 } 415 416 var3.textureSetupComplete = true; 417 } 418 419 return var3 != null && var3.textureName >= 0 ? var3.textureName : (par2Str == null ? -1 : this.getTexture(par2Str)); 420 } 421 422 /** 423 * Checks if urlToImageDataMap has image data for the given key 424 */ 425 public boolean hasImageData(String par1Str) 426 { 427 return this.urlToImageDataMap.containsKey(par1Str); 428 } 429 430 /** 431 * Return a ThreadDownloadImageData instance for the given URL. If it does not already exist, it is created and 432 * uses the passed ImageBuffer. If it does, its reference count is incremented. 433 */ 434 public ThreadDownloadImageData obtainImageData(String par1Str, IImageBuffer par2IImageBuffer) 435 { 436 ThreadDownloadImageData var3 = (ThreadDownloadImageData)this.urlToImageDataMap.get(par1Str); 437 438 if (var3 == null) 439 { 440 this.urlToImageDataMap.put(par1Str, new ThreadDownloadImageData(par1Str, par2IImageBuffer)); 441 } 442 else 443 { 444 ++var3.referenceCount; 445 } 446 447 return var3; 448 } 449 450 /** 451 * Decrements the reference count for a given URL, deleting the image data if the reference count hits 0 452 */ 453 public void releaseImageData(String par1Str) 454 { 455 ThreadDownloadImageData var2 = (ThreadDownloadImageData)this.urlToImageDataMap.get(par1Str); 456 457 if (var2 != null) 458 { 459 --var2.referenceCount; 460 461 if (var2.referenceCount == 0) 462 { 463 if (var2.textureName >= 0) 464 { 465 this.deleteTexture(var2.textureName); 466 } 467 468 this.urlToImageDataMap.remove(par1Str); 469 } 470 } 471 } 472 473 public void registerTextureFX(TextureFX par1TextureFX) 474 { 475 TextureFXManager.instance().onPreRegisterEffect(par1TextureFX); 476 this.textureList.add(par1TextureFX); 477 par1TextureFX.onTick(); 478 } 479 480 public void updateDynamicTextures() 481 { 482 int var1 = -1; 483 484 for (int var2 = 0; var2 < this.textureList.size(); ++var2) 485 { 486 TextureFX var3 = (TextureFX)this.textureList.get(var2); 487 var3.anaglyphEnabled = this.options.anaglyph; 488 if (TextureFXManager.instance().onUpdateTextureEffect(var3)) 489 { 490 var1 = this.updateDynamicTexture(var3, var1); 491 } 492 } 493 } 494 495 /** 496 * Updates a single dynamic texture 497 */ 498 public int updateDynamicTexture(TextureFX par1TextureFX, int par2) 499 { 500 Dimension dim = TextureFXManager.instance().getTextureDimensions(par1TextureFX); 501 int tWidth = dim.width >> 4; 502 int tHeight = dim.height >> 4; 503 int tLen = tWidth * tHeight << 2; 504 505 if (par1TextureFX.imageData.length == tLen) 506 { 507 this.imageData.clear(); 508 this.imageData.put(par1TextureFX.imageData); 509 this.imageData.position(0).limit(par1TextureFX.imageData.length); 510 } 511 else 512 { 513 TextureFXManager.instance().scaleTextureFXData(par1TextureFX.imageData, imageData, tWidth, tLen); 514 } 515 516 if (par1TextureFX.textureId != par2) 517 { 518 par1TextureFX.bindImage(this); 519 par2 = par1TextureFX.textureId; 520 } 521 522 for (int var3 = 0; var3 < par1TextureFX.tileSize; ++var3) 523 { 524 int xOffset = par1TextureFX.iconIndex % 16 * tWidth + var3 * tWidth; 525 for (int var4 = 0; var4 < par1TextureFX.tileSize; ++var4) 526 { 527 int yOffset = par1TextureFX.iconIndex / 16 * tHeight + var4 * tHeight; 528 GL11.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, xOffset, yOffset, tWidth, tHeight, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, this.imageData); 529 } 530 } 531 532 return par2; 533 } 534 535 /** 536 * Call setupTexture on all currently-loaded textures again to account for changes in rendering options 537 */ 538 public void refreshTextures() 539 { 540 ITexturePack var1 = this.texturePack.getSelectedTexturePack(); 541 Iterator var2 = this.textureNameToImageMap.getKeySet().iterator(); 542 BufferedImage var4; 543 544 while (var2.hasNext()) 545 { 546 int var3 = ((Integer)var2.next()).intValue(); 547 var4 = (BufferedImage)this.textureNameToImageMap.lookup(var3); 548 this.setupTexture(var4, var3); 549 } 550 551 ThreadDownloadImageData var8; 552 553 for (var2 = this.urlToImageDataMap.values().iterator(); var2.hasNext(); var8.textureSetupComplete = false) 554 { 555 var8 = (ThreadDownloadImageData)var2.next(); 556 } 557 558 var2 = this.textureMap.keySet().iterator(); 559 String var9; 560 561 while (var2.hasNext()) 562 { 563 var9 = (String)var2.next(); 564 565 try 566 { 567 if (var9.startsWith("##")) 568 { 569 var4 = this.unwrapImageByColumns(this.readTextureImage(var1.getResourceAsStream(var9.substring(2)))); 570 } 571 else if (var9.startsWith("%clamp%")) 572 { 573 this.clampTexture = true; 574 var4 = this.readTextureImage(var1.getResourceAsStream(var9.substring(7))); 575 } 576 else if (var9.startsWith("%blur%")) 577 { 578 this.blurTexture = true; 579 var4 = this.readTextureImage(var1.getResourceAsStream(var9.substring(6))); 580 } 581 else if (var9.startsWith("%blurclamp%")) 582 { 583 this.blurTexture = true; 584 this.clampTexture = true; 585 var4 = this.readTextureImage(var1.getResourceAsStream(var9.substring(11))); 586 } 587 else 588 { 589 var4 = this.readTextureImage(var1.getResourceAsStream(var9)); 590 } 591 592 int var5 = ((Integer)this.textureMap.get(var9)).intValue(); 593 this.setupTexture(var4, var5); 594 this.blurTexture = false; 595 this.clampTexture = false; 596 } 597 catch (Exception var7) 598 { 599 log.log(Level.INFO,String.format("An error occured reading texture file %s (refreshTexture)", var9), var7); 600 var7.printStackTrace(); 601 } 602 } 603 604 var2 = this.textureContentsMap.keySet().iterator(); 605 606 while (var2.hasNext()) 607 { 608 var9 = (String)var2.next(); 609 610 try 611 { 612 if (var9.startsWith("##")) 613 { 614 var4 = this.unwrapImageByColumns(this.readTextureImage(var1.getResourceAsStream(var9.substring(2)))); 615 } 616 else if (var9.startsWith("%clamp%")) 617 { 618 this.clampTexture = true; 619 var4 = this.readTextureImage(var1.getResourceAsStream(var9.substring(7))); 620 } 621 else if (var9.startsWith("%blur%")) 622 { 623 this.blurTexture = true; 624 var4 = this.readTextureImage(var1.getResourceAsStream(var9.substring(6))); 625 } 626 else 627 { 628 var4 = this.readTextureImage(var1.getResourceAsStream(var9)); 629 } 630 631 this.getImageContents(var4, (int[])this.textureContentsMap.get(var9)); 632 this.blurTexture = false; 633 this.clampTexture = false; 634 } 635 catch (Exception var6) 636 { 637 log.log(Level.INFO,String.format("An error occured reading texture file data %s (refreshTexture)", var9), var6); 638 var6.printStackTrace(); 639 } 640 } 641 } 642 643 /** 644 * Returns a BufferedImage read off the provided input stream. Args: inputStream 645 */ 646 private BufferedImage readTextureImage(InputStream par1InputStream) throws IOException 647 { 648 BufferedImage var2 = ImageIO.read(par1InputStream); 649 par1InputStream.close(); 650 return var2; 651 } 652 653 public void bindTexture(int par1) 654 { 655 if (par1 >= 0) 656 { 657 GL11.glBindTexture(GL11.GL_TEXTURE_2D, par1); 658 } 659 } 660 }