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
015 package net.minecraft.src;
016
017 import java.awt.Graphics2D;
018 import java.awt.image.BufferedImage;
019 import java.awt.image.ImageObserver;
020
021 import org.lwjgl.opengl.GL11;
022
023 import cpw.mods.fml.client.FMLClientHandler;
024 import cpw.mods.fml.client.FMLTextureFX;
025
026 /**
027 * A texture override for animations, it takes a vertical image of
028 * texture frames and constantly rotates them in the texture.
029 */
030 public class ModTextureAnimation extends FMLTextureFX
031 {
032 private final int tickRate;
033 private byte[][] images;
034 private int index = 0;
035 private int ticks = 0;
036
037 private String targetTex = null;
038 private BufferedImage imgData = null;
039
040 public ModTextureAnimation(int icon, int target, BufferedImage image, int tickCount)
041 {
042 this(icon, 1, target, image, tickCount);
043 }
044
045 public ModTextureAnimation(int icon, int size, int target, BufferedImage image, int tickCount)
046 {
047 this(icon, size, (target == 0 ? "/terrain.png" : "/gui/items.png"), image, tickCount);
048 }
049
050 public ModTextureAnimation(int icon, int size, String target, BufferedImage image, int tickCount)
051 {
052 super(icon);
053 RenderEngine re = FMLClientHandler.instance().getClient().renderEngine;
054
055 targetTex = target;
056 tileSize = size;
057 tileImage = re.getTexture(target);
058
059 tickRate = tickCount;
060 ticks = tickCount;
061 imgData = image;
062 }
063
064 @Override
065 public void setup()
066 {
067 super.setup();
068
069 int sWidth = imgData.getWidth();
070 int sHeight = imgData.getHeight();
071 int tWidth = tileSizeBase;
072 int tHeight = tileSizeBase;
073
074
075 int frames = (int)Math.floor((double)(sHeight / sWidth));
076
077 if (frames < 1)
078 {
079 throw new IllegalArgumentException(String.format("Attempted to create a TextureAnimation with no complete frames: %dx%d", sWidth, sHeight));
080 }
081 else
082 {
083 images = new byte[frames][];
084 BufferedImage image = imgData;
085
086 if (sWidth != tWidth)
087 {
088 BufferedImage b = new BufferedImage(tWidth, tHeight * frames, 6);
089 Graphics2D g = b.createGraphics();
090 g.drawImage(imgData, 0, 0, tWidth, tHeight * frames, 0, 0, sWidth, sHeight, (ImageObserver)null);
091 g.dispose();
092 image = b;
093 }
094
095 for (int frame = 0; frame < frames; frame++)
096 {
097 int[] pixels = new int[tileSizeSquare];
098 image.getRGB(0, tHeight * frame, tWidth, tHeight, pixels, 0, tWidth);
099 images[frame] = new byte[tileSizeSquare << 2];
100
101 for (int i = 0; i < pixels.length; i++)
102 {
103 int i4 = i * 4;
104 images[frame][i4 + 0] = (byte)(pixels[i] >> 16 & 255);
105 images[frame][i4 + 1] = (byte)(pixels[i] >> 8 & 255);
106 images[frame][i4 + 2] = (byte)(pixels[i] >> 0 & 255);
107 images[frame][i4 + 3] = (byte)(pixels[i] >> 24 & 255);
108 }
109 }
110 }
111 }
112
113 public void onTick()
114 {
115 if (++ticks >= tickRate)
116 {
117 if (++index >= images.length)
118 {
119 index = 0;
120 }
121
122 imageData = images[index];
123 ticks = 0;
124 }
125 }
126
127 public void bindImage(RenderEngine renderEngine)
128 {
129 GL11.glBindTexture(GL11.GL_TEXTURE_2D, tileImage);
130 }
131
132 // TODO: REMOVE THIS - just for you dan200
133 @Deprecated
134 public void func_783_a()
135 {
136 onTick();
137 }
138
139 }