package buildcraft.transport.render; import org.lwjgl.opengl.GL11; import net.minecraft.block.Block; import net.minecraft.client.renderer.GLAllocation; import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.entity.item.EntityItem; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import buildcraft.BuildCraftTransport; import buildcraft.api.core.EnumColor; import buildcraft.api.core.Position; import buildcraft.api.items.IItemCustomPipeRender; import buildcraft.core.lib.render.RenderEntityBlock; import buildcraft.core.lib.render.RenderUtils; import buildcraft.transport.Pipe; import buildcraft.transport.PipeIconProvider; import buildcraft.transport.PipeTransportItems; import buildcraft.transport.TravelingItem; public class PipeTransportItemsRenderer extends PipeTransportRenderer<PipeTransportItems> { private static final EntityItem dummyEntityItem = new EntityItem(null); private static final RenderItem customRenderItem; private static final int MAX_ITEMS_TO_RENDER = 10; static { customRenderItem = new RenderItem() { @Override public boolean shouldBob() { return false; } @Override public boolean shouldSpreadItems() { return false; } }; customRenderItem.setRenderManager(RenderManager.instance); } private int getItemLightLevel(ItemStack stack) { if (stack.getItem() instanceof ItemBlock) { Block b = Block.getBlockFromItem(stack.getItem()); return b.getLightValue(); } return 0; } public void doRenderItem(TravelingItem travellingItem, double x, double y, double z, float light, EnumColor color) { if (travellingItem == null || travellingItem.getItemStack() == null) { return; } float renderScale = 0.7f; ItemStack itemstack = travellingItem.getItemStack(); GL11.glPushMatrix(); GL11.glTranslatef((float) x, (float) y + 0.25F, (float) z); GL11.glEnable(GL11.GL_ALPHA_TEST); //OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, skylight << 4, Math.max(blocklight, getItemLightLevel(itemstack)) << 4); if (travellingItem.hasDisplayList) { GL11.glCallList(travellingItem.displayList); } else { travellingItem.displayList = GLAllocation.generateDisplayLists(1); travellingItem.hasDisplayList = true; GL11.glNewList(travellingItem.displayList, GL11.GL_COMPILE_AND_EXECUTE); if (itemstack.getItem() instanceof IItemCustomPipeRender) { IItemCustomPipeRender render = (IItemCustomPipeRender) itemstack.getItem(); float itemScale = render.getPipeRenderScale(itemstack); GL11.glScalef(renderScale * itemScale, renderScale * itemScale, renderScale * itemScale); itemScale = 1 / itemScale; if (!render.renderItemInPipe(itemstack, x, y, z)) { dummyEntityItem.setEntityItemStack(itemstack); customRenderItem.doRender(dummyEntityItem, 0, 0, 0, 0, 0); } GL11.glScalef(itemScale, itemScale, itemScale); } else { GL11.glScalef(renderScale, renderScale, renderScale); dummyEntityItem.setEntityItemStack(itemstack); customRenderItem.doRender(dummyEntityItem, 0, 0, 0, 0, 0); } GL11.glEndList(); } if (color != null) { bindTexture(TextureMap.locationBlocksTexture); RenderEntityBlock.RenderInfo block = new RenderEntityBlock.RenderInfo(); block.texture = BuildCraftTransport.instance.pipeIconProvider.getIcon(PipeIconProvider.TYPE.ItemBox.ordinal()); float pix = 0.0625F; float min = -4 * pix; float max = 4 * pix; block.minY = min; block.maxY = max; block.minZ = min; block.maxZ = max; block.minX = min; block.maxX = max; RenderUtils.setGLColorFromInt(color.getLightHex()); RenderEntityBlock.INSTANCE.renderBlock(block); } GL11.glPopMatrix(); } @Override public void render(Pipe<PipeTransportItems> pipe, double x, double y, double z, float f) { GL11.glPushMatrix(); int count = 0; for (TravelingItem item : pipe.transport.items) { if (count >= MAX_ITEMS_TO_RENDER) { break; } Position motion = new Position(0, 0, 0, item.toCenter ? item.input : item.output); motion.moveForwards(item.getSpeed() * f); doRenderItem(item, x + item.xCoord - pipe.container.xCoord + motion.x, y + item.yCoord - pipe.container.yCoord + motion.y, z + item.zCoord - pipe.container.zCoord + motion.z, 0.0F, item.color); count++; } GL11.glPopMatrix(); } }