Java tutorial
/******************************************************************************* * Copyright (c) 2011-2014 SirSengir. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser Public License v3 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/lgpl-3.0.txt * * Various Contributors including, but not limited to: * SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges ******************************************************************************/ package forestry.arboriculture.render; import net.minecraft.block.Block; import net.minecraft.client.renderer.EntityRenderer; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraftforge.client.IItemRenderer; import org.lwjgl.opengl.GL11; import forestry.arboriculture.gadgets.ForestryBlockLeaves; import forestry.arboriculture.gadgets.TileLeaves; import forestry.arboriculture.genetics.TreeHelper; import forestry.arboriculture.items.ItemLeavesBlock; import forestry.core.proxy.Proxies; import forestry.core.render.OverlayRenderingHandler; import forestry.core.utils.StackUtils; import forestry.plugins.PluginArboriculture; /** * Ugly but serviceable renderer for leaves, taking fruits into account. */ public class LeavesRenderingHandler extends OverlayRenderingHandler implements IItemRenderer { @Override public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { // see IItemRenderer section below for inventory rendering } @Override public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { TileLeaves tile = ForestryBlockLeaves.getLeafTile(world, x, y, z); if (tile == null) { return false; } // Render the plain leaf block. renderer.renderStandardBlock(block, x, y, z); // Render overlay for fruit leaves. IIcon fruitIcon = tile.getFruitTexture(); if (fruitIcon != null) { int fruitColor = tile.getFruitColour(); renderFruitOverlay(world, block, x, y, z, renderer, fruitIcon, fruitColor); } return true; } @Override public boolean shouldRender3DInInventory(int modelId) { return true; } @Override public int getRenderId() { return PluginArboriculture.modelIdLeaves; } private boolean renderFruitOverlay(IBlockAccess world, Block block, int x, int y, int z, RenderBlocks renderer, IIcon texture, int multiplier) { float mR = (multiplier >> 16 & 255) / 255.0F; float mG = (multiplier >> 8 & 255) / 255.0F; float mB = (multiplier & 255) / 255.0F; if (EntityRenderer.anaglyphEnable) { mR = (mR * 30.0F + mG * 59.0F + mB * 11.0F) / 100.0F; mG = (mR * 30.0F + mG * 70.0F) / 100.0F; mB = (mR * 30.0F + mB * 70.0F) / 100.0F; } return renderFruitOverlayWithColorMultiplier(world, block, x, y, z, mR, mG, mB, renderer, texture); } private boolean renderFruitOverlayWithColorMultiplier(IBlockAccess world, Block block, int x, int y, int z, float r, float g, float b, RenderBlocks renderer, IIcon texture) { int mixedBrightness = block.getMixedBrightnessForBlock(world, x, y, z); float adjR = 0.5f * r; float adjG = 0.5f * g; float adjB = 0.5f * b; // Bottom renderBottomFace(world, block, x, y, z, renderer, texture, mixedBrightness, adjR, adjG, adjB); renderTopFace(world, block, x, y, z, renderer, texture, mixedBrightness, adjR, adjG, adjB); renderEastFace(world, block, x, y, z, renderer, texture, mixedBrightness, adjR, adjG, adjB); renderWestFace(world, block, x, y, z, renderer, texture, mixedBrightness, adjR, adjG, adjB); renderNorthFace(world, block, x, y, z, renderer, texture, mixedBrightness, adjR, adjG, adjB); renderSouthFace(world, block, x, y, z, renderer, texture, mixedBrightness, adjR, adjG, adjB); return true; } /* IItemRenderer */ @Override public boolean handleRenderType(ItemStack item, ItemRenderType type) { switch (type) { case ENTITY: case EQUIPPED_FIRST_PERSON: case EQUIPPED: case INVENTORY: return true; default: return false; } } @Override public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { return true; } @Override public void renderItem(ItemRenderType type, ItemStack item, Object... data) { switch (type) { case ENTITY: renderItem((RenderBlocks) data[0], item, 0f, 0f, 0f); break; case EQUIPPED: case EQUIPPED_FIRST_PERSON: renderItem((RenderBlocks) data[0], item, 0.5f, 0.5f, 0.5f); break; case INVENTORY: renderItem((RenderBlocks) data[0], item, 0f, 0f, 0f); break; default: } } private void renderItem(RenderBlocks renderer, ItemStack itemStack, float x, float y, float z) { Tessellator tessellator = Tessellator.instance; Block block = StackUtils.getBlock(itemStack); if (!(itemStack.getItem() instanceof ItemLeavesBlock) || block == null) { return; } TileLeaves leaves = new TileLeaves(); if (itemStack.hasTagCompound()) { leaves.readFromNBT(itemStack.getTagCompound()); } else { leaves.setTree(TreeHelper.treeTemplates.get(0)); } GL11.glEnable(GL11.GL_BLEND); IIcon leavesIcon = leaves.getIcon(Proxies.render.fancyGraphicsEnabled()); if (leavesIcon == null) { return; } int color = leaves.getFoliageColour(Proxies.common.getPlayer()); float r1 = (float) (color >> 16 & 255) / 255.0F; float g1 = (float) (color >> 8 & 255) / 255.0F; float b1 = (float) (color & 255) / 255.0F; GL11.glColor4f(r1, g1, b1, 1.0F); GL11.glTranslatef(x, y, z); block.setBlockBoundsForItemRender(); renderer.setRenderBoundsFromBlock(block); GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F); GL11.glTranslatef(-0.5F, -0.5F, -0.5F); tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, -1.0F, 0.0F); renderer.renderFaceYNeg(block, 0.0D, 0.0D, 0.0D, leavesIcon); tessellator.draw(); tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 1.0F, 0.0F); renderer.renderFaceYPos(block, 0.0D, 0.0D, 0.0D, leavesIcon); tessellator.draw(); tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 0.0F, -1.0F); renderer.renderFaceZNeg(block, 0.0D, 0.0D, 0.0D, leavesIcon); tessellator.draw(); tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 0.0F, 1.0F); renderer.renderFaceZPos(block, 0.0D, 0.0D, 0.0D, leavesIcon); tessellator.draw(); tessellator.startDrawingQuads(); tessellator.setNormal(-1.0F, 0.0F, 0.0F); renderer.renderFaceXNeg(block, 0.0D, 0.0D, 0.0D, leavesIcon); tessellator.draw(); tessellator.startDrawingQuads(); tessellator.setNormal(1.0F, 0.0F, 0.0F); renderer.renderFaceXPos(block, 0.0D, 0.0D, 0.0D, leavesIcon); tessellator.draw(); GL11.glTranslatef(0.5F, 0.5F, 0.5F); // add fruit if (!leaves.hasFruit()) { return; } IIcon fruitTexture = leaves.getFruitTexture(); if (fruitTexture == null) { return; } int fruitColor = leaves.getFruitColour(); float r2 = (float) (fruitColor >> 16 & 255) / 255.0F; float g2 = (float) (fruitColor >> 8 & 255) / 255.0F; float b2 = (float) (fruitColor & 255) / 255.0F; GL11.glColor4f(r2, g2, b2, 1.0F); block.setBlockBoundsForItemRender(); renderer.setRenderBoundsFromBlock(block); GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F); GL11.glTranslatef(-0.5F, -0.5F, -0.5F); tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, -1.0F, 0.0F); renderer.renderFaceYNeg(block, 0.0D, 0.0D - OVERLAY_SHIFT, 0.0D, fruitTexture); tessellator.draw(); tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 1.0F, 0.0F); renderer.renderFaceYPos(block, 0.0D, 0.0D + OVERLAY_SHIFT, 0.0D, fruitTexture); tessellator.draw(); tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 0.0F, -1.0F); renderer.renderFaceZNeg(block, 0.0D, 0.0D, 0.0D - OVERLAY_SHIFT, fruitTexture); tessellator.draw(); tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 0.0F, 1.0F); renderer.renderFaceZPos(block, 0.0D, 0.0D, 0.0D + OVERLAY_SHIFT, fruitTexture); tessellator.draw(); tessellator.startDrawingQuads(); tessellator.setNormal(-1.0F, 0.0F, 0.0F); renderer.renderFaceXNeg(block, 0.0D - OVERLAY_SHIFT, 0.0D, 0.0D, fruitTexture); tessellator.draw(); tessellator.startDrawingQuads(); tessellator.setNormal(1.0F, 0.0F, 0.0F); renderer.renderFaceXPos(block, 0.0D + OVERLAY_SHIFT, 0.0D, 0.0D, fruitTexture); tessellator.draw(); GL11.glTranslatef(0.5F, 0.5F, 0.5F); } }