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 net.minecraft.client.renderer.RenderEngine; 022 023 import org.lwjgl.opengl.GL11; 024 025 import cpw.mods.fml.client.FMLClientHandler; 026 import 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 */ 032 public 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 }