001    package net.minecraft.client.renderer.texturefx;
002    
003    import cpw.mods.fml.client.FMLTextureFX;
004    import cpw.mods.fml.relauncher.Side;
005    import cpw.mods.fml.relauncher.SideOnly;
006    import net.minecraft.block.Block;
007    
008    @SideOnly(Side.CLIENT)
009    public class TextureFlamesFX extends FMLTextureFX
010    {
011        protected float[] field_76869_g = new float[320];
012        protected float[] field_76870_h = new float[320];
013        private int fireTileSize = 20;
014        private int fireGridSize = 320;
015    
016        public TextureFlamesFX(int par1)
017        {
018            super(Block.fire.blockIndexInTexture + par1 * 16);
019            setup();
020        }
021    
022        @Override
023        public void setup()
024        {
025            super.setup();
026            fireTileSize = tileSizeBase + (tileSizeBase >> 2);
027            fireGridSize = fireTileSize * tileSizeBase;
028            field_76869_g = new float[fireGridSize];
029            field_76870_h = new float[fireGridSize];
030        }
031    
032        public void onTick()
033        {
034            int var3;
035            float var4;
036            int var6;
037            float fireFactor1 = 3.0F + (float)(tileSizeBase >> 4);
038            float fireFactor2 = 1.01F + (0.8F / tileSizeBase);
039    
040            for (int var1 = 0; var1 < tileSizeBase; ++var1)
041            {
042                for (int var2 = 0; var2 < fireTileSize; ++var2)
043                {
044                    var3 = fireTileSize - (tileSizeBase >> 3);
045                    var4 = this.field_76869_g[var1 + (var2 + 1) % fireTileSize * tileSizeBase] * (float)var3;
046    
047                    for (int var5 = var1 - 1; var5 <= var1 + 1; ++var5)
048                    {
049                        for (var6 = var2; var6 <= var2 + 1; ++var6)
050                        {
051                            if (var5 >= 0 && var6 >= 0 && var5 < tileSizeBase && var6 < fireTileSize)
052                            {
053                                var4 += this.field_76869_g[var5 + var6 * tileSizeBase];
054                            }
055    
056                            ++var3;
057                        }
058                    }
059    
060                    this.field_76870_h[var1 + var2 * tileSizeBase] = var4 / ((float)var3 * fireFactor2);
061    
062                    if (var2 >= fireTileSize - (tileSizeBase >> 4))
063                    {
064                        this.field_76870_h[var1 + var2 * tileSizeBase] = (float)(Math.random() * Math.random() * Math.random() * fireFactor1 + Math.random() * 0.1F + 0.2F);
065                    }
066                }
067            }
068    
069            float[] var13 = this.field_76870_h;
070            this.field_76870_h = this.field_76869_g;
071            this.field_76869_g = var13;
072    
073            for (var3 = 0; var3 < tileSizeSquare; ++var3)
074            {
075                var4 = this.field_76869_g[var3] * 1.8F;
076    
077                if (var4 > 1.0F)
078                {
079                    var4 = 1.0F;
080                }
081    
082                if (var4 < 0.0F)
083                {
084                    var4 = 0.0F;
085                }
086    
087                var6 = (int)(var4 * 155.0F + 100.0F);
088                int var7 = (int)(var4 * var4 * 255.0F);
089                int var8 = (int)(var4 * var4 * var4 * var4 * var4 * var4 * var4 * var4 * var4 * var4 * 255.0F);
090                short var9 = 255;
091    
092                if (var4 < 0.5F)
093                {
094                    var9 = 0;
095                }
096    
097                float var14 = (var4 - 0.5F) * 2.0F;
098    
099                if (this.anaglyphEnabled)
100                {
101                    int var10 = (var6 * 30 + var7 * 59 + var8 * 11) / 100;
102                    int var11 = (var6 * 30 + var7 * 70) / 100;
103                    int var12 = (var6 * 30 + var8 * 70) / 100;
104                    var6 = var10;
105                    var7 = var11;
106                    var8 = var12;
107                }
108    
109                this.imageData[var3 * 4 + 0] = (byte)var6;
110                this.imageData[var3 * 4 + 1] = (byte)var7;
111                this.imageData[var3 * 4 + 2] = (byte)var8;
112                this.imageData[var3 * 4 + 3] = (byte)var9;
113            }
114        }
115    }