Advertisement
Corosus

Untitled

Mar 12th, 2012
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 61.24 KB | None | 0 0
  1. package net.minecraft.src;
  2.  
  3. import java.awt.Color;
  4. import java.awt.Dimension;
  5. import java.awt.Graphics;
  6. import java.awt.Graphics2D;
  7. import java.awt.RenderingHints;
  8. import java.awt.image.BufferedImage;
  9. import java.awt.image.ImageObserver;
  10. import java.io.IOException;
  11. import java.io.InputStream;
  12. import java.nio.ByteBuffer;
  13. import java.nio.IntBuffer;
  14. import java.util.ArrayList;
  15. import java.util.HashMap;
  16. import java.util.IdentityHashMap;
  17. import java.util.Iterator;
  18. import java.util.List;
  19. import java.util.Map;
  20. import java.util.Random;
  21. import javax.imageio.ImageIO;
  22. import net.minecraft.client.Minecraft;
  23. import org.lwjgl.opengl.GL11;
  24. import org.lwjgl.opengl.GL12;
  25. import org.lwjgl.opengl.GLContext;
  26.  
  27. public class RenderEngine
  28. {
  29.     /** Use mipmaps for all bound textures (unused at present) */
  30.     public static boolean useMipmaps = true;
  31.     private HashMap textureMap = new HashMap();
  32.  
  33.     /** Texture contents map (key: texture name, value: int[] contents) */
  34.     private HashMap textureContentsMap = new HashMap();
  35.  
  36.     /** A mapping from GL texture names (integers) to BufferedImage instances */
  37.     private IntHashMap textureNameToImageMap = new IntHashMap();
  38.  
  39.     /** An IntBuffer storing 1 int used as scratch space in RenderEngine */
  40.     private IntBuffer singleIntBuffer = GLAllocation.createDirectIntBuffer(1);
  41.  
  42.     /** Stores the image data for the texture. */
  43.     private ByteBuffer imageData;
  44.     private List textureList;
  45.  
  46.     /** A mapping from image URLs to ThreadDownloadImageData instances */
  47.     private Map urlToImageDataMap;
  48.  
  49.     /** Reference to the GameSettings object */
  50.     private GameSettings options;
  51.  
  52.     /** Flag set when a texture should not be repeated */
  53.     public boolean clampTexture;
  54.  
  55.     /** Flag set when a texture should use blurry resizing */
  56.     public boolean blurTexture;
  57.  
  58.     /** Texture pack */
  59.     public TexturePackList texturePack;
  60.  
  61.     /** Missing texture image */
  62.     private BufferedImage missingTextureImage;
  63.     private int field_48512_n;
  64.     private int terrainTextureId = -1;
  65.     private int guiItemsTextureId = -1;
  66.     private int ctmTextureId = -1;
  67.     private boolean hdTexturesInstalled = false;
  68.     private Map textureDimensionsMap = new HashMap();
  69.     private Map textureDataMap = new HashMap();
  70.     private int tickCounter = 0;
  71.     private ByteBuffer[] mipImageDatas;
  72.     private boolean dynamicTexturesUpdated = false;
  73.     private Map textureFxMap = new IdentityHashMap();
  74.     private Map mipDataBufsMap = new HashMap();
  75.     private int checkedEntityId = -1;
  76.     private World checkedEntityWorld = null;
  77.     private Map textureVariantsMap = new HashMap();
  78.  
  79.     public RenderEngine(TexturePackList par1TexturePackList, GameSettings par2GameSettings)
  80.     {
  81.         this.allocateImageData(256);
  82.         this.textureList = new ArrayList();
  83.         this.urlToImageDataMap = new HashMap();
  84.         this.clampTexture = false;
  85.         this.blurTexture = false;
  86.         this.missingTextureImage = new BufferedImage(64, 64, 2);
  87.         this.field_48512_n = 16;
  88.         this.texturePack = par1TexturePackList;
  89.         this.options = par2GameSettings;
  90.         Graphics var3 = this.missingTextureImage.getGraphics();
  91.         var3.setColor(Color.WHITE);
  92.         var3.fillRect(0, 0, 64, 64);
  93.         var3.setColor(Color.BLACK);
  94.         var3.drawString("missingtex", 1, 10);
  95.         var3.dispose();
  96.     }
  97.  
  98.     public int[] getTextureContents(String par1Str)
  99.     {
  100.         TexturePackBase var2 = this.texturePack.selectedTexturePack;
  101.         int[] var3 = (int[])((int[])this.textureContentsMap.get(par1Str));
  102.  
  103.         if (var3 != null)
  104.         {
  105.             return var3;
  106.         }
  107.         else
  108.         {
  109.             int[] var4;
  110.  
  111.             try
  112.             {
  113.                 Object var7 = null;
  114.  
  115.                 if (par1Str.startsWith("##"))
  116.                 {
  117.                     var4 = this.getImageContentsAndAllocate(this.unwrapImageByColumns(this.readTextureImage(var2.getResourceAsStream(par1Str.substring(2)))));
  118.                 }
  119.                 else if (par1Str.startsWith("%clamp%"))
  120.                 {
  121.                     this.clampTexture = true;
  122.                     var4 = this.getImageContentsAndAllocate(this.readTextureImage(var2.getResourceAsStream(par1Str.substring(7))));
  123.                     this.clampTexture = false;
  124.                 }
  125.                 else if (par1Str.startsWith("%blur%"))
  126.                 {
  127.                     this.blurTexture = true;
  128.                     this.clampTexture = true;
  129.                     var4 = this.getImageContentsAndAllocate(this.readTextureImage(var2.getResourceAsStream(par1Str.substring(6))));
  130.                     this.clampTexture = false;
  131.                     this.blurTexture = false;
  132.                 }
  133.                 else
  134.                 {
  135.                     InputStream var5 = var2.getResourceAsStream(par1Str);
  136.  
  137.                     if (var5 == null)
  138.                     {
  139.                         var4 = this.getImageContentsAndAllocate(this.missingTextureImage);
  140.                     }
  141.                     else
  142.                     {
  143.                         var4 = this.getImageContentsAndAllocate(this.readTextureImage(var5));
  144.                     }
  145.                 }
  146.  
  147.                 this.textureContentsMap.put(par1Str, var4);
  148.                 return var4;
  149.             }
  150.             catch (IOException var6)
  151.             {
  152.                 var6.printStackTrace();
  153.                 var4 = this.getImageContentsAndAllocate(this.missingTextureImage);
  154.                 this.textureContentsMap.put(par1Str, var4);
  155.                 return var4;
  156.             }
  157.         }
  158.     }
  159.  
  160.     private int[] getImageContentsAndAllocate(BufferedImage par1BufferedImage)
  161.     {
  162.         int var2 = par1BufferedImage.getWidth();
  163.         int var3 = par1BufferedImage.getHeight();
  164.         int[] var4 = new int[var2 * var3];
  165.         par1BufferedImage.getRGB(0, 0, var2, var3, var4, 0, var2);
  166.         return var4;
  167.     }
  168.  
  169.     private int[] getImageContents(BufferedImage par1BufferedImage, int[] par2ArrayOfInteger)
  170.     {
  171.         int var3 = par1BufferedImage.getWidth();
  172.         int var4 = par1BufferedImage.getHeight();
  173.         par1BufferedImage.getRGB(0, 0, var3, var4, par2ArrayOfInteger, 0, var3);
  174.         return par2ArrayOfInteger;
  175.     }
  176.  
  177.     public int getTexture(String par1Str)
  178.     {
  179.         TexturePackBase var2 = this.texturePack.selectedTexturePack;
  180.         Integer var3 = (Integer)this.textureMap.get(par1Str);
  181.  
  182.         if (var3 != null)
  183.         {
  184.             return var3.intValue();
  185.         }
  186.         else
  187.         {
  188.             int var4;
  189.  
  190.             try
  191.             {
  192.                 this.singleIntBuffer.clear();
  193.                 GLAllocation.generateTextureNames(this.singleIntBuffer);
  194.  
  195.                 if (Tessellator.renderingWorldRenderer)
  196.                 {
  197.                     System.out.printf("Warning: Texture %s not preloaded, will cause render glitches!\n", new Object[] {par1Str});
  198.                 }
  199.  
  200.                 var4 = this.singleIntBuffer.get(0);
  201.                 Config.dbg("setupTexture: \"" + par1Str + "\", id: " + var4);
  202.  
  203.                 if (par1Str.startsWith("##"))
  204.                 {
  205.                     this.setupTexture(this.unwrapImageByColumns(this.readTextureImage(var2.getResourceAsStream(par1Str.substring(2)))), var4);
  206.                 }
  207.                 else if (par1Str.startsWith("%clamp%"))
  208.                 {
  209.                     this.clampTexture = true;
  210.                     this.setupTexture(this.readTextureImage(var2.getResourceAsStream(par1Str.substring(7))), var4);
  211.                     this.clampTexture = false;
  212.                 }
  213.                 else if (par1Str.startsWith("%blur%"))
  214.                 {
  215.                     this.blurTexture = true;
  216.                     this.setupTexture(this.readTextureImage(var2.getResourceAsStream(par1Str.substring(6))), var4);
  217.                     this.blurTexture = false;
  218.                 }
  219.                 else if (par1Str.startsWith("%blurclamp%"))
  220.                 {
  221.                     this.blurTexture = true;
  222.                     this.clampTexture = true;
  223.                     this.setupTexture(this.readTextureImage(var2.getResourceAsStream(par1Str.substring(11))), var4);
  224.                     this.blurTexture = false;
  225.                     this.clampTexture = false;
  226.                 }
  227.                 else
  228.                 {
  229.                     InputStream var5 = var2.getResourceAsStream(par1Str);
  230.  
  231.                     if (var5 == null)
  232.                     {
  233.                         this.setupTexture(this.missingTextureImage, var4);
  234.                     }
  235.                     else
  236.                     {
  237.                         if (par1Str.equals("/terrain.png"))
  238.                         {
  239.                             this.terrainTextureId = var4;
  240.                         }
  241.  
  242.                         if (par1Str.equals("/gui/items.png"))
  243.                         {
  244.                             this.guiItemsTextureId = var4;
  245.                         }
  246.  
  247.                         if (par1Str.equals("/ctm.png"))
  248.                         {
  249.                             this.ctmTextureId = var4;
  250.                         }
  251.  
  252.                         this.setupTexture(this.readTextureImage(var5), var4);
  253.                     }
  254.                 }
  255.  
  256.                 this.textureMap.put(par1Str, Integer.valueOf(var4));
  257.                 return var4;
  258.             }
  259.             catch (Exception var6)
  260.             {
  261.                 var6.printStackTrace();
  262.                 GLAllocation.generateTextureNames(this.singleIntBuffer);
  263.                 var4 = this.singleIntBuffer.get(0);
  264.                 this.setupTexture(this.missingTextureImage, var4);
  265.                 this.textureMap.put(par1Str, Integer.valueOf(var4));
  266.                 return var4;
  267.             }
  268.         }
  269.     }
  270.  
  271.     /**
  272.      * Takes an image with multiple 16-pixel-wide columns and creates a new 16-pixel-wide image where the columns are
  273.      * stacked vertically
  274.      */
  275.     private BufferedImage unwrapImageByColumns(BufferedImage par1BufferedImage)
  276.     {
  277.         int var2 = par1BufferedImage.getWidth() / 16;
  278.         BufferedImage var3 = new BufferedImage(16, par1BufferedImage.getHeight() * var2, 2);
  279.         Graphics var4 = var3.getGraphics();
  280.  
  281.         for (int var5 = 0; var5 < var2; ++var5)
  282.         {
  283.             var4.drawImage(par1BufferedImage, -var5 * 16, var5 * par1BufferedImage.getHeight(), (ImageObserver)null);
  284.         }
  285.  
  286.         var4.dispose();
  287.         return var3;
  288.     }
  289.  
  290.     /**
  291.      * Copy the supplied image onto a newly-allocated OpenGL texture, returning the allocated texture name
  292.      */
  293.     public int allocateAndSetupTexture(BufferedImage par1BufferedImage)
  294.     {
  295.         this.singleIntBuffer.clear();
  296.         GLAllocation.generateTextureNames(this.singleIntBuffer);
  297.         int var2 = this.singleIntBuffer.get(0);
  298.         this.setupTexture(par1BufferedImage, var2);
  299.         this.textureNameToImageMap.addKey(var2, par1BufferedImage);
  300.         return var2;
  301.     }
  302.  
  303.     /**
  304.      * Copy the supplied image onto the specified OpenGL texture
  305.      */
  306.     public void setupTexture(BufferedImage par1BufferedImage, int par2)
  307.     {
  308.         GL11.glBindTexture(GL11.GL_TEXTURE_2D, par2);
  309.         boolean var3 = useMipmaps && Config.isUseMipmaps();
  310.         int var4;
  311.         int var5;
  312.  
  313.         if (var3 && par2 != this.guiItemsTextureId)
  314.         {
  315.             var4 = Config.getMipmapType();
  316.             GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, var4);
  317.             GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
  318.  
  319.             if (GLContext.getCapabilities().OpenGL12)
  320.             {
  321.                 GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_BASE_LEVEL, 0);
  322.                 var5 = Config.getMipmapLevel();
  323.  
  324.                 if (var5 >= 4)
  325.                 {
  326.                     int var6 = Math.min(par1BufferedImage.getWidth(), par1BufferedImage.getHeight());
  327.                     var5 = this.getMaxMipmapLevel(var6) - 4;
  328.  
  329.                     if (var5 < 0)
  330.                     {
  331.                         var5 = 0;
  332.                     }
  333.                 }
  334.  
  335.                 GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, var5);
  336.             }
  337.         }
  338.         else
  339.         {
  340.             GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
  341.             GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
  342.         }
  343.  
  344.         if (this.blurTexture)
  345.         {
  346.             GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
  347.             GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
  348.         }
  349.  
  350.         if (this.clampTexture)
  351.         {
  352.             GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_CLAMP);
  353.             GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_CLAMP);
  354.         }
  355.         else
  356.         {
  357.             GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT);
  358.             GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT);
  359.         }
  360.  
  361.         var4 = par1BufferedImage.getWidth();
  362.         var5 = par1BufferedImage.getHeight();
  363.         this.setTextureDimension(par2, new Dimension(var4, var5));
  364.         int[] var16 = new int[var4 * var5];
  365.         byte[] var7 = new byte[var4 * var5 * 4];
  366.         par1BufferedImage.getRGB(0, 0, var4, var5, var16, 0, var4);
  367.  
  368.         for (int var8 = 0; var8 < var16.length; ++var8)
  369.         {
  370.             int var9 = var16[var8] >> 24 & 255;
  371.             int var10 = var16[var8] >> 16 & 255;
  372.             int var11 = var16[var8] >> 8 & 255;
  373.             int var12 = var16[var8] & 255;
  374.  
  375.             if (this.options != null && this.options.anaglyph)
  376.             {
  377.                 int var13 = (var10 * 30 + var11 * 59 + var12 * 11) / 100;
  378.                 int var14 = (var10 * 30 + var11 * 70) / 100;
  379.                 int var15 = (var10 * 30 + var12 * 70) / 100;
  380.                 var10 = var13;
  381.                 var11 = var14;
  382.                 var12 = var15;
  383.             }
  384.  
  385.             if (var9 == 0)
  386.             {
  387.                 if (this.isTerrainTexture(par2))
  388.                 {
  389.                     var10 = 255;
  390.                     var11 = 255;
  391.                     var12 = 255;
  392.                 }
  393.                 else
  394.                 {
  395.                     var10 = 0;
  396.                     var11 = 0;
  397.                     var12 = 0;
  398.                 }
  399.             }
  400.  
  401.             var7[var8 * 4 + 0] = (byte)var10;
  402.             var7[var8 * 4 + 1] = (byte)var11;
  403.             var7[var8 * 4 + 2] = (byte)var12;
  404.             var7[var8 * 4 + 3] = (byte)var9;
  405.         }
  406.  
  407.         this.checkImageDataSize(var4);
  408.         this.imageData.clear();
  409.         this.imageData.put(var7);
  410.         this.imageData.position(0).limit(var7.length);
  411.         GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, var4, var5, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, this.imageData);
  412.  
  413.         if (useMipmaps)
  414.         {
  415.             this.generateMipMaps(this.imageData, var4, var5);
  416.         }
  417.     }
  418.  
  419.     private boolean isTerrainTexture(int var1)
  420.     {
  421.         return var1 == this.terrainTextureId ? true : var1 == this.ctmTextureId;
  422.     }
  423.  
  424.     private void generateMipMaps(ByteBuffer var1, int var2, int var3)
  425.     {
  426.         ByteBuffer var4 = var1;
  427.  
  428.         for (int var5 = 1; var5 <= 16; ++var5)
  429.         {
  430.             int var6 = var2 >> var5 - 1;
  431.             int var7 = var2 >> var5;
  432.             int var8 = var3 >> var5;
  433.  
  434.             if (var7 <= 0 || var8 <= 0)
  435.             {
  436.                 break;
  437.             }
  438.  
  439.             ByteBuffer var9 = this.mipImageDatas[var5 - 1];
  440.             var9.limit(var7 * var8 * 4);
  441.  
  442.             for (int var10 = 0; var10 < var7; ++var10)
  443.             {
  444.                 for (int var11 = 0; var11 < var8; ++var11)
  445.                 {
  446.                     int var12 = var4.getInt((var10 * 2 + 0 + (var11 * 2 + 0) * var6) * 4);
  447.                     int var13 = var4.getInt((var10 * 2 + 1 + (var11 * 2 + 0) * var6) * 4);
  448.                     int var14 = var4.getInt((var10 * 2 + 1 + (var11 * 2 + 1) * var6) * 4);
  449.                     int var15 = var4.getInt((var10 * 2 + 0 + (var11 * 2 + 1) * var6) * 4);
  450.                     int var16 = this.alphaBlend(var12, var13, var14, var15);
  451.                     var9.putInt((var10 + var11 * var7) * 4, var16);
  452.                 }
  453.             }
  454.  
  455.             var9.rewind();
  456.             GL11.glTexImage2D(GL11.GL_TEXTURE_2D, var5, GL11.GL_RGBA, var7, var8, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, var9);
  457.             var4 = var9;
  458.         }
  459.     }
  460.  
  461.     public void createTextureFromBytes(int[] par1ArrayOfInteger, int par2, int par3, int par4)
  462.     {
  463.         GL11.glBindTexture(GL11.GL_TEXTURE_2D, par4);
  464.  
  465.         if (useMipmaps && Config.isUseMipmaps())
  466.         {
  467.             GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST_MIPMAP_LINEAR);
  468.             GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
  469.         }
  470.         else
  471.         {
  472.             GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
  473.             GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
  474.         }
  475.  
  476.         if (this.blurTexture)
  477.         {
  478.             GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
  479.             GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
  480.         }
  481.  
  482.         if (this.clampTexture)
  483.         {
  484.             GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_CLAMP);
  485.             GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_CLAMP);
  486.         }
  487.         else
  488.         {
  489.             GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT);
  490.             GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT);
  491.         }
  492.  
  493.         byte[] var5 = new byte[par2 * par3 * 4];
  494.  
  495.         for (int var6 = 0; var6 < par1ArrayOfInteger.length; ++var6)
  496.         {
  497.             int var7 = par1ArrayOfInteger[var6] >> 24 & 255;
  498.             int var8 = par1ArrayOfInteger[var6] >> 16 & 255;
  499.             int var9 = par1ArrayOfInteger[var6] >> 8 & 255;
  500.             int var10 = par1ArrayOfInteger[var6] & 255;
  501.  
  502.             if (this.options != null && this.options.anaglyph)
  503.             {
  504.                 int var11 = (var8 * 30 + var9 * 59 + var10 * 11) / 100;
  505.                 int var12 = (var8 * 30 + var9 * 70) / 100;
  506.                 int var13 = (var8 * 30 + var10 * 70) / 100;
  507.                 var8 = var11;
  508.                 var9 = var12;
  509.                 var10 = var13;
  510.             }
  511.  
  512.             var5[var6 * 4 + 0] = (byte)var8;
  513.             var5[var6 * 4 + 1] = (byte)var9;
  514.             var5[var6 * 4 + 2] = (byte)var10;
  515.             var5[var6 * 4 + 3] = (byte)var7;
  516.         }
  517.  
  518.         this.imageData.clear();
  519.         this.imageData.put(var5);
  520.         this.imageData.position(0).limit(var5.length);
  521.         GL11.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, par2, par3, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, this.imageData);
  522.     }
  523.  
  524.     /**
  525.      * Deletes a single GL texture
  526.      */
  527.     public void deleteTexture(int par1)
  528.     {
  529.         this.textureNameToImageMap.removeObject(par1);
  530.         this.singleIntBuffer.clear();
  531.         this.singleIntBuffer.put(par1);
  532.         this.singleIntBuffer.flip();
  533.         GL11.glDeleteTextures(this.singleIntBuffer);
  534.     }
  535.  
  536.     /**
  537.      * Takes a URL of a downloadable image and the name of the local image to be used as a fallback.  If the image has
  538.      * been downloaded, returns the GL texture of the downloaded image, otherwise returns the GL texture of the fallback
  539.      * image.
  540.      */
  541.     public int getTextureForDownloadableImage(String par1Str, String par2Str)
  542.     {
  543.         ThreadDownloadImageData var3 = (ThreadDownloadImageData)this.urlToImageDataMap.get(par1Str);
  544.  
  545.         if (var3 != null && var3.image != null && !var3.textureSetupComplete)
  546.         {
  547.             if (var3.textureName < 0)
  548.             {
  549.                 var3.textureName = this.allocateAndSetupTexture(var3.image);
  550.             }
  551.             else
  552.             {
  553.                 this.setupTexture(var3.image, var3.textureName);
  554.             }
  555.  
  556.             var3.textureSetupComplete = true;
  557.         }
  558.  
  559.         return var3 != null && var3.textureName >= 0 ? var3.textureName : (par2Str == null ? -1 : this.getTexture(par2Str));
  560.     }
  561.  
  562.     /**
  563.      * Return a ThreadDownloadImageData instance for the given URL.  If it does not already exist, it is created and
  564.      * uses the passed ImageBuffer.  If it does, its reference count is incremented.
  565.      */
  566.     public ThreadDownloadImageData obtainImageData(String par1Str, ImageBuffer par2ImageBuffer)
  567.     {
  568.         ThreadDownloadImageData var3 = (ThreadDownloadImageData)this.urlToImageDataMap.get(par1Str);
  569.  
  570.         if (var3 == null)
  571.         {
  572.             this.urlToImageDataMap.put(par1Str, new ThreadDownloadImageData(par1Str, par2ImageBuffer));
  573.         }
  574.         else
  575.         {
  576.             ++var3.referenceCount;
  577.         }
  578.  
  579.         return var3;
  580.     }
  581.  
  582.     /**
  583.      * Decrements the reference count for a given URL, deleting the image data if the reference count hits 0
  584.      */
  585.     public void releaseImageData(String par1Str)
  586.     {
  587.         ThreadDownloadImageData var2 = (ThreadDownloadImageData)this.urlToImageDataMap.get(par1Str);
  588.  
  589.         if (var2 != null)
  590.         {
  591.             --var2.referenceCount;
  592.  
  593.             if (var2.referenceCount == 0)
  594.             {
  595.                 if (var2.textureName >= 0)
  596.                 {
  597.                     this.deleteTexture(var2.textureName);
  598.                 }
  599.  
  600.                 this.urlToImageDataMap.remove(par1Str);
  601.             }
  602.         }
  603.     }
  604.  
  605.     public void registerTextureFX(TextureFX par1TextureFX)
  606.     {
  607.         int var2 = this.getTextureId(par1TextureFX);
  608.  
  609.         for (int var3 = 0; var3 < this.textureList.size(); ++var3)
  610.         {
  611.             TextureFX var4 = (TextureFX)this.textureList.get(var3);
  612.             int var5 = this.getTextureId(var4);
  613.  
  614.             if (var5 == var2 && var4.iconIndex == par1TextureFX.iconIndex)
  615.             {
  616.                 this.textureList.remove(var3);
  617.                 --var3;
  618.                 Config.log("TextureFX removed: " + var4 + ", texId: " + var5 + ", index: " + var4.iconIndex);
  619.             }
  620.         }
  621.  
  622.         if (par1TextureFX instanceof TextureHDFX)
  623.         {
  624.             TextureHDFX var7 = (TextureHDFX)par1TextureFX;
  625.             var7.setTexturePackBase(this.texturePack.selectedTexturePack);
  626.             Dimension var6 = this.getTextureDimensions(var2);
  627.  
  628.             if (var6 != null)
  629.             {
  630.                 var7.setTileWidth(var6.width / 16);
  631.             }
  632.         }
  633.  
  634.         this.textureList.add(par1TextureFX);
  635.         par1TextureFX.onTick();
  636.         Config.log("TextureFX registered: " + par1TextureFX + ", texId: " + var2 + ", index: " + par1TextureFX.iconIndex);
  637.         this.dynamicTexturesUpdated = false;
  638.     }
  639.  
  640.     private int getTextureId(TextureFX var1)
  641.     {
  642.         Integer var2 = (Integer)this.textureFxMap.get(var1);
  643.  
  644.         if (var2 != null)
  645.         {
  646.             return var2.intValue();
  647.         }
  648.         else
  649.         {
  650.             int var3 = this.getBoundTexture();
  651.             var1.bindImage(this);
  652.             int var4 = this.getBoundTexture();
  653.             this.bindTexture(var3);
  654.             this.textureFxMap.put(var1, new Integer(var4));
  655.             return var4;
  656.         }
  657.     }
  658.  
  659.     private int getBoundTexture()
  660.     {
  661.         int var1 = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D);
  662.         return var1;
  663.     }
  664.  
  665.     private void generateMipMapsSub(int var1, int var2, int var3, int var4, ByteBuffer var5, int var6, boolean var7, String var8)
  666.     {
  667.         ByteBuffer var9 = var5;
  668.         byte[][] var10 = (byte[][])null;
  669.  
  670.         if (var8.length() > 0)
  671.         {
  672.             var10 = (byte[][])((byte[][])this.mipDataBufsMap.get(var8));
  673.  
  674.             if (var10 == null)
  675.             {
  676.                 var10 = new byte[17][];
  677.                 this.mipDataBufsMap.put(var8, var10);
  678.             }
  679.         }
  680.  
  681.         for (int var11 = 1; var11 <= 16; ++var11)
  682.         {
  683.             int var12 = var3 >> var11 - 1;
  684.             int var13 = var3 >> var11;
  685.             int var14 = var4 >> var11;
  686.             int var15 = var1 >> var11;
  687.             int var16 = var2 >> var11;
  688.  
  689.             if (var13 <= 0 || var14 <= 0)
  690.             {
  691.                 break;
  692.             }
  693.  
  694.             ByteBuffer var17 = this.mipImageDatas[var11 - 1];
  695.             var17.limit(var13 * var14 * 4);
  696.             byte[] var18 = null;
  697.  
  698.             if (var10 != null)
  699.             {
  700.                 var18 = var10[var11];
  701.             }
  702.  
  703.             if (var18 != null && var18.length != var13 * var14 * 4)
  704.             {
  705.                 var18 = null;
  706.             }
  707.  
  708.             int var19;
  709.             int var21;
  710.             int var20;
  711.             int var22;
  712.  
  713.             if (var18 == null)
  714.             {
  715.                 if (var10 != null)
  716.                 {
  717.                     var18 = new byte[var13 * var14 * 4];
  718.                 }
  719.  
  720.                 for (var19 = 0; var19 < var13; ++var19)
  721.                 {
  722.                     for (var20 = 0; var20 < var14; ++var20)
  723.                     {
  724.                         var21 = var9.getInt((var19 * 2 + 0 + (var20 * 2 + 0) * var12) * 4);
  725.                         var22 = var9.getInt((var19 * 2 + 1 + (var20 * 2 + 0) * var12) * 4);
  726.                         int var23 = var9.getInt((var19 * 2 + 1 + (var20 * 2 + 1) * var12) * 4);
  727.                         int var24 = var9.getInt((var19 * 2 + 0 + (var20 * 2 + 1) * var12) * 4);
  728.                         int var25;
  729.  
  730.                         if (var7)
  731.                         {
  732.                             var25 = this.averageColor(this.averageColor(var21, var22), this.averageColor(var23, var24));
  733.                         }
  734.                         else
  735.                         {
  736.                             var25 = this.alphaBlend(var21, var22, var23, var24);
  737.                         }
  738.  
  739.                         var17.putInt((var19 + var20 * var13) * 4, var25);
  740.                     }
  741.                 }
  742.  
  743.                 if (var10 != null)
  744.                 {
  745.                     var17.rewind();
  746.                     var17.get(var18);
  747.                     var10[var11] = var18;
  748.                 }
  749.             }
  750.  
  751.             if (var18 != null)
  752.             {
  753.                 var17.rewind();
  754.                 var17.put(var18);
  755.             }
  756.  
  757.             var17.rewind();
  758.  
  759.             for (var19 = 0; var19 < var6; ++var19)
  760.             {
  761.                 for (var20 = 0; var20 < var6; ++var20)
  762.                 {
  763.                     var21 = var19 * var13;
  764.                     var22 = var20 * var14;
  765.                     GL11.glTexSubImage2D(GL11.GL_TEXTURE_2D, var11, var15 + var21, var16 + var22, var13, var14, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, var17);
  766.                 }
  767.             }
  768.  
  769.             var9 = var17;
  770.         }
  771.     }
  772.  
  773.     public void updateDynamicTextures()
  774.     {
  775.         boolean var1 = useMipmaps && Config.isUseMipmaps();
  776.         this.checkHdTextures();
  777.         this.checkEntityTextures();
  778.         ++this.tickCounter;
  779.         this.terrainTextureId = this.getTexture("/terrain.png");
  780.         this.guiItemsTextureId = this.getTexture("/gui/items.png");
  781.         this.ctmTextureId = this.getTexture("/ctm.png");
  782.         StringBuffer var2 = new StringBuffer();
  783.         int var3 = -1;
  784.  
  785.         for (int var4 = 0; var4 < this.textureList.size(); ++var4)
  786.         {
  787.             TextureFX var5 = (TextureFX)this.textureList.get(var4);
  788.             var5.anaglyphEnabled = this.options.anaglyph;
  789.  
  790.             if (!var5.getClass().getName().equals("ModTextureStatic") || !this.dynamicTexturesUpdated)
  791.             {
  792.                 int var6 = this.getTextureId(var5);
  793.                 Dimension var7 = this.getTextureDimensions(var6);
  794.  
  795.                 if (var7 == null)
  796.                 {
  797.                     throw new IllegalArgumentException("Unknown dimensions for texture id: " + var6);
  798.                 }
  799.  
  800.                 int var8 = var7.width / 16;
  801.                 int var9 = var7.height / 16;
  802.                 this.checkImageDataSize(var7.width);
  803.                 this.imageData.limit(0);
  804.                 var2.setLength(0);
  805.                 boolean var10 = this.updateCustomTexture(var5, var6, this.imageData, var7.width / 16, var2);
  806.  
  807.                 if (!var10 || this.imageData.limit() > 0)
  808.                 {
  809.                     boolean var11;
  810.  
  811.                     if (this.imageData.limit() <= 0)
  812.                     {
  813.                         var11 = this.updateDefaultTexture(var5, var6, this.imageData, var7.width / 16, var2);
  814.  
  815.                         if (var11 && this.imageData.limit() <= 0)
  816.                         {
  817.                             continue;
  818.                         }
  819.                     }
  820.  
  821.                     if (this.imageData.limit() <= 0)
  822.                     {
  823.                         var5.onTick();
  824.  
  825.                         if (var5.imageData == null)
  826.                         {
  827.                             continue;
  828.                         }
  829.  
  830.                         int var17 = var8 * var9 * 4;
  831.  
  832.                         if (var5.imageData.length == var17)
  833.                         {
  834.                             this.imageData.clear();
  835.                             this.imageData.put(var5.imageData);
  836.                             this.imageData.position(0).limit(var5.imageData.length);
  837.                         }
  838.                         else
  839.                         {
  840.                             this.copyScaled(var5.imageData, this.imageData, var8);
  841.                         }
  842.                     }
  843.  
  844.                     if (var6 != var3)
  845.                     {
  846.                         var5.bindImage(this);
  847.                         var3 = var6;
  848.                     }
  849.  
  850.                     var11 = this.scalesWithFastColor(var5);
  851.  
  852.                     for (int var12 = 0; var12 < var5.tileSize; ++var12)
  853.                     {
  854.                         for (int var13 = 0; var13 < var5.tileSize; ++var13)
  855.                         {
  856.                             int var14 = var5.iconIndex % 16 * var8 + var12 * var8;
  857.                             int var15 = var5.iconIndex / 16 * var9 + var13 * var9;
  858.                             GL11.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, var14, var15, var8, var9, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, this.imageData);
  859.  
  860.                             if (var1 && var6 != this.guiItemsTextureId)
  861.                             {
  862.                                 String var16 = var2.toString();
  863.  
  864.                                 if (var12 == 0 && var13 == 0)
  865.                                 {
  866.                                     this.generateMipMapsSub(var14, var15, var8, var9, this.imageData, var5.tileSize, var11, var16);
  867.                                 }
  868.                             }
  869.                         }
  870.                     }
  871.                 }
  872.             }
  873.         }
  874.  
  875.         this.dynamicTexturesUpdated = true;
  876.     }
  877.  
  878.     private void checkEntityTextures()
  879.     {
  880.         if (Config.isRandomMobs())
  881.         {
  882.             World var1 = this.options.mc.theWorld;
  883.  
  884.             if (var1 != null)
  885.             {
  886.                 if (this.checkedEntityWorld != var1)
  887.                 {
  888.                     this.checkedEntityWorld = var1;
  889.                     this.checkedEntityId = -1;
  890.                 }
  891.  
  892.                 List var2 = this.options.mc.theWorld.getLoadedEntityList();
  893.                 int var3 = this.checkedEntityId;
  894.  
  895.                 for (int var4 = var2.size() - 1; var4 >= 0; --var4)
  896.                 {
  897.                     Entity var5 = (Entity)var2.get(var4);
  898.                     int var6 = var5.entityId;
  899.  
  900.                     if (var6 <= var3)
  901.                     {
  902.                         break;
  903.                     }
  904.  
  905.                     if (var6 > this.checkedEntityId)
  906.                     {
  907.                         this.checkedEntityId = var6;
  908.                     }
  909.  
  910.                     if (var5 instanceof EntityLiving)
  911.                     {
  912.                         EntityLiving var7 = (EntityLiving)var5;
  913.                         var7.texture = this.getRandomTexture(var7.texture, var7.entityId);
  914.                     }
  915.                 }
  916.             }
  917.         }
  918.     }
  919.  
  920.     private void resetEntityTextures()
  921.     {
  922.         this.checkedEntityWorld = null;
  923.         this.checkedEntityId = -1;
  924.         this.textureVariantsMap.clear();
  925.  
  926.         if (this.options != null)
  927.         {
  928.             if (this.options.mc != null)
  929.             {
  930.                 if (this.options.mc.theWorld != null)
  931.                 {
  932.                     if (this.options.mc.theWorld.getLoadedEntityList() != null)
  933.                     {
  934.                         List var1 = this.options.mc.theWorld.getLoadedEntityList();
  935.  
  936.                         for (int var2 = 0; var2 < var1.size(); ++var2)
  937.                         {
  938.                             Entity var3 = (Entity)var1.get(var2);
  939.  
  940.                             if (var3 instanceof EntityLiving)
  941.                             {
  942.                                 EntityLiving var4 = (EntityLiving)var3;
  943.                                 this.resetEntityTexture(var4);
  944.                             }
  945.                         }
  946.                     }
  947.                 }
  948.             }
  949.         }
  950.     }
  951.  
  952.     private void resetEntityTexture(EntityLiving var1)
  953.     {
  954.         if (!(var1 instanceof EntityPlayer))
  955.         {
  956.             String var2 = var1.texture;
  957.  
  958.             if (var2 != null)
  959.             {
  960.                 int var3 = var2.lastIndexOf(46);
  961.  
  962.                 if (var3 >= 0)
  963.                 {
  964.                     String var4 = var2.substring(0, var3);
  965.                     String var5 = var2.substring(var3);
  966.                     int var6 = var4.length() - 1;
  967.  
  968.                     for (int var7 = var6; var7 >= 0; --var7)
  969.                     {
  970.                         char var8 = var4.charAt(var7);
  971.  
  972.                         if (!Character.isDigit(var8))
  973.                         {
  974.                             if (var7 == var6)
  975.                             {
  976.                                 return;
  977.                             }
  978.  
  979.                             var4 = var4.substring(0, var7 + 1);
  980.                             break;
  981.                         }
  982.                     }
  983.  
  984.                     var2 = var4 + var5;
  985.                     var1.texture = var2;
  986.                 }
  987.             }
  988.         }
  989.     }
  990.  
  991.     private String getRandomTexture(String var1, int var2)
  992.     {
  993.         int var3 = var1.lastIndexOf(46);
  994.  
  995.         if (var3 < 0)
  996.         {
  997.             return var1;
  998.         }
  999.         else
  1000.         {
  1001.             String var4 = var1.substring(0, var3);
  1002.             String var5 = var1.substring(var3);
  1003.             int var6 = this.getCountTextureVariants(var1, var4, var5);
  1004.  
  1005.             if (var6 <= 1)
  1006.             {
  1007.                 return var1;
  1008.             }
  1009.             else
  1010.             {
  1011.                 Random var7 = new Random((long)var2);
  1012.                 int var8 = var7.nextInt(var6);
  1013.  
  1014.                 if (var8 <= 0)
  1015.                 {
  1016.                     return var1;
  1017.                 }
  1018.                 else
  1019.                 {
  1020.                     String var9 = var4 + (var8 + 1) + var5;
  1021.                     return var9;
  1022.                 }
  1023.             }
  1024.         }
  1025.     }
  1026.  
  1027.     private int getCountTextureVariants(String var1, String var2, String var3)
  1028.     {
  1029.         Integer var4 = (Integer)this.textureVariantsMap.get(var1);
  1030.  
  1031.         if (var4 != null)
  1032.         {
  1033.             return var4.intValue();
  1034.         }
  1035.         else
  1036.         {
  1037.             var4 = new Integer(1);
  1038.  
  1039.             for (int var5 = 2; var5 < 100; ++var5)
  1040.             {
  1041.                 String var6 = var2 + var5 + var3;
  1042.                 byte[] var7 = this.getCustomTextureData(var6, -1);
  1043.  
  1044.                 if (var7 == null)
  1045.                 {
  1046.                     var4 = new Integer(var5 - 1);
  1047.                     break;
  1048.                 }
  1049.             }
  1050.  
  1051.             this.textureVariantsMap.put(var1, var4);
  1052.  
  1053.             if (var4.intValue() > 1)
  1054.             {
  1055.                 Config.log("RandomMob texture: " + var1 + ", variants: " + var4.intValue());
  1056.             }
  1057.  
  1058.             return var4.intValue();
  1059.         }
  1060.     }
  1061.  
  1062.     private int averageColor(int var1, int var2)
  1063.     {
  1064.         int var3 = (var1 & -16777216) >> 24 & 255;
  1065.         int var4 = (var2 & -16777216) >> 24 & 255;
  1066.         return (var3 + var4 >> 1 << 24) + ((var1 & 16711422) + (var2 & 16711422) >> 1);
  1067.     }
  1068.  
  1069.     private int alphaBlend(int var1, int var2, int var3, int var4)
  1070.     {
  1071.         int var5 = this.alphaBlend(var1, var2);
  1072.         int var6 = this.alphaBlend(var3, var4);
  1073.         int var7 = this.alphaBlend(var5, var6);
  1074.         return var7;
  1075.     }
  1076.  
  1077.     /**
  1078.      * Uses the alpha of the two colors passed in to determine the contributions of each color.  If either of them has
  1079.      * an alpha greater than 0 then the returned alpha is 255 otherwise its zero if they are both zero. Args: color1,
  1080.      * color2
  1081.      */
  1082.     private int alphaBlend(int par1, int par2)
  1083.     {
  1084.         int var3 = (par1 & -16777216) >> 24 & 255;
  1085.         int var4 = (par2 & -16777216) >> 24 & 255;
  1086.         int var5 = (var3 + var4) / 2;
  1087.  
  1088.         if (var3 == 0 && var4 == 0)
  1089.         {
  1090.             var3 = 1;
  1091.             var4 = 1;
  1092.         }
  1093.         else
  1094.         {
  1095.             if (var3 == 0)
  1096.             {
  1097.                 par1 = par2;
  1098.                 var5 /= 2;
  1099.             }
  1100.  
  1101.             if (var4 == 0)
  1102.             {
  1103.                 par2 = par1;
  1104.                 var5 /= 2;
  1105.             }
  1106.         }
  1107.  
  1108.         int var6 = (par1 >> 16 & 255) * var3;
  1109.         int var7 = (par1 >> 8 & 255) * var3;
  1110.         int var8 = (par1 & 255) * var3;
  1111.         int var9 = (par2 >> 16 & 255) * var4;
  1112.         int var10 = (par2 >> 8 & 255) * var4;
  1113.         int var11 = (par2 & 255) * var4;
  1114.         int var12 = (var6 + var9) / (var3 + var4);
  1115.         int var13 = (var7 + var10) / (var3 + var4);
  1116.         int var14 = (var8 + var11) / (var3 + var4);
  1117.         return var5 << 24 | var12 << 16 | var13 << 8 | var14;
  1118.     }
  1119.  
  1120.     /**
  1121.      * Call setupTexture on all currently-loaded textures again to account for changes in rendering options
  1122.      */
  1123.     public void refreshTextures()
  1124.     {
  1125.         this.textureDataMap.clear();
  1126.         this.textureFxMap.clear();
  1127.         this.dynamicTexturesUpdated = false;
  1128.         Config.setTextureUpdateTime(System.currentTimeMillis());
  1129.         this.resetEntityTextures();
  1130.         this.mipDataBufsMap.clear();
  1131.         TexturePackBase var1 = this.texturePack.selectedTexturePack;
  1132.         Iterator var4 = this.textureNameToImageMap.getKeySet().iterator();
  1133.  
  1134.         while (var4.hasNext())
  1135.         {
  1136.             int var2 = ((Integer)var4.next()).intValue();
  1137.             BufferedImage var3 = (BufferedImage)this.textureNameToImageMap.lookup(var2);
  1138.             this.setupTexture(var3, var2);
  1139.         }
  1140.  
  1141.         ThreadDownloadImageData var5;
  1142.  
  1143.         for (var4 = this.urlToImageDataMap.values().iterator(); var4.hasNext(); var5.textureSetupComplete = false)
  1144.         {
  1145.             var5 = (ThreadDownloadImageData)var4.next();
  1146.         }
  1147.  
  1148.         var4 = this.textureMap.keySet().iterator();
  1149.         BufferedImage var6;
  1150.         String var10;
  1151.  
  1152.         while (var4.hasNext())
  1153.         {
  1154.             var10 = (String)var4.next();
  1155.  
  1156.             try
  1157.             {
  1158.                 if (var10.startsWith("##"))
  1159.                 {
  1160.                     var6 = this.unwrapImageByColumns(this.readTextureImage(var1.getResourceAsStream(var10.substring(2))));
  1161.                 }
  1162.                 else if (var10.startsWith("%clamp%"))
  1163.                 {
  1164.                     this.clampTexture = true;
  1165.                     var6 = this.readTextureImage(var1.getResourceAsStream(var10.substring(7)));
  1166.                 }
  1167.                 else if (var10.startsWith("%blur%"))
  1168.                 {
  1169.                     this.blurTexture = true;
  1170.                     var6 = this.readTextureImage(var1.getResourceAsStream(var10.substring(6)));
  1171.                 }
  1172.                 else if (var10.startsWith("%blurclamp%"))
  1173.                 {
  1174.                     this.blurTexture = true;
  1175.                     this.clampTexture = true;
  1176.                     var6 = this.readTextureImage(var1.getResourceAsStream(var10.substring(11)));
  1177.                 }
  1178.                 else
  1179.                 {
  1180.                     var6 = this.readTextureImage(var1.getResourceAsStream(var10));
  1181.                 }
  1182.  
  1183.                 int var7 = ((Integer)this.textureMap.get(var10)).intValue();
  1184.                 this.setupTexture(var6, var7);
  1185.                 this.blurTexture = false;
  1186.                 this.clampTexture = false;
  1187.             }
  1188.             catch (Exception var9)
  1189.             {
  1190.                 if (!"input == null!".equals(var9.getMessage()))
  1191.                 {
  1192.                     var9.printStackTrace();
  1193.                 }
  1194.             }
  1195.         }
  1196.  
  1197.         var4 = this.textureContentsMap.keySet().iterator();
  1198.  
  1199.         while (var4.hasNext())
  1200.         {
  1201.             var10 = (String)var4.next();
  1202.  
  1203.             try
  1204.             {
  1205.                 if (var10.startsWith("##"))
  1206.                 {
  1207.                     var6 = this.unwrapImageByColumns(this.readTextureImage(var1.getResourceAsStream(var10.substring(2))));
  1208.                 }
  1209.                 else if (var10.startsWith("%clamp%"))
  1210.                 {
  1211.                     this.clampTexture = true;
  1212.                     var6 = this.readTextureImage(var1.getResourceAsStream(var10.substring(7)));
  1213.                 }
  1214.                 else if (var10.startsWith("%blur%"))
  1215.                 {
  1216.                     this.blurTexture = true;
  1217.                     var6 = this.readTextureImage(var1.getResourceAsStream(var10.substring(6)));
  1218.                 }
  1219.                 else
  1220.                 {
  1221.                     var6 = this.readTextureImage(var1.getResourceAsStream(var10));
  1222.                 }
  1223.  
  1224.                 this.getImageContents(var6, (int[])((int[])this.textureContentsMap.get(var10)));
  1225.                 this.blurTexture = false;
  1226.                 this.clampTexture = false;
  1227.             }
  1228.             catch (Exception var8)
  1229.             {
  1230.                 if (!"input == null!".equals(var8.getMessage()))
  1231.                 {
  1232.                     var8.printStackTrace();
  1233.                 }
  1234.             }
  1235.         }
  1236.  
  1237.         this.registerCustomTexturesFX();
  1238.         CustomColorizer.update(this);
  1239.         this.updateDynamicTextures();
  1240.     }
  1241.  
  1242.     /**
  1243.      * Returns a BufferedImage read off the provided input stream.  Args: inputStream
  1244.      */
  1245.     private BufferedImage readTextureImage(InputStream par1InputStream) throws IOException
  1246.     {
  1247.         BufferedImage var2 = ImageIO.read(par1InputStream);
  1248.         par1InputStream.close();
  1249.         return var2;
  1250.     }
  1251.  
  1252.     public void bindTexture(int par1)
  1253.     {
  1254.         if (par1 >= 0)
  1255.         {
  1256.             GL11.glBindTexture(GL11.GL_TEXTURE_2D, par1);
  1257.         }
  1258.     }
  1259.  
  1260.     private void setTextureDimension(int var1, Dimension var2)
  1261.     {
  1262.         this.textureDimensionsMap.put(new Integer(var1), var2);
  1263.  
  1264.         if (var1 == this.terrainTextureId)
  1265.         {
  1266.             Config.setIconWidthTerrain(var2.width / 16);
  1267.         }
  1268.  
  1269.         if (var1 == this.guiItemsTextureId)
  1270.         {
  1271.             Config.setIconWidthItems(var2.width / 16);
  1272.         }
  1273.  
  1274.         this.updateDinamicTextures(var1, var2);
  1275.     }
  1276.  
  1277.     private Dimension getTextureDimensions(int var1)
  1278.     {
  1279.         Dimension var2 = (Dimension)this.textureDimensionsMap.get(new Integer(var1));
  1280.         return var2;
  1281.     }
  1282.  
  1283.     private void updateDinamicTextures(int var1, Dimension var2)
  1284.     {
  1285.         for (int var3 = 0; var3 < this.textureList.size(); ++var3)
  1286.         {
  1287.             TextureFX var4 = (TextureFX)this.textureList.get(var3);
  1288.             int var5 = this.getTextureId(var4);
  1289.  
  1290.             if (var5 == var1 && var4 instanceof TextureHDFX)
  1291.             {
  1292.                 TextureHDFX var6 = (TextureHDFX)var4;
  1293.                 var6.setTexturePackBase(this.texturePack.selectedTexturePack);
  1294.                 var6.setTileWidth(var2.width / 16);
  1295.                 var6.onTick();
  1296.             }
  1297.         }
  1298.     }
  1299.  
  1300.     public boolean updateCustomTexture(TextureFX var1, int var2, ByteBuffer var3, int var4, StringBuffer var5)
  1301.     {
  1302.         if (var2 == this.terrainTextureId)
  1303.         {
  1304.             if (var1.iconIndex == Block.waterStill.blockIndexInTexture)
  1305.             {
  1306.                 if (Config.isGeneratedWater())
  1307.                 {
  1308.                     return false;
  1309.                 }
  1310.  
  1311.                 return this.updateCustomTexture(var1, "/custom_water_still.png", var3, var4, Config.isAnimatedWater(), 1, var5);
  1312.             }
  1313.  
  1314.             if (var1.iconIndex == Block.waterStill.blockIndexInTexture + 1)
  1315.             {
  1316.                 if (Config.isGeneratedWater())
  1317.                 {
  1318.                     return false;
  1319.                 }
  1320.  
  1321.                 return this.updateCustomTexture(var1, "/custom_water_flowing.png", var3, var4, Config.isAnimatedWater(), 1, var5);
  1322.             }
  1323.  
  1324.             if (var1.iconIndex == Block.lavaStill.blockIndexInTexture)
  1325.             {
  1326.                 if (Config.isGeneratedLava())
  1327.                 {
  1328.                     return false;
  1329.                 }
  1330.  
  1331.                 return this.updateCustomTexture(var1, "/custom_lava_still.png", var3, var4, Config.isAnimatedLava(), 1, var5);
  1332.             }
  1333.  
  1334.             if (var1.iconIndex == Block.lavaStill.blockIndexInTexture + 1)
  1335.             {
  1336.                 if (Config.isGeneratedLava())
  1337.                 {
  1338.                     return false;
  1339.                 }
  1340.  
  1341.                 return this.updateCustomTexture(var1, "/custom_lava_flowing.png", var3, var4, Config.isAnimatedLava(), 1, var5);
  1342.             }
  1343.  
  1344.             if (var1.iconIndex == Block.portal.blockIndexInTexture)
  1345.             {
  1346.                 return this.updateCustomTexture(var1, "/custom_portal.png", var3, var4, Config.isAnimatedPortal(), 1, var5);
  1347.             }
  1348.  
  1349.             if (var1.iconIndex == Block.fire.blockIndexInTexture)
  1350.             {
  1351.                 return this.updateCustomTexture(var1, "/custom_fire_n_s.png", var3, var4, Config.isAnimatedFire(), 1, var5);
  1352.             }
  1353.  
  1354.             if (var1.iconIndex == Block.fire.blockIndexInTexture + 16)
  1355.             {
  1356.                 return this.updateCustomTexture(var1, "/custom_fire_e_w.png", var3, var4, Config.isAnimatedFire(), 1, var5);
  1357.             }
  1358.  
  1359.             if (Config.isAnimatedTerrain())
  1360.             {
  1361.                 return this.updateCustomTexture(var1, "/custom_terrain_" + var1.iconIndex + ".png", var3, var4, Config.isAnimatedTerrain(), 1, var5);
  1362.             }
  1363.         }
  1364.  
  1365.         return var2 == this.guiItemsTextureId && Config.isAnimatedItems() ? this.updateCustomTexture(var1, "/custom_item_" + var1.iconIndex + ".png", var3, var4, Config.isAnimatedTerrain(), 1, var5) : false;
  1366.     }
  1367.  
  1368.     private boolean updateDefaultTexture(TextureFX var1, int var2, ByteBuffer var3, int var4, StringBuffer var5)
  1369.     {
  1370.         return var2 != this.terrainTextureId ? false : (this.texturePack.selectedTexturePack instanceof TexturePackDefault ? false : (var1.iconIndex == Block.waterStill.blockIndexInTexture ? (Config.isGeneratedWater() ? false : this.updateDefaultTexture(var1, var3, var4, false, 1, var5)) : (var1.iconIndex == Block.waterStill.blockIndexInTexture + 1 ? (Config.isGeneratedWater() ? false : this.updateDefaultTexture(var1, var3, var4, Config.isAnimatedWater(), 1, var5)) : (var1.iconIndex == Block.lavaStill.blockIndexInTexture ? (Config.isGeneratedLava() ? false : this.updateDefaultTexture(var1, var3, var4, false, 1, var5)) : (var1.iconIndex == Block.lavaStill.blockIndexInTexture + 1 ? (Config.isGeneratedLava() ? false : this.updateDefaultTexture(var1, var3, var4, Config.isAnimatedLava(), 3, var5)) : false)))));
  1371.     }
  1372.  
  1373.     private boolean updateDefaultTexture(TextureFX var1, ByteBuffer var2, int var3, boolean var4, int var5, StringBuffer var6)
  1374.     {
  1375.         int var7 = var1.iconIndex;
  1376.  
  1377.         if (!var4 && this.dynamicTexturesUpdated)
  1378.         {
  1379.             return true;
  1380.         }
  1381.         else
  1382.         {
  1383.             byte[] var8 = this.getTerrainIconData(var7, var3, var6);
  1384.  
  1385.             if (var8 == null)
  1386.             {
  1387.                 return false;
  1388.             }
  1389.             else
  1390.             {
  1391.                 var2.clear();
  1392.                 int var9 = var8.length;
  1393.  
  1394.                 if (var4)
  1395.                 {
  1396.                     int var10 = var3 - this.tickCounter / var5 % var3;
  1397.                     int var11 = var10 * var3 * 4;
  1398.                     var2.put(var8, var11, var9 - var11);
  1399.                     var2.put(var8, 0, var11);
  1400.                     var6.append(":");
  1401.                     var6.append(var10);
  1402.                 }
  1403.                 else
  1404.                 {
  1405.                     var2.put(var8, 0, var9);
  1406.                 }
  1407.  
  1408.                 var2.position(0).limit(var9);
  1409.                 return true;
  1410.             }
  1411.         }
  1412.     }
  1413.  
  1414.     private boolean updateCustomTexture(TextureFX var1, String var2, ByteBuffer var3, int var4, boolean var5, int var6, StringBuffer var7)
  1415.     {
  1416.         byte[] var8 = this.getCustomTextureData(var2, var4);
  1417.  
  1418.         if (var8 == null)
  1419.         {
  1420.             return false;
  1421.         }
  1422.         else if (!var5 && this.dynamicTexturesUpdated)
  1423.         {
  1424.             return true;
  1425.         }
  1426.         else
  1427.         {
  1428.             int var9 = var4 * var4 * 4;
  1429.  
  1430.             if (var8.length < var9)
  1431.             {
  1432.                 return false;
  1433.             }
  1434.             else
  1435.             {
  1436.                 int var10 = var8.length / var9;
  1437.                 int var11 = this.tickCounter / var6 % var10;
  1438.                 int var12 = 0;
  1439.  
  1440.                 if (var5)
  1441.                 {
  1442.                     var12 = var9 * var11;
  1443.                 }
  1444.  
  1445.                 var3.clear();
  1446.                 var3.put(var8, var12, var9);
  1447.                 var3.position(0).limit(var9);
  1448.                 var7.append(var2);
  1449.                 var7.append(":");
  1450.                 var7.append(var11);
  1451.                 return true;
  1452.             }
  1453.         }
  1454.     }
  1455.  
  1456.     private byte[] getTerrainIconData(int var1, int var2, StringBuffer var3)
  1457.     {
  1458.         String var4 = "Tile-" + var1;
  1459.         byte[] var5 = this.getCustomTextureData(var4, var2);
  1460.  
  1461.         if (var5 != null)
  1462.         {
  1463.             var3.append(var4);
  1464.             return var5;
  1465.         }
  1466.         else
  1467.         {
  1468.             byte[] var6 = this.getCustomTextureData("/terrain.png", var2 * 16);
  1469.  
  1470.             if (var6 == null)
  1471.             {
  1472.                 return null;
  1473.             }
  1474.             else
  1475.             {
  1476.                 var5 = new byte[var2 * var2 * 4];
  1477.                 int var7 = var1 % 16;
  1478.                 int var8 = var1 / 16;
  1479.                 int var9 = var7 * var2;
  1480.                 int var10 = var8 * var2;
  1481.                 int var10000 = var9 + var2;
  1482.                 var10000 = var10 + var2;
  1483.  
  1484.                 for (int var13 = 0; var13 < var2; ++var13)
  1485.                 {
  1486.                     int var14 = var10 + var13;
  1487.  
  1488.                     for (int var15 = 0; var15 < var2; ++var15)
  1489.                     {
  1490.                         int var16 = var9 + var15;
  1491.                         int var17 = 4 * (var16 + var14 * var2 * 16);
  1492.                         int var18 = 4 * (var15 + var13 * var2);
  1493.                         var5[var18 + 0] = var6[var17 + 0];
  1494.                         var5[var18 + 1] = var6[var17 + 1];
  1495.                         var5[var18 + 2] = var6[var17 + 2];
  1496.                         var5[var18 + 3] = var6[var17 + 3];
  1497.                     }
  1498.                 }
  1499.  
  1500.                 this.setCustomTextureData(var4, var5);
  1501.                 var3.append(var4);
  1502.                 return var5;
  1503.             }
  1504.         }
  1505.     }
  1506.  
  1507.     public byte[] getCustomTextureData(String var1, int var2)
  1508.     {
  1509.         byte[] var3 = (byte[])((byte[])this.textureDataMap.get(var1));
  1510.  
  1511.         if (var3 == null)
  1512.         {
  1513.             if (this.textureDataMap.containsKey(var1))
  1514.             {
  1515.                 return null;
  1516.             }
  1517.  
  1518.             var3 = this.loadImage(var1, var2);
  1519.  
  1520.             if (var3 == null)
  1521.             {
  1522.                 var3 = this.loadImage("/anim" + var1, var2);
  1523.             }
  1524.  
  1525.             this.textureDataMap.put(var1, var3);
  1526.         }
  1527.  
  1528.         return var3;
  1529.     }
  1530.  
  1531.     private void setCustomTextureData(String var1, byte[] var2)
  1532.     {
  1533.         this.textureDataMap.put(var1, var2);
  1534.     }
  1535.  
  1536.     private byte[] loadImage(String var1, int var2)
  1537.     {
  1538.         try
  1539.         {
  1540.             TexturePackBase var3 = this.texturePack.selectedTexturePack;
  1541.  
  1542.             if (var3 == null)
  1543.             {
  1544.                 return null;
  1545.             }
  1546.             else
  1547.             {
  1548.                 InputStream var4 = var3.getResourceAsStream(var1);
  1549.  
  1550.                 if (var4 == null)
  1551.                 {
  1552.                     return null;
  1553.                 }
  1554.                 else
  1555.                 {
  1556.                     BufferedImage var5 = this.readTextureImage(var4);
  1557.  
  1558.                     if (var5 == null)
  1559.                     {
  1560.                         return null;
  1561.                     }
  1562.                     else
  1563.                     {
  1564.                         if (var2 > 0 && var5.getWidth() != var2)
  1565.                         {
  1566.                             double var6 = (double)(var5.getHeight() / var5.getWidth());
  1567.                             int var8 = (int)((double)var2 * var6);
  1568.                             var5 = scaleBufferedImage(var5, var2, var8);
  1569.                         }
  1570.  
  1571.                         int var19 = var5.getWidth();
  1572.                         int var7 = var5.getHeight();
  1573.                         int[] var20 = new int[var19 * var7];
  1574.                         byte[] var9 = new byte[var19 * var7 * 4];
  1575.                         var5.getRGB(0, 0, var19, var7, var20, 0, var19);
  1576.  
  1577.                         for (int var10 = 0; var10 < var20.length; ++var10)
  1578.                         {
  1579.                             int var11 = var20[var10] >> 24 & 255;
  1580.                             int var12 = var20[var10] >> 16 & 255;
  1581.                             int var13 = var20[var10] >> 8 & 255;
  1582.                             int var14 = var20[var10] & 255;
  1583.  
  1584.                             if (this.options != null && this.options.anaglyph)
  1585.                             {
  1586.                                 int var15 = (var12 * 30 + var13 * 59 + var14 * 11) / 100;
  1587.                                 int var16 = (var12 * 30 + var13 * 70) / 100;
  1588.                                 int var17 = (var12 * 30 + var14 * 70) / 100;
  1589.                                 var12 = var15;
  1590.                                 var13 = var16;
  1591.                                 var14 = var17;
  1592.                             }
  1593.  
  1594.                             var9[var10 * 4 + 0] = (byte)var12;
  1595.                             var9[var10 * 4 + 1] = (byte)var13;
  1596.                             var9[var10 * 4 + 2] = (byte)var14;
  1597.                             var9[var10 * 4 + 3] = (byte)var11;
  1598.                         }
  1599.  
  1600.                         return var9;
  1601.                     }
  1602.                 }
  1603.             }
  1604.         }
  1605.         catch (Exception var18)
  1606.         {
  1607.             var18.printStackTrace();
  1608.             return null;
  1609.         }
  1610.     }
  1611.  
  1612.     public static BufferedImage scaleBufferedImage(BufferedImage var0, int var1, int var2)
  1613.     {
  1614.         BufferedImage var3 = new BufferedImage(var1, var2, 2);
  1615.         Graphics2D var4 = var3.createGraphics();
  1616.         var4.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
  1617.         var4.drawImage(var0, 0, 0, var1, var2, (ImageObserver)null);
  1618.         return var3;
  1619.     }
  1620.  
  1621.     private void checkImageDataSize(int var1)
  1622.     {
  1623.         if (this.imageData != null)
  1624.         {
  1625.             int var2 = var1 * var1 * 4;
  1626.  
  1627.             if (this.imageData.capacity() >= var2)
  1628.             {
  1629.                 return;
  1630.             }
  1631.         }
  1632.  
  1633.         this.allocateImageData(var1);
  1634.     }
  1635.  
  1636.     private void allocateImageData(int var1)
  1637.     {
  1638.         int var2 = var1 * var1 * 4;
  1639.         this.imageData = GLAllocation.createDirectByteBuffer(var2);
  1640.         ArrayList var3 = new ArrayList();
  1641.  
  1642.         for (int var4 = var1 / 2; var4 > 0; var4 /= 2)
  1643.         {
  1644.             int var5 = var4 * var4 * 4;
  1645.             ByteBuffer var6 = GLAllocation.createDirectByteBuffer(var5);
  1646.             var3.add(var6);
  1647.         }
  1648.  
  1649.         this.mipImageDatas = (ByteBuffer[])((ByteBuffer[])var3.toArray(new ByteBuffer[var3.size()]));
  1650.     }
  1651.  
  1652.     public void checkHdTextures()
  1653.     {
  1654.         if (!this.hdTexturesInstalled)
  1655.         {
  1656.             Minecraft var1 = Config.getMinecraft();
  1657.  
  1658.             if (var1 != null)
  1659.             {
  1660.                 this.hdTexturesInstalled = true;
  1661.                 this.registerTextureFX(new TextureHDLavaFX());
  1662.                 this.registerTextureFX(new TextureHDWaterFX());
  1663.                 this.registerTextureFX(new TextureHDPortalFX());
  1664.                 this.registerTextureFX(new TextureHDWaterFlowFX());
  1665.                 this.registerTextureFX(new TextureHDLavaFlowFX());
  1666.                 this.registerTextureFX(new TextureHDFlamesFX(0));
  1667.                 this.registerTextureFX(new TextureHDFlamesFX(1));
  1668.                 this.registerTextureFX(new TextureHDCompassFX(var1));
  1669.                 this.registerTextureFX(new TextureHDWatchFX(var1));
  1670.                 this.registerCustomTexturesFX();
  1671.                 CustomColorizer.update(this);
  1672.             }
  1673.         }
  1674.     }
  1675.  
  1676.     private void registerCustomTexturesFX()
  1677.     {
  1678.         TextureFX[] var1 = this.getRegisteredTexturesFX(TextureHDCustomFX.class);
  1679.         int var2;
  1680.  
  1681.         for (var2 = 0; var2 < var1.length; ++var2)
  1682.         {
  1683.             TextureFX var3 = var1[var2];
  1684.             this.unregisterTextureFX(var3);
  1685.         }
  1686.  
  1687.         if (Config.isAnimatedTerrain())
  1688.         {
  1689.             for (var2 = 0; var2 < 256; ++var2)
  1690.             {
  1691.                 this.registerCustomTextureFX("/custom_terrain_" + var2 + ".png", var2, 0);
  1692.             }
  1693.         }
  1694.  
  1695.         if (Config.isAnimatedItems())
  1696.         {
  1697.             for (var2 = 0; var2 < 256; ++var2)
  1698.             {
  1699.                 this.registerCustomTextureFX("/custom_item_" + var2 + ".png", var2, 1);
  1700.             }
  1701.         }
  1702.     }
  1703.  
  1704.     private void unregisterTextureFX(TextureFX var1)
  1705.     {
  1706.         for (int var2 = 0; var2 < this.textureList.size(); ++var2)
  1707.         {
  1708.             TextureFX var3 = (TextureFX)this.textureList.get(var2);
  1709.  
  1710.             if (var3 == var1)
  1711.             {
  1712.                 this.textureList.remove(var2);
  1713.                 --var2;
  1714.             }
  1715.         }
  1716.     }
  1717.  
  1718.     private TextureFX[] getRegisteredTexturesFX(Class var1)
  1719.     {
  1720.         ArrayList var2 = new ArrayList();
  1721.  
  1722.         for (int var3 = 0; var3 < this.textureList.size(); ++var3)
  1723.         {
  1724.             TextureFX var4 = (TextureFX)this.textureList.get(var3);
  1725.  
  1726.             if (var1.isAssignableFrom(var4.getClass()))
  1727.             {
  1728.                 var2.add(var4);
  1729.             }
  1730.         }
  1731.  
  1732.         TextureFX[] var5 = (TextureFX[])((TextureFX[])var2.toArray(new TextureFX[var2.size()]));
  1733.         return var5;
  1734.     }
  1735.  
  1736.     private void registerCustomTextureFX(String var1, int var2, int var3)
  1737.     {
  1738.         Object var4 = null;
  1739.         byte[] var5;
  1740.  
  1741.         if (var3 == 0)
  1742.         {
  1743.             var5 = this.getCustomTextureData(var1, Config.getIconWidthTerrain());
  1744.         }
  1745.         else
  1746.         {
  1747.             var5 = this.getCustomTextureData(var1, Config.getIconWidthItems());
  1748.         }
  1749.  
  1750.         if (var5 != null)
  1751.         {
  1752.             this.registerTextureFX(new TextureHDCustomFX(var2, var3));
  1753.         }
  1754.     }
  1755.  
  1756.     private int getMaxMipmapLevel(int var1)
  1757.     {
  1758.         int var2;
  1759.  
  1760.         for (var2 = 0; var1 > 0; ++var2)
  1761.         {
  1762.             var1 /= 2;
  1763.         }
  1764.  
  1765.         return var2 - 1;
  1766.     }
  1767.  
  1768.     private void copyScaled(byte[] var1, ByteBuffer var2, int var3)
  1769.     {
  1770.         int var4 = (int)Math.sqrt((double)(var1.length / 4));
  1771.         int var5 = var3 / var4;
  1772.         byte[] var6 = new byte[4];
  1773.         int var7 = var3 * var3;
  1774.         var2.clear();
  1775.  
  1776.         if (var5 > 1)
  1777.         {
  1778.             for (int var8 = 0; var8 < var4; ++var8)
  1779.             {
  1780.                 int var9 = var8 * var4;
  1781.                 int var10 = var8 * var5;
  1782.                 int var11 = var10 * var3;
  1783.  
  1784.                 for (int var12 = 0; var12 < var4; ++var12)
  1785.                 {
  1786.                     int var13 = (var12 + var9) * 4;
  1787.                     var6[0] = var1[var13];
  1788.                     var6[1] = var1[var13 + 1];
  1789.                     var6[2] = var1[var13 + 2];
  1790.                     var6[3] = var1[var13 + 3];
  1791.                     int var14 = var12 * var5;
  1792.                     int var15 = var14 + var11;
  1793.  
  1794.                     for (int var16 = 0; var16 < var5; ++var16)
  1795.                     {
  1796.                         int var17 = var15 + var16 * var3;
  1797.                         var2.position(var17 * 4);
  1798.  
  1799.                         for (int var18 = 0; var18 < var5; ++var18)
  1800.                         {
  1801.                             var2.put(var6);
  1802.                         }
  1803.                     }
  1804.                 }
  1805.             }
  1806.         }
  1807.  
  1808.         var2.position(0).limit(var3 * var3 * 4);
  1809.     }
  1810.  
  1811.     private boolean scalesWithFastColor(TextureFX var1)
  1812.     {
  1813.         return !var1.getClass().getName().equals("ModTextureStatic");
  1814.     }
  1815.  
  1816.     public TexturePackList getTexturePack()
  1817.     {
  1818.         return this.texturePack;
  1819.     }
  1820. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement