001/*
002 * The FML Forge Mod Loader suite.
003 * Copyright (C) 2012 cpw
004 *
005 * This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free
006 * Software Foundation; either version 2.1 of the License, or any later version.
007 *
008 * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
009 * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
010 *
011 * You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51
012 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
013 */
014
015package net.minecraft.src;
016
017import java.awt.Graphics2D;
018import java.awt.image.BufferedImage;
019import java.awt.image.ImageObserver;
020
021import net.minecraft.client.renderer.RenderEngine;
022
023import org.lwjgl.opengl.GL11;
024
025import cpw.mods.fml.client.FMLClientHandler;
026import cpw.mods.fml.client.FMLTextureFX;
027
028/**
029 * A texture override for animations, it takes a vertical image of
030 * texture frames and constantly rotates them in the texture.
031 */
032public class ModTextureAnimation extends FMLTextureFX
033{
034    private final int tickRate;
035    private byte[][] images;
036    private int index = 0;
037    private int ticks = 0;
038
039    private String targetTex = null;
040    private BufferedImage imgData = null;
041
042    public ModTextureAnimation(int icon, int target, BufferedImage image, int tickCount)
043    {
044        this(icon, 1, target, image, tickCount);
045    }
046
047    public ModTextureAnimation(int icon, int size, int target, BufferedImage image, int tickCount)
048    {
049        this(icon, size, (target == 0 ? "/terrain.png" : "/gui/items.png"), image, tickCount);
050    }
051
052    public ModTextureAnimation(int icon, int size, String target, BufferedImage image, int tickCount)
053    {
054        super(icon);
055        RenderEngine re = FMLClientHandler.instance().getClient().renderEngine;
056
057        targetTex = target;
058        tileSize = size;
059        tileImage = re.getTexture(target);
060
061        tickRate = tickCount;
062        ticks = tickCount;
063        imgData = image;
064    }
065
066    @Override
067    public void setup()
068    {
069        super.setup();
070
071        int sWidth  = imgData.getWidth();
072        int sHeight = imgData.getHeight();
073        int tWidth  = tileSizeBase;
074        int tHeight = tileSizeBase;
075
076
077        int frames = (int)Math.floor((double)(sHeight / sWidth));
078
079        if (frames < 1)
080        {
081            throw new IllegalArgumentException(String.format("Attempted to create a TextureAnimation with no complete frames: %dx%d", sWidth, sHeight));
082        }
083        else
084        {
085            images = new byte[frames][];
086            BufferedImage image = imgData;
087
088            if (sWidth != tWidth)
089            {
090                BufferedImage b = new BufferedImage(tWidth, tHeight * frames, 6);
091                Graphics2D g = b.createGraphics();
092                g.drawImage(imgData, 0, 0, tWidth, tHeight * frames, 0, 0, sWidth, sHeight, (ImageObserver)null);
093                g.dispose();
094                image = b;
095            }
096
097            for (int frame = 0; frame < frames; frame++)
098            {
099                int[] pixels = new int[tileSizeSquare];
100                image.getRGB(0, tHeight * frame, tWidth, tHeight, pixels, 0, tWidth);
101                images[frame] = new byte[tileSizeSquare << 2];
102
103                for (int i = 0; i < pixels.length; i++)
104                {
105                    int i4 = i * 4;
106                    images[frame][i4 + 0] = (byte)(pixels[i] >> 16 & 255);
107                    images[frame][i4 + 1] = (byte)(pixels[i] >> 8  & 255);
108                    images[frame][i4 + 2] = (byte)(pixels[i] >> 0  & 255);
109                    images[frame][i4 + 3] = (byte)(pixels[i] >> 24 & 255);
110                }
111            }
112        }
113    }
114
115    public void onTick()
116    {
117        if (++ticks >= tickRate)
118        {
119            if (++index >= images.length)
120            {
121                index = 0;
122            }
123
124            imageData = images[index];
125            ticks = 0;
126        }
127    }
128
129    public void bindImage(RenderEngine renderEngine)
130    {
131        GL11.glBindTexture(GL11.GL_TEXTURE_2D, tileImage);
132    }
133
134    // TODO: REMOVE THIS - just for you dan200
135    @Deprecated
136    public void func_783_a()
137    {
138        onTick();
139    }
140
141}