| package mekanism.client; |
| |
| import java.util.Arrays; |
| import java.util.List; |
| |
| import mekanism.common.ISpecialBounds; |
| import mekanism.common.MekanismUtils; |
| import net.minecraft.block.Block; |
| import net.minecraft.client.Minecraft; |
| import net.minecraft.client.renderer.GLAllocation; |
| import net.minecraft.client.renderer.OpenGlHelper; |
| import net.minecraft.client.renderer.RenderBlocks; |
| import net.minecraft.client.renderer.RenderHelper; |
| import net.minecraft.client.renderer.Tessellator; |
| import net.minecraft.client.renderer.texture.TextureManager; |
| import net.minecraft.client.renderer.texture.TextureMap; |
| import net.minecraft.util.Icon; |
| import net.minecraft.util.ResourceLocation; |
| import net.minecraft.util.Timer; |
| import net.minecraftforge.common.ForgeDirection; |
| import net.minecraftforge.fluids.Fluid; |
| |
| import org.lwjgl.opengl.GL11; |
| |
| import cpw.mods.fml.relauncher.Side; |
| import cpw.mods.fml.relauncher.SideOnly; |
| |
| @SideOnly(Side.CLIENT) |
| public class MekanismRenderer |
| { |
| private static RenderBlocks renderBlocks = new RenderBlocks(); |
| |
| private static float lightmapLastX; |
| private static float lightmapLastY; |
| private static boolean optifineBreak = false; |
| |
| public static class Model3D |
| { |
| public double minX; |
| public double minY; |
| public double minZ; |
| public double maxX; |
| public double maxY; |
| public double maxZ; |
| |
| public Icon[] textures = new Icon[6]; |
| |
| public boolean[] renderSides = new boolean[] {true, true, true, true, true, true, false}; |
| |
| public Block baseBlock = Block.sand; |
| |
| public final void setBlockBounds(float xNeg, float yNeg, float zNeg, float xPos, float yPos, float zPos) |
| { |
| minX = xNeg; |
| minY = yNeg; |
| minZ = zNeg; |
| maxX = xPos; |
| maxY = yPos; |
| maxZ = zPos; |
| } |
| |
| public void setSideRender(ForgeDirection side, boolean value) |
| { |
| renderSides[side.ordinal()] = value; |
| } |
| |
| public boolean shouldSideRender(ForgeDirection side) |
| { |
| return renderSides[side.ordinal()]; |
| } |
| |
| public Icon getBlockTextureFromSide(int i) |
| { |
| return textures[i]; |
| } |
| |
| public void setTexture(Icon tex) |
| { |
| Arrays.fill(textures, tex); |
| } |
| |
| public void setTextures(Icon down, Icon up, Icon north, Icon south, Icon west, Icon east) |
| { |
| textures[0] = down; |
| textures[1] = up; |
| textures[2] = north; |
| textures[3] = south; |
| textures[4] = west; |
| textures[5] = east; |
| } |
| } |
| |
| public static void renderObject(Model3D object) |
| { |
| if(object == null) |
| { |
| return; |
| } |
| |
| renderBlocks.renderMaxX = object.maxX; |
| renderBlocks.renderMinX = object.minX; |
| renderBlocks.renderMaxY = object.maxY; |
| renderBlocks.renderMinY = object.minY; |
| renderBlocks.renderMaxZ = object.maxZ; |
| renderBlocks.renderMinZ = object.minZ; |
| |
| renderBlocks.enableAO = false; |
| |
| Tessellator.instance.startDrawingQuads(); |
| |
| if(object.shouldSideRender(ForgeDirection.DOWN)) |
| { |
| renderBlocks.renderFaceYNeg(null, 0, 0, 0, object.getBlockTextureFromSide(0)); |
| } |
| |
| if(object.shouldSideRender(ForgeDirection.UP)) |
| { |
| renderBlocks.renderFaceYPos(null, 0, 0, 0, object.getBlockTextureFromSide(1)); |
| } |
| |
| if(object.shouldSideRender(ForgeDirection.NORTH)) |
| { |
| renderBlocks.renderFaceZNeg(null, 0, 0, 0, object.getBlockTextureFromSide(2)); |
| } |
| |
| if(object.shouldSideRender(ForgeDirection.SOUTH)) |
| { |
| renderBlocks.renderFaceZPos(null, 0, 0, 0, object.getBlockTextureFromSide(3)); |
| } |
| |
| if(object.shouldSideRender(ForgeDirection.WEST)) |
| { |
| renderBlocks.renderFaceXNeg(null, 0, 0, 0, object.getBlockTextureFromSide(4)); |
| } |
| |
| if(object.shouldSideRender(ForgeDirection.EAST)) |
| { |
| renderBlocks.renderFaceXPos(null, 0, 0, 0, object.getBlockTextureFromSide(5)); |
| } |
| |
| if(Tessellator.instance.isDrawing) |
| { |
| Tessellator.instance.draw(); |
| } |
| } |
| |
| public static void glowOn() |
| { |
| GL11.glPushAttrib(GL11.GL_LIGHTING_BIT); |
| try |
| { |
| lightmapLastX = OpenGlHelper.lastBrightnessX; |
| lightmapLastY = OpenGlHelper.lastBrightnessY; |
| } |
| catch(NoSuchFieldError e) |
| { |
| optifineBreak = true; |
| } |
| RenderHelper.disableStandardItemLighting(); |
| if(!optifineBreak) |
| { |
| OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240.0F, 240.0F); |
| } |
| |
| } |
| |
| public static void glowOff() |
| { |
| if(!optifineBreak) |
| { |
| OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, lightmapLastX, lightmapLastY); |
| } |
| GL11.glPopAttrib(); |
| } |
| |
| /** |
| * Cleaned-up snip of RenderBlocks.renderBlockAsItem() -- used for rendering an item as an entity, |
| * in a player's inventory, and in a player's hand. |
| * @param renderer - RenderBlocks renderer to render the item with |
| * @param metadata - block/item metadata |
| * @param block - block to render |
| */ |
| public static void renderItem(RenderBlocks renderer, int metadata, Block block) |
| { |
| if(!(block instanceof ISpecialBounds) || ((ISpecialBounds)block).doDefaultBoundSetting(metadata)) |
| { |
| block.setBlockBoundsForItemRender(); |
| } |
| |
| if(block instanceof ISpecialBounds) |
| { |
| ((ISpecialBounds)block).setRenderBounds(block, metadata); |
| } |
| |
| if(!(block instanceof ISpecialBounds) || ((ISpecialBounds)block).doDefaultBoundSetting(metadata)) |
| { |
| renderer.setRenderBoundsFromBlock(block); |
| } |
| else { |
| renderer.setRenderBounds(0, 0, 0, 1, 1, 1); |
| } |
| |
| if(renderer.useInventoryTint) |
| { |
| int renderColor = block.getRenderColor(metadata); |
| float red = (float)(renderColor >> 16 & 255) / 255.0F; |
| float green = (float)(renderColor >> 8 & 255) / 255.0F; |
| float blue = (float)(renderColor & 255) / 255.0F; |
| GL11.glColor4f(red, green, blue, 1.0F); |
| } |
| |
| GL11.glTranslatef(-0.5F, -0.5F, -0.5F); |
| Tessellator tessellator = Tessellator.instance; |
| tessellator.startDrawingQuads(); |
| tessellator.setNormal(0.0F, -1.0F, 0.0F); |
| renderer.renderFaceYNeg(block, 0.0D, 0.0D, 0.0D, block.getIcon(0, metadata)); |
| tessellator.draw(); |
| tessellator.startDrawingQuads(); |
| tessellator.setNormal(0.0F, 1.0F, 0.0F); |
| renderer.renderFaceYPos(block, 0.0D, 0.0D, 0.0D, block.getIcon(1, metadata)); |
| tessellator.draw(); |
| tessellator.startDrawingQuads(); |
| tessellator.setNormal(0.0F, 0.0F, -1.0F); |
| renderer.renderFaceZNeg(block, 0.0D, 0.0D, 0.0D, block.getIcon(2, metadata)); |
| tessellator.draw(); |
| tessellator.startDrawingQuads(); |
| tessellator.setNormal(0.0F, 0.0F, 1.0F); |
| renderer.renderFaceZPos(block, 0.0D, 0.0D, 0.0D, block.getIcon(3, metadata)); |
| tessellator.draw(); |
| tessellator.startDrawingQuads(); |
| tessellator.setNormal(-1.0F, 0.0F, 0.0F); |
| renderer.renderFaceXNeg(block, 0.0D, 0.0D, 0.0D, block.getIcon(4, metadata)); |
| tessellator.draw(); |
| tessellator.startDrawingQuads(); |
| tessellator.setNormal(1.0F, 0.0F, 0.0F); |
| renderer.renderFaceXPos(block, 0.0D, 0.0D, 0.0D, block.getIcon(5, metadata)); |
| tessellator.draw(); |
| GL11.glTranslatef(0.5F, 0.5F, 0.5F); |
| } |
| |
| public static void colorFluid(Fluid fluid) |
| { |
| int color = fluid.getColor(); |
| |
| float cR = (color >> 16 & 0xFF) / 255.0F; |
| float cG = (color >> 8 & 0xFF) / 255.0F; |
| float cB = (color & 0xFF) / 255.0F; |
| |
| GL11.glColor4f(cR, cG, cB, 1.0F); |
| } |
| |
| public static class DisplayInteger |
| { |
| public int display; |
| |
| @Override |
| public int hashCode() |
| { |
| int code = 1; |
| code = 31 * code + display; |
| return code; |
| } |
| |
| @Override |
| public boolean equals(Object obj) |
| { |
| return obj instanceof DisplayInteger && ((DisplayInteger)obj).display == display; |
| } |
| |
| public static DisplayInteger createAndStart() |
| { |
| DisplayInteger newInteger = new DisplayInteger(); |
| newInteger.display = GLAllocation.generateDisplayLists(1); |
| GL11.glNewList(newInteger.display, GL11.GL_COMPILE); |
| return newInteger; |
| } |
| |
| public static void endList() |
| { |
| GL11.glEndList(); |
| } |
| |
| public void render() |
| { |
| GL11.glCallList(display); |
| } |
| } |
| |
| public static TextureMap getTextureMap(int type) |
| { |
| try { |
| List l = (List)MekanismUtils.getPrivateValue(Minecraft.getMinecraft().renderEngine, TextureManager.class, "field_110583_b"); |
| |
| for(Object obj : l) |
| { |
| if(obj instanceof TextureMap) |
| { |
| if(((TextureMap)obj).textureType == type) |
| { |
| return (TextureMap)obj; |
| } |
| } |
| } |
| } catch(Exception e) {} |
| |
| return null; |
| } |
| |
| public static class BooleanArray |
| { |
| private final boolean[] boolArray; |
| |
| public BooleanArray(boolean[] array) |
| { |
| boolArray = array.clone(); |
| } |
| |
| @Override |
| public boolean equals(Object o) |
| { |
| if(o instanceof BooleanArray) |
| { |
| return Arrays.equals(boolArray, ((BooleanArray)o).boolArray); |
| } |
| else if(o instanceof boolean[]) |
| { |
| return Arrays.equals(boolArray, (boolean[])o); |
| } |
| else |
| { |
| return false; |
| } |
| } |
| |
| @Override |
| public int hashCode() |
| { |
| return Arrays.hashCode(boolArray); |
| } |
| } |
| |
| public static float getPartialTicks() |
| { |
| try { |
| Timer t = (Timer)MekanismUtils.getPrivateValue(Minecraft.getMinecraft(), Minecraft.class, "timer"); |
| return t.renderPartialTicks; |
| } catch(Exception e) {} |
| |
| return 0; |
| } |
| |
| public static ResourceLocation getLiquidTexture() |
| { |
| return TextureMap.field_110575_b; |
| } |
| } |