Mekanism-tilera-Edition/common/mekanism/client/render/MekanismRenderer.java

436 lines
12 KiB
Java
Raw Normal View History

package mekanism.client.render;
import java.util.Arrays;
2013-07-20 18:10:14 +02:00
import java.util.List;
2013-10-26 19:25:51 +02:00
import mekanism.api.EnumColor;
import mekanism.common.ISpecialBounds;
2013-10-14 20:59:48 +02:00
import mekanism.common.ObfuscatedNames;
import mekanism.common.util.MekanismUtils;
2013-10-26 19:25:51 +02:00
import mekanism.common.util.MekanismUtils.ResourceType;
import net.minecraft.block.Block;
2013-07-20 18:10:14 +02:00
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;
2013-10-14 04:50:21 +02:00
import net.minecraft.client.renderer.entity.RenderManager;
2013-07-20 18:10:14 +02:00
import net.minecraft.client.renderer.texture.TextureManager;
import net.minecraft.client.renderer.texture.TextureMap;
2013-10-14 04:50:21 +02:00
import net.minecraft.item.ItemStack;
import net.minecraft.util.Icon;
2013-07-20 18:10:14 +02:00
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.Timer;
2013-06-02 23:44:59 +02:00
import net.minecraftforge.common.ForgeDirection;
2013-07-20 18:10:14 +02:00
import net.minecraftforge.fluids.Fluid;
import org.lwjgl.opengl.GL11;
2013-10-14 04:50:21 +02:00
import org.lwjgl.opengl.GL12;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
@SideOnly(Side.CLIENT)
public class MekanismRenderer
{
private static RenderBlocks renderBlocks = new RenderBlocks();
2013-10-26 19:25:51 +02:00
public static Icon[] colors = new Icon[256];
private static float lightmapLastX;
private static float lightmapLastY;
2013-07-31 04:28:46 +02:00
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;
2013-06-02 23:44:59 +02:00
public Icon[] textures = new Icon[6];
public boolean[] renderSides = new boolean[] {true, true, true, true, true, true, false};
public Block baseBlock = Block.sand;
2013-06-02 23:44:59 +02:00
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;
}
}
2013-06-02 23:44:59 +02:00
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();
2013-06-02 23:44:59 +02:00
if(object.shouldSideRender(ForgeDirection.DOWN))
{
2013-06-02 23:44:59 +02:00
renderBlocks.renderFaceYNeg(null, 0, 0, 0, object.getBlockTextureFromSide(0));
}
2013-06-02 23:44:59 +02:00
if(object.shouldSideRender(ForgeDirection.UP))
{
2013-06-02 23:44:59 +02:00
renderBlocks.renderFaceYPos(null, 0, 0, 0, object.getBlockTextureFromSide(1));
}
2013-06-02 23:44:59 +02:00
if(object.shouldSideRender(ForgeDirection.NORTH))
{
2013-06-02 23:44:59 +02:00
renderBlocks.renderFaceZNeg(null, 0, 0, 0, object.getBlockTextureFromSide(2));
}
2013-06-02 23:44:59 +02:00
if(object.shouldSideRender(ForgeDirection.SOUTH))
{
2013-06-02 23:44:59 +02:00
renderBlocks.renderFaceZPos(null, 0, 0, 0, object.getBlockTextureFromSide(3));
}
2013-06-02 23:44:59 +02:00
if(object.shouldSideRender(ForgeDirection.WEST))
{
2013-06-02 23:44:59 +02:00
renderBlocks.renderFaceXNeg(null, 0, 0, 0, object.getBlockTextureFromSide(4));
}
2013-06-02 23:44:59 +02:00
if(object.shouldSideRender(ForgeDirection.EAST))
{
2013-06-02 23:44:59 +02:00
renderBlocks.renderFaceXPos(null, 0, 0, 0, object.getBlockTextureFromSide(5));
}
2013-06-02 23:44:59 +02:00
if(Tessellator.instance.isDrawing)
{
Tessellator.instance.draw();
}
}
2013-10-26 19:25:51 +02:00
public static ResourceLocation getColorResource(EnumColor color)
{
return MekanismUtils.getResource(ResourceType.TEXTURE_BLOCKS, "Overlay" + color.friendlyName.replace(" ", "") + ".png");
}
public static Icon getColorIcon(EnumColor color)
{
if(colors[color.ordinal()] == null)
{
colors[color.ordinal()] = getTextureMap(0).registerIcon("mekanism:Overlay" + color.getName());
}
return colors[color.ordinal()];
}
public static void glowOn()
{
GL11.glPushAttrib(GL11.GL_LIGHTING_BIT);
2013-08-25 18:35:12 +02:00
2013-07-31 04:28:46 +02:00
try
{
lightmapLastX = OpenGlHelper.lastBrightnessX;
lightmapLastY = OpenGlHelper.lastBrightnessY;
}
catch(NoSuchFieldError e)
{
optifineBreak = true;
}
2013-08-25 18:35:12 +02:00
RenderHelper.disableStandardItemLighting();
2013-08-25 18:35:12 +02:00
2013-07-31 04:28:46 +02:00
if(!optifineBreak)
{
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240.0F, 240.0F);
}
}
public static void glowOff()
{
2013-07-31 04:28:46 +02:00
if(!optifineBreak)
{
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, lightmapLastX, lightmapLastY);
}
2013-08-25 18:35:12 +02:00
GL11.glPopAttrib();
}
2013-11-03 05:14:54 +01:00
public static void blendOn()
{
GL11.glShadeModel(GL11.GL_SMOOTH);
GL11.glEnable(GL11.GL_BLEND);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
}
public static void blendOff()
{
GL11.glShadeModel(GL11.GL_FLAT);
GL11.glDisable(GL11.GL_LINE_SMOOTH);
GL11.glDisable(GL11.GL_POLYGON_SMOOTH);
GL11.glDisable(GL11.GL_BLEND);
}
2013-10-14 04:50:21 +02:00
/**
* Cleaned-up snip of ItemRenderer.renderItem() -- meant to render 2D items as equipped.
* @param item - ItemStack to render
*/
public static void renderItem(ItemStack item)
{
Icon icon = item.getItem().getIconIndex(item);
TextureManager texturemanager = Minecraft.getMinecraft().getTextureManager();
if(icon == null)
{
GL11.glPopMatrix();
return;
}
texturemanager.bindTexture(texturemanager.getResourceLocation(item.getItemSpriteNumber()));
Tessellator tessellator = Tessellator.instance;
2013-10-14 20:08:15 +02:00
float minU = icon.getMinU();
float maxU = icon.getMaxU();
float minV = icon.getMinV();
float maxV = icon.getMaxV();
2013-10-14 04:50:21 +02:00
GL11.glEnable(GL12.GL_RESCALE_NORMAL);
2013-10-14 20:08:15 +02:00
GL11.glTranslatef(0.0F, -0.3F, 0.0F);
GL11.glScalef(1.5F, 1.5F, 1.5F);
2013-10-14 04:50:21 +02:00
GL11.glRotatef(50.0F, 0.0F, 1.0F, 0.0F);
GL11.glRotatef(335.0F, 0.0F, 0.0F, 1.0F);
GL11.glTranslatef(-0.9375F, -0.0625F, 0.0F);
2013-10-14 20:08:15 +02:00
RenderManager.instance.itemRenderer.renderItemIn2D(tessellator, maxU, minV, minU, maxV, icon.getIconWidth(), icon.getIconHeight(), 0.0625F);
2013-10-14 04:50:21 +02:00
GL11.glDisable(GL12.GL_RESCALE_NORMAL);
}
/**
* 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);
2013-08-25 18:35:12 +02:00
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();
2013-08-25 18:35:12 +02:00
GL11.glTranslatef(0.5F, 0.5F, 0.5F);
}
2013-07-20 18:10:14 +02:00
public static void colorFluid(Fluid fluid)
{
2013-07-20 18:10:14 +02:00
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);
}
}
2013-07-20 18:10:14 +02:00
public static TextureMap getTextureMap(int type)
{
try {
2013-10-14 20:59:48 +02:00
List l = (List)MekanismUtils.getPrivateValue(Minecraft.getMinecraft().renderEngine, TextureManager.class, ObfuscatedNames.TextureManager_listTickables);
2013-07-20 18:10:14 +02:00
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);
}
}
2013-07-20 18:10:14 +02:00
public static float getPartialTicks()
{
try {
2013-10-14 20:59:48 +02:00
Timer t = (Timer)MekanismUtils.getPrivateValue(Minecraft.getMinecraft(), Minecraft.class, ObfuscatedNames.Minecraft_timer);
2013-07-20 18:10:14 +02:00
return t.renderPartialTicks;
} catch(Exception e) {}
return 0;
}
public static ResourceLocation getLiquidTexture()
{
return TextureMap.locationBlocksTexture;
2013-07-20 18:10:14 +02:00
}
}