120 lines
4.3 KiB
Java
120 lines
4.3 KiB
Java
package mods.betterfoliage.client.resource;
|
|
|
|
import java.awt.image.BufferedImage;
|
|
import java.io.IOException;
|
|
|
|
import javax.imageio.ImageIO;
|
|
|
|
import mods.betterfoliage.client.resource.LeafTextureEnumerator.LeafTextureFoundEvent;
|
|
import mods.betterfoliage.common.util.ResourceUtils;
|
|
import net.minecraft.client.Minecraft;
|
|
import net.minecraft.client.resources.IResource;
|
|
import net.minecraft.client.resources.IResourceManager;
|
|
import net.minecraft.util.ResourceLocation;
|
|
import net.minecraftforge.client.event.TextureStitchEvent.Pre;
|
|
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
|
|
import cpw.mods.fml.relauncher.Side;
|
|
import cpw.mods.fml.relauncher.SideOnly;
|
|
|
|
/** Texture generator base class for textures based on leaf blocks.
|
|
* Supports loading from resource packs instead of generating if available.
|
|
* @author octarine-noise
|
|
*/
|
|
@SideOnly(Side.CLIENT)
|
|
public abstract class LeafGeneratorBase extends BlockTextureGenerator {
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
public static class TextureGenerationException extends Exception {
|
|
private static final long serialVersionUID = 7339757761980002651L;
|
|
};
|
|
|
|
/** Format string of pre-drawn texture location */
|
|
public String handDrawnLocationFormat;
|
|
|
|
/** Format string of alpha mask location */
|
|
public String maskImageLocationFormat;
|
|
|
|
/** Resource domain name of pre-drawn textures */
|
|
public String nonGeneratedDomain;
|
|
|
|
/** Number of textures generated in the current run */
|
|
public int generatedCounter = 0;
|
|
|
|
/** Number of pre-drawn textures found in the current run */
|
|
public int drawnCounter = 0;
|
|
|
|
public LeafGeneratorBase(String domain, String nonGeneratedDomain, String handDrawnLocationFormat, String maskImageLocationFormat, ResourceLocation missingResource) {
|
|
super(domain, missingResource);
|
|
this.nonGeneratedDomain = nonGeneratedDomain;
|
|
this.handDrawnLocationFormat = handDrawnLocationFormat;
|
|
this.maskImageLocationFormat = maskImageLocationFormat;
|
|
}
|
|
|
|
@Override
|
|
public IResource getResource(ResourceLocation resourceLocation) throws IOException {
|
|
IResourceManager resourceManager = Minecraft.getMinecraft().getResourceManager();
|
|
ResourceLocation originalNoDirs = unwrapResource(resourceLocation);
|
|
ResourceLocation originalWithDirs = new ResourceLocation(originalNoDirs.getResourceDomain(), "textures/blocks/" + originalNoDirs.getResourcePath());
|
|
|
|
// check for provided texture
|
|
ResourceLocation handDrawnLocation = new ResourceLocation(nonGeneratedDomain, String.format(handDrawnLocationFormat, originalNoDirs.getResourceDomain(), originalNoDirs.getResourcePath()));
|
|
if (ResourceUtils.resourceExists(handDrawnLocation)) {
|
|
drawnCounter++;
|
|
return resourceManager.getResource(handDrawnLocation);
|
|
}
|
|
|
|
// generate our own
|
|
if (!ResourceUtils.resourceExists(originalWithDirs)) return getMissingResource();
|
|
|
|
BufferedImage result;
|
|
try {
|
|
result = generateLeaf(originalWithDirs);
|
|
} catch (TextureGenerationException e) {
|
|
return getMissingResource();
|
|
}
|
|
generatedCounter++;
|
|
return new BufferedImageResource(result);
|
|
}
|
|
|
|
protected abstract BufferedImage generateLeaf(ResourceLocation originalWithDirs) throws IOException, TextureGenerationException;
|
|
|
|
/** Loads the alpha mask of the given type and size. If a mask of the exact size can not be found,
|
|
* will try to load progressively smaller masks down to 16x16
|
|
* @param type mask type
|
|
* @param size texture size
|
|
* @return alpha mask
|
|
*/
|
|
protected BufferedImage loadLeafMaskImage(String type, int size) {
|
|
IResourceManager resourceManager = Minecraft.getMinecraft().getResourceManager();
|
|
IResource maskResource = null;
|
|
|
|
while (maskResource == null && size >= 1) {
|
|
try {
|
|
maskResource = resourceManager.getResource(new ResourceLocation(String.format(maskImageLocationFormat, size, type)));
|
|
} catch (Exception e) {}
|
|
size /= 2;
|
|
}
|
|
|
|
try {
|
|
return maskResource == null ? null : ImageIO.read(maskResource.getInputStream());
|
|
} catch (IOException e) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
@SubscribeEvent
|
|
public void handleTextureReload(Pre event) {
|
|
super.handleTextureReload(event);
|
|
if (event.map.getTextureType() != 0) return;
|
|
generatedCounter = 0;
|
|
drawnCounter = 0;
|
|
}
|
|
|
|
@SubscribeEvent
|
|
public void handleRegisterTexture(LeafTextureFoundEvent event) {
|
|
event.blockTextures.registerIcon(new ResourceLocation(domainName, event.icon.getIconName()).toString());
|
|
}
|
|
|
|
}
|