/******************************************************************************* * AbyssalCraft * Copyright (c) 2012 - 2017 Shinoow. * 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 * * Contributors: * Shinoow - implementation ******************************************************************************/ package com.shinoow.abyssalcraft.client.render.entity; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.GlStateManager.DestFactor; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.VertexBuffer; import net.minecraft.client.renderer.GlStateManager.SourceFactor; import net.minecraft.client.renderer.entity.RenderLiving; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; 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; import com.shinoow.abyssalcraft.client.model.entity.ModelDragonBoss; import com.shinoow.abyssalcraft.client.render.entity.layers.LayerAsorahDeath; import com.shinoow.abyssalcraft.client.render.entity.layers.LayerAsorahEyes; import com.shinoow.abyssalcraft.common.entity.EntityDragonBoss; import com.shinoow.abyssalcraft.common.entity.EntityDragonMinion; @SideOnly(Side.CLIENT) public class RenderDragonBoss extends RenderLiving<EntityDragonBoss> { /** Scale of the model to use */ private float scale = 1.5F; private static final ResourceLocation field_110842_f = new ResourceLocation("abyssalcraft:textures/model/boss/dragonboss_exploding.png"); private static final ResourceLocation field_110843_g = new ResourceLocation("textures/entity/endercrystal/endercrystal_beam.png"); private static final ResourceLocation field_110844_k = new ResourceLocation("abyssalcraft:textures/model/boss/dragonboss.png"); /** An instance of the dragon model in RenderDragon */ protected ModelDragonBoss modelDragon; public RenderDragonBoss(RenderManager manager) { super(manager, new ModelDragonBoss(0.0F), 0.9F); modelDragon = (ModelDragonBoss)mainModel; addLayer(new LayerAsorahEyes(this)); addLayer(new LayerAsorahDeath()); } /** * Applies the scale to the transform matrix */ protected void preRenderScale(EntityDragonBoss par1EntityDragonMinion, float par2) { GlStateManager.scale(scale, scale, scale); } /** * Used to rotate the dragon as a whole in RenderDragon. It's called in the rotateCorpse method. */ @Override protected void applyRotations(EntityDragonBoss par1entitydragonboss, float par2, float par3, float par4) { float f3 = (float)par1entitydragonboss.getMovementOffsets(7, par4)[0]; float f4 = (float)(par1entitydragonboss.getMovementOffsets(5, par4)[1] - par1entitydragonboss.getMovementOffsets(10, par4)[1]); GlStateManager.rotate(-f3, 0.0F, 1.0F, 0.0F); GlStateManager.rotate(f4 * 10.0F, 1.0F, 0.0F, 0.0F); GlStateManager.translate(0.0F, 0.0F, 1.0F); if (par1entitydragonboss.deathTime > 0) { float f5 = (par1entitydragonboss.deathTime + par4 - 1.0F) / 20.0F * 1.6F; f5 = MathHelper.sqrt(f5); if (f5 > 1.0F) f5 = 1.0F; GlStateManager.rotate(f5 * getDeathMaxRotation(par1entitydragonboss), 0.0F, 0.0F, 1.0F); } } /** * Renders the dragon model. Called by renderModel. */ @Override protected void renderModel(EntityDragonBoss par1EntityDragonBoss, float par2, float par3, float par4, float par5, float par6, float par7) { if (par1EntityDragonBoss.deathTicks > 0) { float f6 = par1EntityDragonBoss.deathTicks / 200.0F; GL11.glDepthFunc(GL11.GL_LEQUAL); GlStateManager.enableAlpha(); GL11.glAlphaFunc(GL11.GL_GREATER, f6); bindTexture(field_110842_f); mainModel.render(par1EntityDragonBoss, par2, par3, par4, par5, par6, par7); GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F); GL11.glDepthFunc(GL11.GL_EQUAL); } bindEntityTexture(par1EntityDragonBoss); mainModel.render(par1EntityDragonBoss, par2, par3, par4, par5, par6, par7); if (par1EntityDragonBoss.hurtTime > 0) { GL11.glDepthFunc(GL11.GL_EQUAL); GlStateManager.disableTexture2D(); GlStateManager.enableBlend(); GlStateManager.blendFunc(SourceFactor.SRC_ALPHA, DestFactor.ONE_MINUS_SRC_ALPHA); GlStateManager.color(1.0F, 0.0F, 0.0F, 0.5F); mainModel.render(par1EntityDragonBoss, par2, par3, par4, par5, par6, par7); GlStateManager.enableTexture2D(); GlStateManager.disableBlend(); GL11.glDepthFunc(GL11.GL_LEQUAL); } } /** * Renders the dragon, along with its dying animation */ @Override public void doRender(EntityDragonBoss dragon, double par2, double par4, double par6, float par8, float par9) { // BossStatus.setBossStatus(dragon, false); super.doRender(dragon, par2, par4, par6, par8, par9); if (dragon.healingcircle != null) { float f = EntityDragonMinion.innerRotation + par9; float f1 = MathHelper.sin(f * 0.2F) / 2.0F + 0.5F; f1 = (f1 * f1 + f1) * 0.2F; float f2 = (float)(dragon.healingcircle.posX - dragon.posX - (dragon.prevPosX - dragon.posX) * (1.0F - par9)); float f3 = (float)(f1 + dragon.healingcircle.posY - 1.0D - dragon.posY - (dragon.prevPosY - dragon.posY) * (1.0F - par9)); float f4 = (float)(dragon.healingcircle.posZ - dragon.posZ - (dragon.prevPosZ - dragon.posZ) * (1.0F - par9)); float f5 = MathHelper.sqrt(f2 * f2 + f4 * f4); float f6 = MathHelper.sqrt(f2 * f2 + f3 * f3 + f4 * f4); GlStateManager.pushMatrix(); GlStateManager.translate((float)par2, (float)par4 + 2.0F, (float)par6); GlStateManager.rotate((float)-Math.atan2(f4, f2) * 180.0F / (float)Math.PI - 90.0F, 0.0F, 1.0F, 0.0F); GlStateManager.rotate((float)-Math.atan2(f5, f3) * 180.0F / (float)Math.PI - 90.0F, 1.0F, 0.0F, 0.0F); Tessellator tessellator = Tessellator.getInstance(); VertexBuffer worldrenderer = tessellator.getBuffer(); RenderHelper.disableStandardItemLighting(); GlStateManager.disableCull(); bindTexture(field_110842_f); GlStateManager.shadeModel(7425); float f7 = 0.0F - (dragon.ticksExisted + par9) * 0.01F; float f8 = MathHelper.sqrt(f2 * f2 + f3 * f3 + f4 * f4) / 32.0F - (dragon.ticksExisted + par9) * 0.01F; worldrenderer.begin(5, DefaultVertexFormats.POSITION_TEX_COLOR); for (int j = 0; j <= 8; ++j) { float f9 = MathHelper.sin(j % 8 * (float)Math.PI * 2.0F / 8.0F) * 0.75F; float f10 = MathHelper.cos(j % 8 * (float)Math.PI * 2.0F / 8.0F) * 0.75F; float f11 = j % 8 * 1.0F / 8.0F; worldrenderer.pos(f9 * 0.2F, f10 * 0.2F, 0.0D).tex(f11, f8).color(0, 0, 0, 255).endVertex(); worldrenderer.pos(f9, f10, f6).tex(f11, f7).color(255, 255, 255, 255).endVertex(); } tessellator.draw(); GlStateManager.enableCull(); GlStateManager.shadeModel(7424); RenderHelper.enableStandardItemLighting(); GlStateManager.popMatrix(); } } protected ResourceLocation func_110841_a(EntityDragonBoss par1EntityDragonBoss) { return field_110844_k; } /** * Allows the render to do any OpenGL state modifications necessary before the model is rendered. Args: * entityLiving, partialTickTime */ @Override protected void preRenderCallback(EntityDragonBoss par1EntityLivingBase, float par2) { preRenderScale(par1EntityLivingBase, par2); } @Override protected ResourceLocation getEntityTexture(EntityDragonBoss par1Entity) { return func_110841_a(par1Entity); } }