package net.minecraftforge.client; import java.util.IdentityHashMap; import java.util.Map; import com.google.common.collect.Maps; import gnu.trove.map.hash.TIntObjectHashMap; import gnu.trove.procedure.TIntObjectProcedure; import net.minecraft.client.renderer.ItemModelMesher; import net.minecraft.client.renderer.block.model.IBakedModel; import net.minecraft.client.renderer.block.model.ModelManager; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.item.Item; /** * Wrapper around ItemModeMesher that cleans up the internal maps to respect ID remapping. */ public class ItemModelMesherForge extends ItemModelMesher { IdentityHashMap> locations = Maps.newIdentityHashMap(); IdentityHashMap> models = Maps.newIdentityHashMap(); public ItemModelMesherForge(ModelManager manager) { super(manager); } protected IBakedModel getItemModel(Item item, int meta) { TIntObjectHashMap map = models.get(item); return map == null ? null : map.get(meta); } public void register(Item item, int meta, ModelResourceLocation location) { TIntObjectHashMap locs = locations.get(item); TIntObjectHashMap mods = models.get(item); if (locs == null) { locs = new TIntObjectHashMap(); locations.put(item, locs); } if (mods == null) { mods = new TIntObjectHashMap(); models.put(item, mods); } locs.put(meta, location); mods.put(meta, getModelManager().getModel(location)); } public void rebuildCache() { final ModelManager manager = this.getModelManager(); for (Map.Entry> e : locations.entrySet()) { TIntObjectHashMap mods = models.get(e.getKey()); if (mods != null) { mods.clear(); } else { mods = new TIntObjectHashMap(); models.put(e.getKey(), mods); } final TIntObjectHashMap map = mods; e.getValue().forEachEntry(new TIntObjectProcedure() { @Override public boolean execute(int meta, ModelResourceLocation location) { map.put(meta, manager.getModel(location)); return true; } }); } } }