Fix Gate Rendering

Layers!
This commit is contained in:
CovertJaguar 2013-12-10 01:02:21 -08:00
parent 4a21f4ce24
commit acef0b4d60
12 changed files with 198 additions and 69 deletions

View file

@ -11,7 +11,7 @@ import net.minecraftforge.fluids.Fluid;
import org.lwjgl.opengl.GL11;
import buildcraft.core.utils.GL;
import buildcraft.core.render.RenderUtils;
import buildcraft.core.render.FluidRenderer;
public abstract class GuiAdvancedInterface extends GuiBuildCraft {
@ -188,7 +188,7 @@ public abstract class GuiAdvancedInterface extends GuiBuildCraft {
@Override
public void drawSprite(int cornerX, int cornerY) {
if (fluid != null) {
GL.color(colorRenderCache);
RenderUtils.setGLColorFromInt(colorRenderCache);
}
super.drawSprite(cornerX, cornerY);
}

View file

@ -6,7 +6,7 @@ import buildcraft.core.gui.tooltips.IToolTipProvider;
import buildcraft.core.gui.tooltips.ToolTip;
import buildcraft.core.gui.tooltips.ToolTipLine;
import buildcraft.core.gui.widgets.Widget;
import buildcraft.core.utils.GL;
import buildcraft.core.render.RenderUtils;
import buildcraft.core.utils.SessionVars;
import java.util.ArrayList;
import java.util.Collection;
@ -438,7 +438,7 @@ public abstract class GuiBuildCraft extends GuiContainer {
protected void drawBackground(int x, int y) {
GL.color(overlayColor);
RenderUtils.setGLColorFromInt(overlayColor);
mc.renderEngine.bindTexture(LEDGER_TEXTURE);
drawTexturedModalRect(x, y, 0, 256 - currentHeight, 4, currentHeight);

View file

@ -8,7 +8,6 @@
package buildcraft.core.render;
import buildcraft.core.render.RenderEntityBlock.RenderInfo;
import buildcraft.core.utils.GL;
import java.util.HashMap;
import java.util.Map;
import net.minecraft.block.Block;
@ -67,7 +66,7 @@ public class FluidRenderer {
return;
int color = fluidstack.getFluid().getColor(fluidstack);
GL.color(color);
RenderUtils.setGLColorFromInt(color);
}
public static int[] getFluidDisplayLists(FluidStack fluidStack, World world, boolean flowing) {

View file

@ -1,9 +1,10 @@
package buildcraft.core.utils;
package buildcraft.core.render;
import org.lwjgl.opengl.GL11;
public class GL {
public static void color(int color) {
public class RenderUtils {
public static void setGLColorFromInt(int color) {
float red = (float) (color >> 16 & 255) / 255.0F;
float green = (float) (color >> 8 & 255) / 255.0F;
float blue = (float) (color & 255) / 255.0F;

View file

@ -17,7 +17,7 @@ import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidStack;
import buildcraft.core.DefaultProps;
import buildcraft.core.fluids.Tank;
import buildcraft.core.utils.GL;
import buildcraft.core.render.RenderUtils;
import buildcraft.core.utils.StringUtils;
import buildcraft.energy.TileEngineIron;
import buildcraft.energy.TileEngineWithInventory;
@ -68,7 +68,7 @@ public class GuiCombustionEngine extends GuiEngine {
liquidIcon = fluid.getStillIcon();
}
mc.renderEngine.bindTexture(BLOCK_TEXTURE);
GL.color(tank.colorRenderCache);
RenderUtils.setGLColorFromInt(tank.colorRenderCache);
if (liquidIcon != null) {
while (true) {

View file

@ -11,7 +11,7 @@ import buildcraft.core.DefaultProps;
import buildcraft.core.IInventoryRenderer;
import buildcraft.core.fluids.Tank;
import buildcraft.core.render.FluidRenderer;
import buildcraft.core.utils.GL;
import buildcraft.core.render.RenderUtils;
import buildcraft.factory.TileRefinery;
import net.minecraft.client.model.ModelBase;
import net.minecraft.client.model.ModelRenderer;
@ -188,7 +188,7 @@ public class RenderRefinery extends TileEntitySpecialRenderer implements IInvent
if (list1 != null) {
bindTexture(FluidRenderer.getFluidSheet(liquid1));
GL.color(color1);
RenderUtils.setGLColorFromInt(color1);
GL11.glCallList(list1[getDisplayListIndex(tile.tank1)]);
}
}
@ -200,7 +200,7 @@ public class RenderRefinery extends TileEntitySpecialRenderer implements IInvent
GL11.glPushMatrix();
GL11.glTranslatef(0, 0, 1);
bindTexture(FluidRenderer.getFluidSheet(liquid2));
GL.color(color2);
RenderUtils.setGLColorFromInt(color2);
GL11.glCallList(list2[getDisplayListIndex(tile.tank2)]);
GL11.glPopMatrix();
}
@ -214,7 +214,7 @@ public class RenderRefinery extends TileEntitySpecialRenderer implements IInvent
GL11.glPushMatrix();
GL11.glTranslatef(1, 0, 0.5F);
bindTexture(FluidRenderer.getFluidSheet(liquidResult));
GL.color(colorResult);
RenderUtils.setGLColorFromInt(colorResult);
GL11.glCallList(list3[getDisplayListIndex(tile.result)]);
GL11.glPopMatrix();
}

View file

@ -8,7 +8,7 @@
package buildcraft.factory.render;
import buildcraft.core.render.FluidRenderer;
import buildcraft.core.utils.GL;
import buildcraft.core.render.RenderUtils;
import buildcraft.factory.TileTank;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.tileentity.TileEntity;
@ -41,7 +41,7 @@ public class RenderTank extends TileEntitySpecialRenderer {
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
bindTexture(FluidRenderer.getFluidSheet(liquid));
GL.color(color);
RenderUtils.setGLColorFromInt(color);
GL11.glTranslatef((float) x + 0.125F, (float) y + 0.5F, (float) z + 0.125F);
GL11.glScalef(0.75F, 0.999F, 0.75F);

View file

@ -2,6 +2,7 @@ package buildcraft.transport;
import buildcraft.BuildCraftTransport;
import buildcraft.transport.render.FacadeItemRenderer;
import buildcraft.transport.render.GateItemRenderer;
import buildcraft.transport.render.PipeItemRenderer;
import buildcraft.transport.render.PipeRendererWorld;
import buildcraft.transport.render.PlugItemRenderer;
@ -11,10 +12,12 @@ import cpw.mods.fml.client.registry.RenderingRegistry;
import net.minecraftforge.client.MinecraftForgeClient;
public class TransportProxyClient extends TransportProxy {
public final static PipeItemRenderer pipeItemRenderer = new PipeItemRenderer();
public final static PipeRendererWorld pipeWorldRenderer = new PipeRendererWorld();
public final static FacadeItemRenderer facadeItemRenderer = new FacadeItemRenderer();
public final static PlugItemRenderer plugItemRenderer = new PlugItemRenderer();
public final static GateItemRenderer gateItemRenderer = new GateItemRenderer();
@Override
public void registerTileEntities() {
@ -64,11 +67,12 @@ public class TransportProxyClient extends TransportProxy {
MinecraftForgeClient.registerItemRenderer(BuildCraftTransport.facadeItem.itemID, facadeItemRenderer);
MinecraftForgeClient.registerItemRenderer(BuildCraftTransport.plugItem.itemID, plugItemRenderer);
MinecraftForgeClient.registerItemRenderer(BuildCraftTransport.pipeGate.itemID, gateItemRenderer);
TransportProxy.pipeModel = RenderingRegistry.getNextAvailableRenderId();
RenderingRegistry.registerBlockHandler(pipeWorldRenderer);
}
@Override
public void setIconProviderFromPipe(ItemPipe item, Pipe dummyPipe) {
item.setPipesIcons(dummyPipe.getIconProvider());

View file

@ -20,9 +20,6 @@ import net.minecraft.util.Icon;
public class ItemGate extends ItemBuildCraft {
@SideOnly(Side.CLIENT)
private Icon[] icons;
public ItemGate(int id) {
super(id);
setHasSubtypes(false);
@ -104,11 +101,6 @@ public class ItemGate extends ItemBuildCraft {
@Override
public Icon getIconIndex(ItemStack stack) {
return getIcon(stack, 0);
}
@Override
public Icon getIcon(ItemStack stack, int pass) {
return getLogic(stack).getIconItem();
}

View file

@ -2,7 +2,7 @@ package buildcraft.transport.render;
import buildcraft.BuildCraftTransport;
import buildcraft.core.CoreConstants;
import buildcraft.core.utils.GL;
import buildcraft.core.render.RenderUtils;
import buildcraft.transport.ItemFacade;
import buildcraft.transport.PipeIconProvider;
import net.minecraft.block.Block;
@ -24,7 +24,7 @@ public class FacadeItemRenderer implements IItemRenderer {
try {
int color = Item.itemsList[decodedBlockId].getColorFromItemStack(new ItemStack(decodedBlockId, 1, decodedMeta), 0);
GL.color(color);
RenderUtils.setGLColorFromInt(color);
} catch (Throwable error) {
}

View file

@ -0,0 +1,157 @@
package buildcraft.transport.render;
import buildcraft.transport.gates.ItemGate;
import java.util.Random;
import net.minecraft.item.ItemStack;
import net.minecraft.client.renderer.entity.RenderItem;
import net.minecraft.client.renderer.entity.RenderManager;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.util.Icon;
import net.minecraft.client.renderer.ItemRenderer;
import net.minecraftforge.client.IItemRenderer;
import net.minecraftforge.client.IItemRenderer.ItemRenderType;
import net.minecraftforge.client.IItemRenderer.ItemRendererHelper;
import org.lwjgl.opengl.GL11;
import net.minecraft.entity.item.EntityItem;
/**
*
* @author CovertJaguar <http://www.railcraft.info>
*/
public class GateItemRenderer implements IItemRenderer {
RenderItem renderItem = new RenderItem();
@Override
public boolean handleRenderType(ItemStack stack, ItemRenderType type) {
if (type == ItemRenderType.INVENTORY || type == ItemRenderType.ENTITY || type == ItemRenderType.EQUIPPED || type == ItemRenderType.EQUIPPED_FIRST_PERSON)
return true;
return false;
}
@Override
public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack stack, ItemRendererHelper helper) {
if (helper == ItemRendererHelper.ENTITY_BOBBING)
return true;
return false;
}
@Override
public void renderItem(ItemRenderType type, ItemStack stack, Object... data) {
if (type == ItemRenderType.INVENTORY)
render(ItemRenderType.INVENTORY, stack);
else if (type == ItemRenderType.ENTITY)
if (RenderManager.instance.options.fancyGraphics)
renderAsEntity(stack, (EntityItem) data[1]);
else
renderAsEntityFlat(stack);
else if (type == ItemRenderType.EQUIPPED || type == ItemRenderType.EQUIPPED_FIRST_PERSON) {
renderIn3D(stack);
}
}
private void renderIn3D(ItemStack stack) {
GL11.glPushMatrix();
renderLayerIn3D(ItemGate.getLogic(stack).getIconItem());
GL11.glScalef(1, 1, 1.05f);
renderLayerIn3D(ItemGate.getMaterial(stack).getIconItem());
GL11.glPopMatrix();
}
private void renderLayerIn3D(Icon icon) {
if (icon == null)
return;
GL11.glPushMatrix();
Tessellator tessellator = Tessellator.instance;
float uv1 = icon.getMinU();
float uv2 = icon.getMaxU();
float uv3 = icon.getMinV();
float uv4 = icon.getMaxV();
ItemRenderer.renderItemIn2D(tessellator, uv2, uv3, uv1, uv4, icon.getIconWidth(), icon.getIconHeight(), 0.0625F);
GL11.glPopMatrix();
}
private void renderAsEntity(ItemStack stack, EntityItem entity) {
GL11.glPushMatrix();
byte iterations = 1;
if (stack.stackSize > 1)
iterations = 2;
if (stack.stackSize > 15)
iterations = 3;
if (stack.stackSize > 31)
iterations = 4;
Random rand = new Random(187L);
float offsetZ = 0.0625F + 0.021875F;
GL11.glRotatef((((float) entity.age + 1.0F) / 20.0F + entity.hoverStart) * (180F / (float) Math.PI), 0.0F, 1.0F, 0.0F);
GL11.glTranslatef(-0.5F, -0.25F, -(offsetZ * (float) iterations / 2.0F));
for (int count = 0; count < iterations; ++count) {
if (count > 0) {
float offsetX = (rand.nextFloat() * 2.0F - 1.0F) * 0.3F / 0.5F;
float offsetY = (rand.nextFloat() * 2.0F - 1.0F) * 0.3F / 0.5F;
float z = (rand.nextFloat() * 2.0F - 1.0F) * 0.3F / 0.5F;
GL11.glTranslatef(offsetX, offsetY, offsetZ);
} else
GL11.glTranslatef(0f, 0f, offsetZ);
renderIn3D(stack);
}
GL11.glPopMatrix();
}
private void renderAsEntityFlat(ItemStack stack) {
GL11.glPushMatrix();
byte iterations = 1;
if (stack.stackSize > 1)
iterations = 2;
if (stack.stackSize > 15)
iterations = 3;
if (stack.stackSize > 31)
iterations = 4;
Random rand = new Random(187L);
for (int ii = 0; ii < iterations; ++ii) {
GL11.glPushMatrix();
GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F);
GL11.glRotatef(180 - RenderManager.instance.playerViewY, 0.0F, 1.0F, 0.0F);
if (ii > 0) {
float var12 = (rand.nextFloat() * 2.0F - 1.0F) * 0.3F;
float var13 = (rand.nextFloat() * 2.0F - 1.0F) * 0.3F;
float var14 = (rand.nextFloat() * 2.0F - 1.0F) * 0.3F;
GL11.glTranslatef(var12, var13, var14);
}
GL11.glTranslatef(0.5f, 0.8f, 0);
GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F);
GL11.glScalef(1f / 16f, 1f / 16f, 1);
render(ItemRenderType.ENTITY, stack);
GL11.glPopMatrix();
}
GL11.glPopMatrix();
}
private void render(ItemRenderType type, ItemStack stack) {
GL11.glPushMatrix();
GL11.glDisable(GL11.GL_LIGHTING);
Icon icon = ItemGate.getLogic(stack).getIconItem();
renderItem.renderIcon(0, 0, icon, 16, 16);
icon = ItemGate.getMaterial(stack).getIconItem();
if (icon != null) {
if (type == ItemRenderType.ENTITY)
GL11.glTranslatef(0, 0, -0.01f);
renderItem.renderIcon(0, 0, icon, 16, 16);
}
GL11.glEnable(GL11.GL_LIGHTING);
GL11.glPopMatrix();
}
}

View file

@ -16,7 +16,7 @@ import buildcraft.core.CoreConstants;
import buildcraft.core.render.RenderEntityBlock;
import buildcraft.core.render.RenderEntityBlock.RenderInfo;
import buildcraft.core.utils.EnumColor;
import buildcraft.core.utils.GL;
import buildcraft.core.render.RenderUtils;
import buildcraft.core.utils.MatrixTranformations;
import buildcraft.transport.Pipe;
import buildcraft.transport.PipeIconProvider;
@ -456,7 +456,11 @@ public class PipeRendererTESR extends TileEntitySpecialRenderer {
bindTexture(TextureMap.locationBlocksTexture);
renderGate(pipe, pipe.pipe.gate.logic.getIconDark());
renderGate(pipe, pipe.pipe.gate.logic.getIconDark(), 0);
Icon materialIcon = pipe.pipe.gate.material.getIconBlock();
if (materialIcon != null)
renderGate(pipe, materialIcon, 1);
RenderHelper.enableStandardItemLighting();
@ -464,9 +468,8 @@ public class PipeRendererTESR extends TileEntitySpecialRenderer {
GL11.glPopMatrix();
}
private void renderGate(TileGenericPipe tile, Icon icon) {
float min = CoreConstants.PIPE_MIN_POS + 0.05F;
float max = CoreConstants.PIPE_MAX_POS - 0.05F;
private void renderGate(TileGenericPipe tile, Icon icon, int layer) {
PipeRenderState state = tile.renderState;
@ -474,12 +477,15 @@ public class PipeRendererTESR extends TileEntitySpecialRenderer {
box.texture = icon;
float[][] zeroState = new float[3][2];
float min = CoreConstants.PIPE_MIN_POS + 0.05F;
float max = CoreConstants.PIPE_MAX_POS - 0.05F;
// X START - END
zeroState[0][0] = min;
zeroState[0][1] = max;
// Y START - END
zeroState[1][0] = CoreConstants.PIPE_MIN_POS - 0.10F;
zeroState[1][1] = CoreConstants.PIPE_MIN_POS + 0.001F;
zeroState[1][1] = CoreConstants.PIPE_MIN_POS + 0.001F + 0.01F * layer;
// Z START - END
zeroState[2][0] = min;
zeroState[2][1] = max;
@ -489,40 +495,12 @@ public class PipeRendererTESR extends TileEntitySpecialRenderer {
float[][] rotated = MatrixTranformations.deepClone(zeroState);
MatrixTranformations.transform(rotated, direction);
if (layer != 0)
box.setRenderSingleSide(direction.ordinal());
box.setBounds(rotated[0][0], rotated[1][0], rotated[2][0], rotated[0][1], rotated[1][1], rotated[2][1]);
RenderEntityBlock.INSTANCE.renderBlock(box, tile.worldObj, 0, 0, 0, tile.xCoord, tile.yCoord, tile.zCoord, true, true);
}
}
// if (shouldRenderNormalPipeSide(state, ForgeDirection.WEST)) {
// box.setBounds(CoreConstants.PIPE_MIN_POS - 0.10F, min, min, CoreConstants.PIPE_MIN_POS + 0.001F, max, max);
// RenderEntityBlock.INSTANCE.renderBlock(box, tile.worldObj, 0, 0, 0, tile.xCoord, tile.yCoord, tile.zCoord, true, true);
// }
//
// if (shouldRenderNormalPipeSide(state, ForgeDirection.EAST)) {
// box.setBounds(CoreConstants.PIPE_MAX_POS + 0.001F, min, min, CoreConstants.PIPE_MAX_POS + 0.10F, max, max);
// RenderEntityBlock.INSTANCE.renderBlock(box, tile.worldObj, 0, 0, 0, tile.xCoord, tile.yCoord, tile.zCoord, true, true);
// }
//
// if (shouldRenderNormalPipeSide(state, ForgeDirection.DOWN)) {
// box.setBounds(min, CoreConstants.PIPE_MIN_POS - 0.10F, min, max, CoreConstants.PIPE_MIN_POS + 0.001F, max);
// RenderEntityBlock.INSTANCE.renderBlock(box, tile.worldObj, 0, 0, 0, tile.xCoord, tile.yCoord, tile.zCoord, true, true);
// }
//
// if (shouldRenderNormalPipeSide(state, ForgeDirection.UP)) {
// box.setBounds(min, CoreConstants.PIPE_MAX_POS + 0.001F, min, max, CoreConstants.PIPE_MAX_POS + 0.10F, max);
// RenderEntityBlock.INSTANCE.renderBlock(box, tile.worldObj, 0, 0, 0, tile.xCoord, tile.yCoord, tile.zCoord, true, true);
// }
//
// if (shouldRenderNormalPipeSide(state, ForgeDirection.NORTH)) {
// box.setBounds(min, min, CoreConstants.PIPE_MIN_POS - 0.10F, max, max, CoreConstants.PIPE_MIN_POS + 0.001F);
// RenderEntityBlock.INSTANCE.renderBlock(box, tile.worldObj, 0, 0, 0, tile.xCoord, tile.yCoord, tile.zCoord, true, true);
// }
//
// if (shouldRenderNormalPipeSide(state, ForgeDirection.SOUTH)) {
// box.setBounds(min, min, CoreConstants.PIPE_MAX_POS + 0.001F, max, max, CoreConstants.PIPE_MAX_POS + 0.10F);
// RenderEntityBlock.INSTANCE.renderBlock(box, tile.worldObj, 0, 0, 0, tile.xCoord, tile.yCoord, tile.zCoord, true, true);
// }
}
private boolean shouldRenderNormalPipeSide(PipeRenderState state, ForgeDirection direction) {
@ -624,7 +602,6 @@ public class PipeRendererTESR extends TileEntitySpecialRenderer {
int i = side.ordinal();
FluidStack fluidStack = trans.renderCache[i];
int color = trans.colorRenderCache[i];
if (fluidStack == null || fluidStack.amount <= 0)
continue;
@ -666,13 +643,12 @@ public class PipeRendererTESR extends TileEntitySpecialRenderer {
default:
}
bindTexture(TextureMap.locationBlocksTexture);
GL.color(color);
RenderUtils.setGLColorFromInt(trans.colorRenderCache[i]);
GL11.glCallList(list);
GL11.glPopMatrix();
}
// CENTER
FluidStack fluidStack = trans.renderCache[ForgeDirection.UNKNOWN.ordinal()];
int color = trans.colorRenderCache[ForgeDirection.UNKNOWN.ordinal()];
if (fluidStack != null && fluidStack.amount > 0) {
DisplayFluidList d = getListFromBuffer(fluidStack, pipe.container.worldObj);
@ -681,7 +657,7 @@ public class PipeRendererTESR extends TileEntitySpecialRenderer {
int stage = (int) ((float) fluidStack.amount / (float) (trans.getCapacity()) * (LIQUID_STAGES - 1));
bindTexture(TextureMap.locationBlocksTexture);
GL.color(color);
RenderUtils.setGLColorFromInt(trans.colorRenderCache[ForgeDirection.UNKNOWN.ordinal()]);
if (above) {
GL11.glCallList(d.centerVertical[stage]);
@ -761,7 +737,7 @@ public class PipeRendererTESR extends TileEntitySpecialRenderer {
block.minX = min;
block.maxX = max;
GL.color(color.getLightHex());
RenderUtils.setGLColorFromInt(color.getLightHex());
RenderEntityBlock.INSTANCE.renderBlock(block, null, 0, 0, 0, false, true);
}
GL11.glPopMatrix();