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.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}; 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 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 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; } }