    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}