Files
CodeChickenCore/codechicken/lib/render/TextureSpecial.java
T

148 lines
4.4 KiB
Java
Raw Normal View History

2013-07-16 17:58:02 +10:00
package codechicken.lib.render;
2014-04-07 14:02:47 +10:00
import java.awt.image.BufferedImage;
2013-07-16 17:58:02 +10:00
import java.util.ArrayList;
2014-04-07 14:02:47 +10:00
2013-07-16 17:58:02 +10:00
import codechicken.lib.render.SpriteSheetManager.SpriteSheet;
2014-04-07 14:02:47 +10:00
import codechicken.lib.render.TextureUtils.IIconSelfRegister;
2013-07-16 17:58:02 +10:00
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
2014-04-07 14:02:47 +10:00
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.texture.IIconRegister;
2013-07-16 17:58:02 +10:00
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.client.renderer.texture.TextureUtil;
2014-04-07 14:02:47 +10:00
import net.minecraft.client.resources.IResourceManager;
import net.minecraft.client.settings.GameSettings;
2013-07-16 17:58:02 +10:00
import net.minecraft.util.ResourceLocation;
@SideOnly(Side.CLIENT)
2014-04-07 14:02:47 +10:00
public class TextureSpecial extends TextureAtlasSprite implements IIconSelfRegister {
2013-07-16 17:58:02 +10:00
//sprite sheet fields
private int spriteIndex;
private SpriteSheet spriteSheet;
2014-04-07 14:02:47 +10:00
2013-07-16 17:58:02 +10:00
//textureFX fields
private TextureFX textureFX;
2014-04-07 14:02:47 +10:00
private int blankSize = -1;
2013-07-16 17:58:02 +10:00
private ArrayList<TextureDataHolder> baseTextures;
2014-04-07 14:02:47 +10:00
2013-07-16 17:58:02 +10:00
private boolean selfRegister;
public int atlasIndex;
2014-04-07 14:02:47 +10:00
protected TextureSpecial(String par1) {
2013-07-16 17:58:02 +10:00
super(par1);
}
2014-04-07 14:02:47 +10:00
public TextureSpecial addTexture(TextureDataHolder t) {
if (baseTextures == null)
2013-07-16 17:58:02 +10:00
baseTextures = new ArrayList<TextureDataHolder>();
baseTextures.add(t);
return this;
}
2014-04-07 14:02:47 +10:00
public TextureSpecial baseFromSheet(SpriteSheet spriteSheet, int spriteIndex) {
2013-07-16 17:58:02 +10:00
this.spriteSheet = spriteSheet;
this.spriteIndex = spriteIndex;
return this;
}
2014-04-07 14:02:47 +10:00
public TextureSpecial addTextureFX(TextureFX fx) {
2013-07-16 17:58:02 +10:00
textureFX = fx;
return this;
}
2014-04-07 14:02:47 +10:00
2013-07-16 17:58:02 +10:00
@Override
2014-04-07 14:02:47 +10:00
public void initSprite(int sheetWidth, int sheetHeight, int originX, int originY, boolean rotated) {
2013-09-04 13:56:47 +10:00
super.initSprite(sheetWidth, sheetHeight, originX, originY, rotated);
2014-04-07 14:02:47 +10:00
if (textureFX != null)
2013-09-04 13:56:47 +10:00
textureFX.onTextureDimensionsUpdate(width, height);
2013-07-16 17:58:02 +10:00
}
2014-04-07 14:02:47 +10:00
2013-07-16 17:58:02 +10:00
@Override
2014-04-07 14:02:47 +10:00
public void updateAnimation() {
if (textureFX != null) {
2013-07-16 17:58:02 +10:00
textureFX.update();
2014-04-07 14:02:47 +10:00
if (textureFX.changed())
TextureUtil.uploadTextureSub(0, textureFX.imageData, width, height, originX, originY, false, false, false);
2013-07-16 17:58:02 +10:00
}
}
2014-04-07 14:02:47 +10:00
@Override
public boolean hasCustomLoader(IResourceManager manager, ResourceLocation location) {
return true;
}
public void addFrame(int[] data) {
GameSettings settings = Minecraft.getMinecraft().gameSettings;
BufferedImage[] images = new BufferedImage[settings.mipmapLevels+1];
images[0] = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
images[0].setRGB(0, 0, width, height, data, 0, width);
super.loadSprite(images, null, settings.anisotropicFiltering > 1);
}
2013-07-16 17:58:02 +10:00
@Override
2014-04-07 14:02:47 +10:00
public boolean load(IResourceManager manager, ResourceLocation location) {
if (baseTextures != null) {
for (TextureDataHolder tex : baseTextures) {
2013-09-04 13:56:47 +10:00
width = tex.width;
height = tex.height;
2014-04-07 14:02:47 +10:00
addFrame(tex.data);
2013-07-16 17:58:02 +10:00
}
}
2014-04-07 14:02:47 +10:00
if (spriteSheet != null) {
2013-07-16 17:58:02 +10:00
TextureDataHolder tex = spriteSheet.createSprite(spriteIndex);
2013-09-04 13:56:47 +10:00
width = tex.width;
height = tex.height;
2014-04-07 14:02:47 +10:00
addFrame(tex.data);
2013-07-16 17:58:02 +10:00
}
2014-04-07 14:02:47 +10:00
if (blankSize > 0) {
2013-09-04 13:56:47 +10:00
width = height = blankSize;
2014-04-07 14:02:47 +10:00
addFrame(new int[blankSize * blankSize]);
2013-07-16 17:58:02 +10:00
}
2014-04-07 14:02:47 +10:00
if (framesTextureData.isEmpty())
throw new RuntimeException("No base frame for texture: " + getIconName());
return false;
2013-07-16 17:58:02 +10:00
}
2014-04-07 14:02:47 +10:00
2013-07-16 17:58:02 +10:00
@Override
2014-04-07 14:02:47 +10:00
public boolean hasAnimationMetadata() {
2013-09-04 13:56:47 +10:00
return textureFX != null || super.hasAnimationMetadata();
2013-07-16 17:58:02 +10:00
}
2014-04-07 14:02:47 +10:00
2013-07-16 17:58:02 +10:00
@Override
2014-04-07 14:02:47 +10:00
public int getFrameCount() {
if (textureFX != null)
2013-07-16 17:58:02 +10:00
return 1;
2014-04-07 14:02:47 +10:00
2013-09-04 13:56:47 +10:00
return super.getFrameCount();
2013-07-16 17:58:02 +10:00
}
2014-04-07 14:02:47 +10:00
public TextureSpecial blank(int size) {
2013-07-16 17:58:02 +10:00
blankSize = size;
return this;
}
2014-04-07 14:02:47 +10:00
public TextureSpecial selfRegister() {
2013-07-16 17:58:02 +10:00
selfRegister = true;
TextureUtils.addIconRegistrar(this);
return this;
}
2014-04-07 14:02:47 +10:00
2013-07-16 17:58:02 +10:00
@Override
2014-04-07 14:02:47 +10:00
public void registerIcons(IIconRegister register) {
if (selfRegister)
((TextureMap) register).setTextureEntry(getIconName(), this);
2013-07-16 17:58:02 +10:00
}
2014-04-07 14:02:47 +10:00
2013-07-16 17:58:02 +10:00
@Override
2014-04-07 14:02:47 +10:00
public int atlasIndex() {
2013-07-16 17:58:02 +10:00
return atlasIndex;
}
}