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    
007    import java.awt.Graphics2D;
008    import java.awt.image.BufferedImage;
009    import java.awt.image.ImageObserver;
010    import java.io.IOException;
011    import java.util.logging.Level;
012    
013    import javax.imageio.ImageIO;
014    import net.minecraft.client.Minecraft;
015    import net.minecraft.item.Item;
016    
017    @SideOnly(Side.CLIENT)
018    public class TextureWatchFX extends FMLTextureFX
019    {
020        /**
021         * Holds the game instance to retrieve information like world provider and time.
022         */
023        private Minecraft mc;
024    
025        /** Holds the image of the watch from items.png in rgb format. */
026        private int[] watchIconImageData = new int[256];
027    
028        /** Holds the image of the dial.png in rgb format. */
029        private int[] dialImageData = new int[256];
030        private double field_76861_j;
031        private double field_76862_k;
032    
033        public TextureWatchFX(Minecraft par1Minecraft)
034        {
035            super(Item.pocketSundial.getIconFromDamage(0));
036            this.mc = par1Minecraft;
037            this.tileImage = 1;
038            setup();
039        }
040    
041        @Override
042        public void setup()
043        {
044            super.setup();
045            watchIconImageData = new int[tileSizeSquare];
046            dialImageData = new int[tileSizeSquare];
047    
048            try
049            {
050                BufferedImage var2 = ImageIO.read(mc.texturePackList.getSelectedTexturePack().getResourceAsStream("/gui/items.png"));
051                int var3 = this.iconIndex % 16 * tileSizeBase;
052                int var4 = this.iconIndex / 16 * tileSizeBase;
053                var2.getRGB(var3, var4, tileSizeBase, tileSizeBase, this.watchIconImageData, 0, tileSizeBase);
054                var2 = ImageIO.read(mc.texturePackList.getSelectedTexturePack().getResourceAsStream("/misc/dial.png"));
055                if (var2.getWidth() != tileSizeBase)
056                {
057                    BufferedImage tmp = new BufferedImage(tileSizeBase, tileSizeBase, 6);
058                    Graphics2D gfx = tmp.createGraphics();
059                    gfx.drawImage(var2, 0, 0, tileSizeBase, tileSizeBase, 0, 0, var2.getWidth(), var2.getHeight(), (ImageObserver)null);
060                    gfx.dispose();
061                    var2 = tmp;
062                }
063    
064                var2.getRGB(0, 0, tileSizeBase, tileSizeBase, this.dialImageData, 0, tileSizeBase);
065            }
066            catch (Exception var5)
067            {
068                var5.printStackTrace();
069                log.log(Level.WARNING, String.format("A problem occurred with the watch texture: animation will be disabled"), var5);
070                setErrored(true);
071            }
072        }
073    
074        public void onTick()
075        {
076            double var1 = 0.0D;
077    
078            if (this.mc.theWorld != null && this.mc.thePlayer != null)
079            {
080                float var3 = this.mc.theWorld.getCelestialAngle(1.0F);
081                var1 = (double)(-var3 * (float)Math.PI * 2.0F);
082    
083                if (!this.mc.theWorld.provider.isSurfaceWorld())
084                {
085                    var1 = Math.random() * Math.PI * 2.0D;
086                }
087            }
088    
089            double var22;
090    
091            for (var22 = var1 - this.field_76861_j; var22 < -Math.PI; var22 += (Math.PI * 2D))
092            {
093                ;
094            }
095    
096            while (var22 >= Math.PI)
097            {
098                var22 -= (Math.PI * 2D);
099            }
100    
101            if (var22 < -1.0D)
102            {
103                var22 = -1.0D;
104            }
105    
106            if (var22 > 1.0D)
107            {
108                var22 = 1.0D;
109            }
110    
111            this.field_76862_k += var22 * 0.1D;
112            this.field_76862_k *= 0.8D;
113            this.field_76861_j += this.field_76862_k;
114            double var5 = Math.sin(this.field_76861_j);
115            double var7 = Math.cos(this.field_76861_j);
116    
117            for (int var9 = 0; var9 < tileSizeSquare; ++var9)
118            {
119                int var10 = this.watchIconImageData[var9] >> 24 & 255;
120                int var11 = this.watchIconImageData[var9] >> 16 & 255;
121                int var12 = this.watchIconImageData[var9] >> 8 & 255;
122                int var13 = this.watchIconImageData[var9] >> 0 & 255;
123    
124                if (var11 == var13 && var12 == 0 && var13 > 0)
125                {
126                    double var14 = -((double)(var9 % tileSizeBase) / tileSizeMask - 0.5D);
127                    double var16 = (double)(var9 / tileSizeBase) / tileSizeMask - 0.5D;
128                    int var18 = var11;
129                    int var19 = (int)((var14 * var7 + var16 * var5 + 0.5D) * tileSizeBase);
130                    int var20 = (int)((var16 * var7 - var14 * var5 + 0.5D) * tileSizeBase);
131                    int var21 = (var19 & tileSizeMask) + (var20 & tileSizeMask) * tileSizeBase;
132                    var10 = this.dialImageData[var21] >> 24 & 255;
133                    var11 = (this.dialImageData[var21] >> 16 & 255) * var11 / 255;
134                    var12 = (this.dialImageData[var21] >> 8 & 255) * var18 / 255;
135                    var13 = (this.dialImageData[var21] >> 0 & 255) * var18 / 255;
136                }
137    
138                if (this.anaglyphEnabled)
139                {
140                    int var23 = (var11 * 30 + var12 * 59 + var13 * 11) / 100;
141                    int var15 = (var11 * 30 + var12 * 70) / 100;
142                    int var24 = (var11 * 30 + var13 * 70) / 100;
143                    var11 = var23;
144                    var12 = var15;
145                    var13 = var24;
146                }
147    
148                this.imageData[var9 * 4 + 0] = (byte)var11;
149                this.imageData[var9 * 4 + 1] = (byte)var12;
150                this.imageData[var9 * 4 + 2] = (byte)var13;
151                this.imageData[var9 * 4 + 3] = (byte)var10;
152            }
153        }
154    }