package crazypants.enderio.machine; import java.util.List; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraftforge.client.IItemRenderer; import net.minecraftforge.common.util.ForgeDirection; import com.enderio.core.client.render.BoundingBox; import com.enderio.core.client.render.CubeRenderer; import com.enderio.core.client.render.CustomCubeRenderer; import com.enderio.core.client.render.CustomRenderBlocks; import com.enderio.core.client.render.IconUtil; import com.enderio.core.client.render.RenderUtil; import com.enderio.core.common.vecmath.Vertex; import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import crazypants.enderio.machine.painter.IPaintableTileEntity; import crazypants.enderio.machine.painter.PaintedBlockRenderer; import crazypants.enderio.machine.painter.PainterUtil; public class AbstractMachineRenderer implements ISimpleBlockRenderingHandler, IItemRenderer { private OverlayRenderer overlayRenderer = new OverlayRenderer() { @Override public void renderFace(CustomRenderBlocks rb, ForgeDirection face, Block par1Block, double x, double y, double z, IIcon texture, List<Vertex> refVertices, boolean translateToXyz) { ccr.getCustomRenderBlocks().doDefaultRenderFace(face, par1Block, x, y, z, texture); super.renderFace(rb, face, par1Block, x, y, z, texture, refVertices, translateToXyz); } }; private CustomCubeRenderer ccr = new CustomCubeRenderer(); private PaintedBlockRenderer paintedRenderer = new PaintedBlockRenderer(this.getRenderId(), null); // passthrough renderer for paintable machines @Override public boolean handleRenderType(ItemStack item, ItemRenderType type) { return true; } @Override public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { return true; } @Override public void renderItem(ItemRenderType type, ItemStack item, Object... data) { Block block; if((block = PainterUtil.getSourceBlock(item)) != null) { paintedRenderer.renderInventoryBlock(block, PainterUtil.getSourceBlockMetadata(item), 0, (RenderBlocks) data[0]); } else { renderInventoryBlock(Block.getBlockFromItem(item.getItem()), item.getItemDamage(), 0, (RenderBlocks) data[0]); } } @Override public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { BoundingBox bb = BoundingBox.UNIT_CUBE; bb = bb.translate(0, -0.1f, 0); Tessellator.instance.startDrawingQuads(); IIcon[] textures = RenderUtil.getBlockTextures(block, metadata); float[] brightnessPerSide = new float[6]; for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { brightnessPerSide[dir.ordinal()] = Math.max(RenderUtil.getColorMultiplierForFace(dir) + 0.1f, 1f); } CubeRenderer.render(bb, textures, null, brightnessPerSide); Tessellator.instance.draw(); } @Override public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { TileEntity te = world.getTileEntity(x, y, z); AbstractMachineEntity machine = null; if(te instanceof AbstractMachineEntity) { machine = (AbstractMachineEntity) te; } overlayRenderer.setTile(machine); if(te instanceof IPaintableTileEntity && ((IPaintableTileEntity) te).getSourceBlock() != null) { ccr.setOverrideTexture(IconUtil.blankTexture); ccr.renderBlock(world, block, x, y, z, overlayRenderer); ccr.setOverrideTexture(renderer.overrideBlockTexture); paintedRenderer.renderWorldBlock(world, x, y, z, block, modelId, renderer); } else { ccr.setOverrideTexture(renderer.overrideBlockTexture); ccr.renderBlock(world, block, x, y, z, overlayRenderer); } ccr.setOverrideTexture(null); return true; } @Override public boolean shouldRender3DInInventory(int modelId) { return true; } @Override public int getRenderId() { return AbstractMachineBlock.renderId; } }