| package mekanism.client.render.obj; |
| |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| |
| import javax.vecmath.Matrix4f; |
| |
| import mekanism.api.EnumColor; |
| import mekanism.client.render.ctm.CTMModelFactory; |
| import mekanism.common.multipart.ColorProperty; |
| import mekanism.common.multipart.PartGlowPanel; |
| import net.minecraft.block.state.IBlockState; |
| import net.minecraft.client.Minecraft; |
| import net.minecraft.client.renderer.GlStateManager; |
| import net.minecraft.client.renderer.block.model.BakedQuad; |
| import net.minecraft.client.renderer.block.model.IBakedModel; |
| import net.minecraft.client.renderer.block.model.ItemCameraTransforms; |
| import net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType; |
| import net.minecraft.client.renderer.block.model.ItemOverrideList; |
| import net.minecraft.client.renderer.texture.TextureAtlasSprite; |
| import net.minecraft.client.renderer.vertex.VertexFormat; |
| import net.minecraft.entity.EntityLivingBase; |
| import net.minecraft.item.ItemStack; |
| import net.minecraft.util.EnumFacing; |
| import net.minecraft.util.ResourceLocation; |
| import net.minecraft.world.World; |
| import net.minecraftforge.client.model.IPerspectiveAwareModel; |
| import net.minecraftforge.client.model.ModelLoader; |
| import net.minecraftforge.client.model.obj.OBJModel; |
| import net.minecraftforge.client.model.obj.OBJModel.Face; |
| import net.minecraftforge.client.model.obj.OBJModel.OBJBakedModel; |
| import net.minecraftforge.common.model.IModelState; |
| import net.minecraftforge.common.property.IExtendedBlockState; |
| |
| import org.apache.commons.lang3.tuple.Pair; |
| |
| import com.google.common.collect.ImmutableList; |
| import com.google.common.collect.ImmutableMap; |
| import com.google.common.collect.Lists; |
| |
| public class GlowPanelModel extends OBJBakedModelBase |
| { |
| private static Map<Integer, List<BakedQuad>> glowPanelCache = new HashMap<Integer, List<BakedQuad>>(); |
| private static Map<Integer, GlowPanelModel> glowPanelItemCache = new HashMap<Integer, GlowPanelModel>(); |
| |
| private IBlockState tempState; |
| private ItemStack tempStack; |
| |
| private GlowPanelOverride override = new GlowPanelOverride(); |
| |
| public GlowPanelModel(IBakedModel base, OBJModel model, IModelState state, VertexFormat format, ImmutableMap<String, TextureAtlasSprite> textures, HashMap<TransformType, Matrix4f> transform) |
| { |
| super(base, model, state, format, textures, transform); |
| } |
| |
| public static void forceRebake() |
| { |
| glowPanelCache.clear(); |
| glowPanelItemCache.clear(); |
| } |
| |
| public EnumColor getColor() |
| { |
| if(tempStack != null) |
| { |
| return EnumColor.DYES[tempStack.getItemDamage()]; |
| } |
| |
| if(tempState != null) |
| { |
| return ((IExtendedBlockState)tempState).getValue(ColorProperty.INSTANCE).color; |
| } |
| |
| return EnumColor.WHITE; |
| } |
| |
| private class GlowPanelOverride extends ItemOverrideList |
| { |
| public GlowPanelOverride() |
| { |
| super(Lists.newArrayList()); |
| } |
| |
| @Override |
| public IBakedModel handleItemState(IBakedModel originalModel, ItemStack stack, World world, EntityLivingBase entity) |
| { |
| if(glowPanelItemCache.containsKey(stack.getItemDamage())) |
| { |
| return glowPanelItemCache.get(stack.getItemDamage()); |
| } |
| |
| ImmutableMap.Builder<String, TextureAtlasSprite> builder = ImmutableMap.builder(); |
| builder.put(ModelLoader.White.LOCATION.toString(), ModelLoader.White.INSTANCE); |
| TextureAtlasSprite missing = Minecraft.getMinecraft().getTextureMapBlocks().getAtlasSprite(new ResourceLocation("missingno").toString()); |
| |
| for(String s : getModel().getMatLib().getMaterialNames()) |
| { |
| TextureAtlasSprite sprite = null; |
| |
| if(sprite == null) |
| { |
| sprite = Minecraft.getMinecraft().getTextureMapBlocks().getAtlasSprite(getModel().getMatLib().getMaterial(s).getTexture().getTextureLocation().toString()); |
| } |
| |
| if(sprite == null) |
| { |
| sprite = missing; |
| } |
| |
| builder.put(s, sprite); |
| } |
| |
| builder.put("missingno", missing); |
| GlowPanelModel bakedModel = new GlowPanelModel(baseModel, getModel(), getState(), vertexFormat, builder.build(), transformationMap); |
| bakedModel.tempStack = stack; |
| glowPanelItemCache.put(stack.getItemDamage(), bakedModel); |
| |
| return bakedModel; |
| } |
| } |
| |
| @Override |
| public ItemOverrideList getOverrides() |
| { |
| return override; |
| } |
| |
| @Override |
| public List<BakedQuad> getQuads(IBlockState state, EnumFacing side, long rand) |
| { |
| if(side != null) |
| { |
| return ImmutableList.of(); |
| } |
| |
| int hash = PartGlowPanel.hash((IExtendedBlockState)state); |
| EnumColor color = ((IExtendedBlockState)state).getValue(ColorProperty.INSTANCE).color; |
| |
| if(!glowPanelCache.containsKey(hash)) |
| { |
| GlowPanelModel model = new GlowPanelModel(baseModel, getModel(), getState(), vertexFormat, textureMap, transformationMap); |
| model.tempState = state; |
| glowPanelCache.put(hash, model.getQuads(state, side, rand)); |
| } |
| |
| return glowPanelCache.get(hash); |
| } |
| |
| @Override |
| public float[] getOverrideColor(Face f, String groupName) |
| { |
| if(groupName.equals("light")) |
| { |
| EnumColor c = getColor(); |
| return new float[] {c.getColor(0), c.getColor(1), c.getColor(2), 1}; |
| } |
| |
| return null; |
| } |
| |
| private Pair<IPerspectiveAwareModel, Matrix4f> thirdPersonTransform; |
| |
| @Override |
| public Pair<? extends IPerspectiveAwareModel, Matrix4f> handlePerspective(ItemCameraTransforms.TransformType cameraTransformType) |
| { |
| if(cameraTransformType == TransformType.GUI) |
| { |
| GlStateManager.translate(0.3F, 0.25F, 0.0F); |
| GlStateManager.rotate(90, 1, 0, 0); |
| GlStateManager.scale(1.6F, 1.6F, 1.6F); |
| } |
| else if(cameraTransformType == TransformType.FIRST_PERSON_RIGHT_HAND) |
| { |
| GlStateManager.translate(0.0F, 0.3F, 0.0F); |
| } |
| else if(cameraTransformType == TransformType.THIRD_PERSON_RIGHT_HAND) |
| { |
| GlStateManager.translate(0.0F, -0.1F, 0.0F); |
| } |
| |
| return Pair.of(this, CTMModelFactory.transforms.get(cameraTransformType).getMatrix()); |
| } |
| } |