Java tutorial
/** * This class was created by <Vazkii>. It's distributed as * part of the ThaumicTinkerer Mod. * * ThaumicTinkerer is Open Source and distributed under a * Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License * (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB) * * ThaumicTinkerer is a Derivative Work on Thaumcraft 4. * Thaumcraft 4 (c) Azanor 2012 * (http://www.minecraftforum.net/topic/1585216-) * * File Created @ [9 Sep 2013, 17:12:26 (GMT)] */ package thaumic.tinkerer.client.render.tile; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.entity.item.EntityItem; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; import thaumic.tinkerer.client.core.helper.ClientHelper; import thaumic.tinkerer.client.lib.LibResources; import thaumic.tinkerer.common.block.tile.tablet.TileAnimationTablet; public class RenderTileAnimationTablet extends TileEntitySpecialRenderer { private static final ResourceLocation overlayCenter = new ResourceLocation(LibResources.MISC_AT_CENTER); private static final ResourceLocation overlayLeft = new ResourceLocation(LibResources.MISC_AT_LEFT); private static final ResourceLocation overlayRight = new ResourceLocation(LibResources.MISC_AT_RIGHT); private static final ResourceLocation overlayIndent = new ResourceLocation(LibResources.MISC_AT_INDENT); private static final float[][] TRANSLATIONS = new float[][] { { 0F, 0F, -1F }, { -1F, 0F, 0F }, { 0F, 0F, 0F }, { -1F, 0F, -1F } }; @Override public void renderTileEntityAt(TileEntity tileentity, double d0, double d1, double d2, float partialTicks) { TileAnimationTablet tile = (TileAnimationTablet) tileentity; int meta = tile.getBlockMetadata() & 7; if (meta < 2) meta = 2; // Just in case int rotation = meta == 2 ? 270 : meta == 3 ? 90 : meta == 4 ? 0 : 180; GL11.glPushMatrix(); GL11.glTranslated(d0, d1, d2); renderOverlay(tile, overlayCenter, -1, false, false, 0.65, 0.13F, 0F); if (tile.leftClick) renderOverlay(tile, overlayLeft, 1, false, true, 1, 0.13F, 0F); else renderOverlay(tile, overlayRight, 1, false, true, 1, 0.131F, 0F); renderOverlay(tile, overlayIndent, 0, false, false, 0.5F, 0.13F, rotation + 90F); GL11.glRotatef(rotation, 0F, 1F, 0F); GL11.glTranslated(0.1, 0.2 + Math.cos(System.currentTimeMillis() / 600D) / 18F, 0.5); float[] translations = TRANSLATIONS[meta - 2]; GL11.glTranslatef(translations[0], translations[1], translations[2]); GL11.glScalef(0.8F, 0.8F, 0.8F); GL11.glTranslatef(0.5F, 0F, 0.5F); GL11.glRotatef(tile.swingProgress, 0F, 0F, 1F); GL11.glTranslatef(-0.5F, 0F, -0.5F); GL11.glTranslatef(-tile.swingProgress / 250F, tile.swingProgress / 1000F, 0F); GL11.glRotatef((float) Math.cos(System.currentTimeMillis() / 400F) * 5F, 1F, 0F, 1F); renderItem(tile); GL11.glPopMatrix(); } private void renderItem(TileAnimationTablet tablet) { ItemStack stack = tablet.getStackInSlot(0); if (stack != null) { EntityItem entityitem = new EntityItem(tablet.getWorldObj(), 0.0D, 0.0D, 0.0D, stack); entityitem.getEntityItem().stackSize = 1; entityitem.hoverStart = 0.0F; GL11.glPushMatrix(); GL11.glTranslatef(0.5F, 0.55F, 0F); if (stack.getItem() instanceof ItemBlock) GL11.glScalef(2.5F, 2.5F, 2.5F); else GL11.glScalef(1.5F, 1.5F, 1.5F); RenderItem.renderInFrame = true; RenderManager.instance.renderEntityWithPosYaw(entityitem, 0.0D, 0.0D, 0.0D, 0.0F, 0.0F); RenderItem.renderInFrame = false; GL11.glPopMatrix(); } } private void renderOverlay(TileAnimationTablet tablet, ResourceLocation texture, int rotationMod, boolean useLighting, boolean useBlend, double size, float height, float forceDeg) { Minecraft mc = ClientHelper.minecraft(); mc.renderEngine.bindTexture(texture); GL11.glPushMatrix(); GL11.glDepthMask(false); if (!useLighting) GL11.glDisable(GL11.GL_LIGHTING); if (useBlend) { GL11.glEnable(GL11.GL_BLEND); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); } GL11.glTranslatef(0.5F, height, 0.5F); float deg = rotationMod == 0 ? forceDeg : (float) (tablet.ticksExisted * rotationMod % 360F); GL11.glRotatef(deg, 0F, 1F, 0F); GL11.glColor4f(1F, 1F, 1F, 1F); Tessellator tess = Tessellator.instance; double size1 = size / 2; double size2 = -size1; tess.startDrawingQuads(); tess.addVertexWithUV(size2, 0, size1, 0, 1); tess.addVertexWithUV(size1, 0, size1, 1, 1); tess.addVertexWithUV(size1, 0, size2, 1, 0); tess.addVertexWithUV(size2, 0, size2, 0, 0); tess.draw(); GL11.glDepthMask(true); if (!useLighting) GL11.glEnable(GL11.GL_LIGHTING); GL11.glPopMatrix(); } }