    001package net.minecraft.client.renderer.texturefx;
    002
    003import cpw.mods.fml.client.FMLTextureFX;
    004import cpw.mods.fml.relauncher.Side;
    005import cpw.mods.fml.relauncher.SideOnly;
    006
    007import java.awt.Graphics2D;
    008import java.awt.image.BufferedImage;
    009import java.awt.image.ImageObserver;
    010import java.io.IOException;
    011import java.util.logging.Level;
    012
    013import javax.imageio.ImageIO;
    014import net.minecraft.client.Minecraft;
    015import net.minecraft.item.Item;
    016
    017@SideOnly(Side.CLIENT)
    018public 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}