2013-07-16 17:58:02 +10:00
|
|
|
package codechicken.lib.render;
|
|
|
|
|
|
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.renderer.texture.IIconRegister;
|
2013-07-16 17:58:02 +10:00
|
|
|
import net.minecraft.client.renderer.texture.TextureMap;
|
2014-04-07 14:02:47 +10:00
|
|
|
import net.minecraft.util.IIcon;
|
2013-07-16 17:58:02 +10:00
|
|
|
import net.minecraft.util.ResourceLocation;
|
|
|
|
|
|
2014-04-09 13:38:05 +10:00
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.HashMap;
|
|
|
|
|
|
2013-07-16 17:58:02 +10:00
|
|
|
public class SpriteSheetManager
|
|
|
|
|
{
|
|
|
|
|
@SideOnly(Side.CLIENT)
|
2014-04-07 14:02:47 +10:00
|
|
|
public static class SpriteSheet implements IIconSelfRegister
|
2013-07-16 17:58:02 +10:00
|
|
|
{
|
|
|
|
|
private int tilesX;
|
|
|
|
|
private int tilesY;
|
|
|
|
|
private ArrayList<Integer> newSprites = new ArrayList<Integer>();
|
|
|
|
|
private TextureSpecial[] sprites;
|
|
|
|
|
private ResourceLocation resource;
|
|
|
|
|
private TextureDataHolder texture;
|
|
|
|
|
private int spriteWidth;
|
|
|
|
|
private int spriteHeight;
|
|
|
|
|
|
|
|
|
|
public int atlasIndex;
|
|
|
|
|
|
|
|
|
|
private SpriteSheet(int tilesX, int tilesY, ResourceLocation textureFile)
|
|
|
|
|
{
|
|
|
|
|
this.tilesX = tilesX;
|
|
|
|
|
this.tilesY = tilesY;
|
|
|
|
|
this.resource = textureFile;
|
|
|
|
|
sprites = new TextureSpecial[tilesX*tilesY];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void requestIndicies(int... indicies)
|
|
|
|
|
{
|
|
|
|
|
for(int i : indicies)
|
|
|
|
|
setupSprite(i);
|
|
|
|
|
}
|
|
|
|
|
|
2014-04-07 14:02:47 +10:00
|
|
|
public void registerIcons(IIconRegister register)
|
2013-07-16 17:58:02 +10:00
|
|
|
{
|
|
|
|
|
TextureMap textureMap = (TextureMap)register;
|
|
|
|
|
|
2013-09-04 13:56:47 +10:00
|
|
|
if(TextureUtils.refreshTexture(textureMap, resource.getResourcePath()))
|
2013-07-16 17:58:02 +10:00
|
|
|
{
|
|
|
|
|
reloadTexture();
|
2014-08-15 19:19:48 +10:00
|
|
|
for (TextureSpecial sprite : sprites)
|
|
|
|
|
if (sprite != null)
|
|
|
|
|
textureMap.setTextureEntry(sprite.getIconName(), sprite);
|
2013-07-16 17:58:02 +10:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
for(int i : newSprites)
|
|
|
|
|
textureMap.setTextureEntry(sprites[i].getIconName(), sprites[i]);
|
|
|
|
|
}
|
|
|
|
|
newSprites.clear();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public TextureSpecial setupSprite(int i)
|
|
|
|
|
{
|
|
|
|
|
if(sprites[i] == null)
|
|
|
|
|
{
|
|
|
|
|
String name = resource+"_"+i;
|
|
|
|
|
sprites[i] = new TextureSpecial(name).baseFromSheet(this, i);
|
|
|
|
|
newSprites.add(i);
|
|
|
|
|
}
|
|
|
|
|
return sprites[i];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void reloadTexture()
|
|
|
|
|
{
|
|
|
|
|
texture = TextureUtils.loadTexture(resource);
|
|
|
|
|
spriteWidth = texture.width/tilesX;
|
|
|
|
|
spriteHeight = texture.height/tilesY;
|
|
|
|
|
}
|
|
|
|
|
|
2014-04-07 14:02:47 +10:00
|
|
|
public IIcon getSprite(int index)
|
2013-07-16 17:58:02 +10:00
|
|
|
{
|
2014-04-07 14:02:47 +10:00
|
|
|
IIcon i = sprites[index];
|
2013-07-16 17:58:02 +10:00
|
|
|
if(i == null)
|
|
|
|
|
throw new IllegalArgumentException("Sprite at index: "+index+" from texture file "+resource+" was not preloaded.");
|
|
|
|
|
return i;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public TextureDataHolder createSprite(int spriteIndex)
|
|
|
|
|
{
|
|
|
|
|
int sx = spriteIndex%tilesX;
|
|
|
|
|
int sy = spriteIndex/tilesX;
|
|
|
|
|
TextureDataHolder sprite = new TextureDataHolder(spriteWidth, spriteHeight);
|
|
|
|
|
TextureUtils.copySubImg(texture.data, texture.width, sx*spriteWidth, sy*spriteHeight,
|
|
|
|
|
spriteWidth, spriteHeight,
|
|
|
|
|
sprite.data, spriteWidth, 0, 0);
|
|
|
|
|
return sprite;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int spriteWidth()
|
|
|
|
|
{
|
|
|
|
|
return spriteWidth;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int spriteHeight()
|
|
|
|
|
{
|
|
|
|
|
return spriteHeight;
|
|
|
|
|
}
|
|
|
|
|
|
2013-09-04 13:56:47 +10:00
|
|
|
public TextureSpecial bindTextureFX(int i, TextureFX textureFX)
|
2013-07-16 17:58:02 +10:00
|
|
|
{
|
|
|
|
|
return setupSprite(i).addTextureFX(textureFX);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public SpriteSheet selfRegister(int atlas)
|
|
|
|
|
{
|
|
|
|
|
TextureUtils.addIconRegistrar(this);
|
|
|
|
|
return this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public int atlasIndex()
|
|
|
|
|
{
|
|
|
|
|
return atlasIndex;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static HashMap<String, SpriteSheet> spriteSheets = new HashMap<String, SpriteSheet>();
|
|
|
|
|
|
|
|
|
|
public static SpriteSheet getSheet(ResourceLocation resource)
|
|
|
|
|
{
|
|
|
|
|
return getSheet(16, 16, resource);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static SpriteSheet getSheet(int tilesX, int tilesY, ResourceLocation resource)
|
|
|
|
|
{
|
|
|
|
|
SpriteSheet sheet = spriteSheets.get(resource.toString());
|
|
|
|
|
if(sheet == null)
|
|
|
|
|
spriteSheets.put(resource.toString(), sheet = new SpriteSheet(tilesX, tilesY, resource));
|
|
|
|
|
return sheet;
|
|
|
|
|
}
|
|
|
|
|
}
|