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 }