001/* 002 * Forge Mod Loader 003 * Copyright (c) 2012-2013 cpw. 004 * All rights reserved. This program and the accompanying materials 005 * are made available under the terms of the GNU Lesser Public License v2.1 006 * which accompanies this distribution, and is available at 007 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html 008 * 009 * Contributors: 010 * cpw - implementation 011 */ 012 013package cpw.mods.fml.client; 014 015import java.awt.Dimension; 016import java.awt.image.BufferedImage; 017import java.io.IOException; 018import java.io.InputStream; 019import java.util.Map; 020 021import javax.imageio.ImageIO; 022 023import org.lwjgl.opengl.ContextCapabilities; 024import org.lwjgl.opengl.GLContext; 025 026import com.google.common.collect.Maps; 027 028import cpw.mods.fml.common.FMLLog; 029 030import net.minecraft.client.Minecraft; 031import net.minecraft.client.renderer.RenderEngine; 032 033public class TextureFXManager 034{ 035 private static final TextureFXManager INSTANCE = new TextureFXManager(); 036 037 private Minecraft client; 038 039 private Map<Integer,TextureHolder> texturesById = Maps.newHashMap(); 040 private Map<String, TextureHolder> texturesByName = Maps.newHashMap(); 041 042 private TextureHelper helper; 043 044 void setClient(Minecraft client) 045 { 046 this.client = client; 047 } 048 public BufferedImage loadImageFromTexturePack(RenderEngine renderEngine, String path) throws IOException 049 { 050 InputStream image=client.texturePackList.getSelectedTexturePack().getResourceAsStream(path); 051 if (image==null) { 052 throw new RuntimeException(String.format("The requested image path %s is not found",path)); 053 } 054 BufferedImage result=ImageIO.read(image); 055 if (result==null) 056 { 057 throw new RuntimeException(String.format("The requested image path %s appears to be corrupted",path)); 058 } 059 return result; 060 } 061 062 public static TextureFXManager instance() 063 { 064 return INSTANCE; 065 } 066 067 public void fixTransparency(BufferedImage loadedImage, String textureName) 068 { 069 if (textureName.matches("^/mob/.*_eyes.*.png$")) 070 { 071 for (int x = 0; x < loadedImage.getWidth(); x++) { 072 for (int y = 0; y < loadedImage.getHeight(); y++) { 073 int argb = loadedImage.getRGB(x, y); 074 if ((argb & 0xff000000) == 0 && argb != 0) { 075 loadedImage.setRGB(x, y, 0); 076 } 077 } 078 } 079 } 080 } 081 public void bindTextureToName(String name, int index) 082 { 083 TextureHolder holder = new TextureHolder(); 084 holder.textureId = index; 085 holder.textureName = name; 086 texturesById.put(index,holder); 087 texturesByName.put(name,holder); 088 } 089 090 public void setTextureDimensions(int index, int j, int k) 091 { 092 TextureHolder holder = texturesById.get(index); 093 if (holder == null) 094 { 095 return; 096 } 097 holder.x = j; 098 holder.y = k; 099 } 100 101 private class TextureHolder { 102 private int textureId; 103 private String textureName; 104 private int x; 105 private int y; 106 } 107 108 public Dimension getTextureDimensions(String texture) 109 { 110 return texturesByName.containsKey(texture) ? new Dimension(texturesByName.get(texture).x, texturesByName.get(texture).y) : new Dimension(1,1); 111 } 112 113 114 public TextureHelper getHelper() 115 { 116 if (helper == null) 117 { 118 ContextCapabilities capabilities = GLContext.getCapabilities(); 119 boolean has43 = false; 120 try 121 { 122 has43 = capabilities.getClass().getField("GL_ARB_copy_image").getBoolean(capabilities); 123 } 124 catch (Exception e) 125 { 126 e.printStackTrace(); 127 // NOOP - LWJGL needs updating 128 FMLLog.info("Forge Mod Loader has detected an older LWJGL version, new advanced texture animation features are disabled"); 129 } 130// if (has43 && Boolean.parseBoolean(System.getProperty("fml.useGL43","true"))) 131// { 132// FMLLog.info("Using the new OpenGL 4.3 advanced capability for animations"); 133// helper = new OpenGL43TextureHelper(); 134// } 135// else 136 { 137 FMLLog.info("Not using advanced OpenGL 4.3 advanced capability for animations : OpenGL 4.3 is %s", has43 ? "available" : "not available"); 138 helper = new CopySubimageTextureHelper(); 139 } 140 } 141 return helper; 142 } 143}