package eiteam.esteemedinnovation.metalcasting.mold; import eiteam.esteemedinnovation.api.mold.CrucibleMold; import eiteam.esteemedinnovation.commons.EsteemedInnovation; import eiteam.esteemedinnovation.commons.util.RenderUtility; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.VertexBuffer; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.MathHelper; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import org.lwjgl.opengl.GL11; @SideOnly(Side.CLIENT) public class TileEntityMoldRenderer extends TileEntitySpecialRenderer<TileEntityMold> { private static final ResourceLocation MODEL_RL = new ResourceLocation(EsteemedInnovation.MOD_ID, "block/mold_top"); private static final float PX = (1F / 16F); @Override public void renderTileEntityAt(TileEntityMold mold, double x, double y, double z, float partialTicks, int destroyStage) { GlStateManager.pushMatrix(); GlStateManager.disableBlend(); GlStateManager.color(1, 1, 1, 1); GlStateManager.translate(x, y, z); GL11.glTranslatef(0.5F, 0.5F, 0.5F); EnumFacing dir = getWorld().getBlockState(mold.getPos()).getValue(BlockMold.FACING); if (dir == EnumFacing.SOUTH) { GlStateManager.rotate(180F, 0, 1, 0); } else if (dir == EnumFacing.EAST) { GlStateManager.rotate(270F, 0, 1, 0); } else if (dir == EnumFacing.WEST) { GlStateManager.rotate(90F, 0, 1, 0); } GlStateManager.pushMatrix(); GlStateManager.rotate(180F, 1, 0, 0); // FIXME: Z Fighting when really high above the mold. GlStateManager.translate(-0.5, (3.999F / 16F), -0.5); if (mold.mold != null) { renderMold(mold.mold, true); } GlStateManager.translate(0, 0.001, 0); GlStateManager.popMatrix(); GlStateManager.pushMatrix(); GlStateManager.rotate(180F, 0, 1, 0); GlStateManager.translate(0, -4 * PX, -6 * PX); float tick = (float) (Math.PI * (mold.changeTicks * 90.0F / 20.0F)) / 180.0F; float rotation = mold.isOpen ? 80F + MathHelper.sin(tick) * 100F : MathHelper.sin(tick) * -100F; if (mold.isOpen) { GlStateManager.rotate(180F, 1, 0, 0); } GlStateManager.rotate(rotation, 1, 0, 0); GlStateManager.translate(-0.5, -0.5, -0.5); GlStateManager.translate(0, 4 * PX, 6 * PX); RenderUtility.renderModel(Tessellator.getInstance().getBuffer(), MODEL_RL); bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE); Tessellator.getInstance().draw(); GlStateManager.popMatrix(); GlStateManager.pushMatrix(); GlStateManager.rotate(180F, 0, 1, 0); GlStateManager.translate(0, -4 * PX, -6 * PX); if (mold.isOpen) { GlStateManager.rotate(180F, 1, 0, 0); } GlStateManager.rotate(rotation, 1, 0, 0); GlStateManager.translate(-0.5, -0.5, -0.5); GlStateManager.translate(0, 4 * PX, 6 * PX); GlStateManager.translate(0, 3.999 * PX, 0); if (mold.mold != null) { renderMold(mold.mold, true); } GlStateManager.popMatrix(); GlStateManager.popMatrix(); } private void renderMold(ItemStack item, boolean bottom) { bindTexture(((CrucibleMold) item.getItem()).getBlockTexture(item)); Tessellator tessellator = Tessellator.getInstance(); VertexBuffer buffer = tessellator.getBuffer(); // buffer.putNormal(0F, 0F, 1F); buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX); if (bottom) { buffer.pos(0D, 0D, 0D).tex(0F, 0F).endVertex(); buffer.pos(1D, 0D, 0D).tex(1F, 0F).endVertex(); buffer.pos(1D, 0D, 1D).tex(1F, 1F).endVertex(); buffer.pos(0D, 0D, 1D).tex(0F, 1F).endVertex(); } else { buffer.pos(1D, 0D, 1D).tex(0F, 0F).endVertex(); buffer.pos(0D, 0D, 1D).tex(1F, 0F).endVertex(); buffer.pos(0D, 0D, 0D).tex(1F, 1F).endVertex(); buffer.pos(1D, 0D, 0D).tex(0F, 1F).endVertex(); } tessellator.draw(); } }