    001package net.minecraft.client.model;
    002
    003import cpw.mods.fml.relauncher.Side;
    004import cpw.mods.fml.relauncher.SideOnly;
    005import net.minecraft.entity.Entity;
    006import net.minecraft.entity.EntityLiving;
    007import net.minecraft.entity.boss.EntityDragon;
    008import org.lwjgl.opengl.GL11;
    009
    010@SideOnly(Side.CLIENT)
    011public class ModelDragon extends ModelBase
    012{
    013    /** The head Model renderer of the dragon */
    014    private ModelRenderer head;
    015
    016    /** The neck Model renderer of the dragon */
    017    private ModelRenderer neck;
    018
    019    /** The jaw Model renderer of the dragon */
    020    private ModelRenderer jaw;
    021
    022    /** The body Model renderer of the dragon */
    023    private ModelRenderer body;
    024
    025    /** The rear leg Model renderer of the dragon */
    026    private ModelRenderer rearLeg;
    027
    028    /** The front leg Model renderer of the dragon */
    029    private ModelRenderer frontLeg;
    030
    031    /** The rear leg tip Model renderer of the dragon */
    032    private ModelRenderer rearLegTip;
    033
    034    /** The front leg tip Model renderer of the dragon */
    035    private ModelRenderer frontLegTip;
    036
    037    /** The rear foot Model renderer of the dragon */
    038    private ModelRenderer rearFoot;
    039
    040    /** The front foot Model renderer of the dragon */
    041    private ModelRenderer frontFoot;
    042
    043    /** The wing Model renderer of the dragon */
    044    private ModelRenderer wing;
    045
    046    /** The wing tip Model renderer of the dragon */
    047    private ModelRenderer wingTip;
    048    private float partialTicks;
    049
    050    public ModelDragon(float par1)
    051    {
    052        this.textureWidth = 256;
    053        this.textureHeight = 256;
    054        this.setTextureOffset("body.body", 0, 0);
    055        this.setTextureOffset("wing.skin", -56, 88);
    056        this.setTextureOffset("wingtip.skin", -56, 144);
    057        this.setTextureOffset("rearleg.main", 0, 0);
    058        this.setTextureOffset("rearfoot.main", 112, 0);
    059        this.setTextureOffset("rearlegtip.main", 196, 0);
    060        this.setTextureOffset("head.upperhead", 112, 30);
    061        this.setTextureOffset("wing.bone", 112, 88);
    062        this.setTextureOffset("head.upperlip", 176, 44);
    063        this.setTextureOffset("jaw.jaw", 176, 65);
    064        this.setTextureOffset("frontleg.main", 112, 104);
    065        this.setTextureOffset("wingtip.bone", 112, 136);
    066        this.setTextureOffset("frontfoot.main", 144, 104);
    067        this.setTextureOffset("neck.box", 192, 104);
    068        this.setTextureOffset("frontlegtip.main", 226, 138);
    069        this.setTextureOffset("body.scale", 220, 53);
    070        this.setTextureOffset("head.scale", 0, 0);
    071        this.setTextureOffset("neck.scale", 48, 0);
    072        this.setTextureOffset("head.nostril", 112, 0);
    073        float f1 = -16.0F;
    074        this.head = new ModelRenderer(this, "head");
    075        this.head.addBox("upperlip", -6.0F, -1.0F, -8.0F + f1, 12, 5, 16);
    076        this.head.addBox("upperhead", -8.0F, -8.0F, 6.0F + f1, 16, 16, 16);
    077        this.head.mirror = true;
    078        this.head.addBox("scale", -5.0F, -12.0F, 12.0F + f1, 2, 4, 6);
    079        this.head.addBox("nostril", -5.0F, -3.0F, -6.0F + f1, 2, 2, 4);
    080        this.head.mirror = false;
    081        this.head.addBox("scale", 3.0F, -12.0F, 12.0F + f1, 2, 4, 6);
    082        this.head.addBox("nostril", 3.0F, -3.0F, -6.0F + f1, 2, 2, 4);
    083        this.jaw = new ModelRenderer(this, "jaw");
    084        this.jaw.setRotationPoint(0.0F, 4.0F, 8.0F + f1);
    085        this.jaw.addBox("jaw", -6.0F, 0.0F, -16.0F, 12, 4, 16);
    086        this.head.addChild(this.jaw);
    087        this.neck = new ModelRenderer(this, "neck");
    088        this.neck.addBox("box", -5.0F, -5.0F, -5.0F, 10, 10, 10);
    089        this.neck.addBox("scale", -1.0F, -9.0F, -3.0F, 2, 4, 6);
    090        this.body = new ModelRenderer(this, "body");
    091        this.body.setRotationPoint(0.0F, 4.0F, 8.0F);
    092        this.body.addBox("body", -12.0F, 0.0F, -16.0F, 24, 24, 64);
    093        this.body.addBox("scale", -1.0F, -6.0F, -10.0F, 2, 6, 12);
    094        this.body.addBox("scale", -1.0F, -6.0F, 10.0F, 2, 6, 12);
    095        this.body.addBox("scale", -1.0F, -6.0F, 30.0F, 2, 6, 12);
    096        this.wing = new ModelRenderer(this, "wing");
    097        this.wing.setRotationPoint(-12.0F, 5.0F, 2.0F);
    098        this.wing.addBox("bone", -56.0F, -4.0F, -4.0F, 56, 8, 8);
    099        this.wing.addBox("skin", -56.0F, 0.0F, 2.0F, 56, 0, 56);
    100        this.wingTip = new ModelRenderer(this, "wingtip");
    101        this.wingTip.setRotationPoint(-56.0F, 0.0F, 0.0F);
    102        this.wingTip.addBox("bone", -56.0F, -2.0F, -2.0F, 56, 4, 4);
    103        this.wingTip.addBox("skin", -56.0F, 0.0F, 2.0F, 56, 0, 56);
    104        this.wing.addChild(this.wingTip);
    105        this.frontLeg = new ModelRenderer(this, "frontleg");
    106        this.frontLeg.setRotationPoint(-12.0F, 20.0F, 2.0F);
    107        this.frontLeg.addBox("main", -4.0F, -4.0F, -4.0F, 8, 24, 8);
    108        this.frontLegTip = new ModelRenderer(this, "frontlegtip");
    109        this.frontLegTip.setRotationPoint(0.0F, 20.0F, -1.0F);
    110        this.frontLegTip.addBox("main", -3.0F, -1.0F, -3.0F, 6, 24, 6);
    111        this.frontLeg.addChild(this.frontLegTip);
    112        this.frontFoot = new ModelRenderer(this, "frontfoot");
    113        this.frontFoot.setRotationPoint(0.0F, 23.0F, 0.0F);
    114        this.frontFoot.addBox("main", -4.0F, 0.0F, -12.0F, 8, 4, 16);
    115        this.frontLegTip.addChild(this.frontFoot);
    116        this.rearLeg = new ModelRenderer(this, "rearleg");
    117        this.rearLeg.setRotationPoint(-16.0F, 16.0F, 42.0F);
    118        this.rearLeg.addBox("main", -8.0F, -4.0F, -8.0F, 16, 32, 16);
    119        this.rearLegTip = new ModelRenderer(this, "rearlegtip");
    120        this.rearLegTip.setRotationPoint(0.0F, 32.0F, -4.0F);
    121        this.rearLegTip.addBox("main", -6.0F, -2.0F, 0.0F, 12, 32, 12);
    122        this.rearLeg.addChild(this.rearLegTip);
    123        this.rearFoot = new ModelRenderer(this, "rearfoot");
    124        this.rearFoot.setRotationPoint(0.0F, 31.0F, 4.0F);
    125        this.rearFoot.addBox("main", -9.0F, 0.0F, -20.0F, 18, 6, 24);
    126        this.rearLegTip.addChild(this.rearFoot);
    127    }
    128
    129    /**
    130     * Used for easily adding entity-dependent animations. The second and third float params here are the same second
    131     * and third as in the setRotationAngles method.
    132     */
    133    public void setLivingAnimations(EntityLiving par1EntityLiving, float par2, float par3, float par4)
    134    {
    135        this.partialTicks = par4;
    136    }
    137
    138    /**
    139     * Sets the models various rotation angles then renders the model.
    140     */
    141    public void render(Entity par1Entity, float par2, float par3, float par4, float par5, float par6, float par7)
    142    {
    143        GL11.glPushMatrix();
    144        EntityDragon entitydragon = (EntityDragon)par1Entity;
    145        float f6 = entitydragon.prevAnimTime + (entitydragon.animTime - entitydragon.prevAnimTime) * this.partialTicks;
    146        this.jaw.rotateAngleX = (float)(Math.sin((double)(f6 * (float)Math.PI * 2.0F)) + 1.0D) * 0.2F;
    147        float f7 = (float)(Math.sin((double)(f6 * (float)Math.PI * 2.0F - 1.0F)) + 1.0D);
    148        f7 = (f7 * f7 * 1.0F + f7 * 2.0F) * 0.05F;
    149        GL11.glTranslatef(0.0F, f7 - 2.0F, -3.0F);
    150        GL11.glRotatef(f7 * 2.0F, 1.0F, 0.0F, 0.0F);
    151        float f8 = -30.0F;
    152        float f9 = 0.0F;
    153        float f10 = 1.5F;
    154        double[] adouble = entitydragon.getMovementOffsets(6, this.partialTicks);
    155        float f11 = this.updateRotations(entitydragon.getMovementOffsets(5, this.partialTicks)[0] - entitydragon.getMovementOffsets(10, this.partialTicks)[0]);
    156        float f12 = this.updateRotations(entitydragon.getMovementOffsets(5, this.partialTicks)[0] + (double)(f11 / 2.0F));
    157        f8 += 2.0F;
    158        float f13 = f6 * (float)Math.PI * 2.0F;
    159        f8 = 20.0F;
    160        float f14 = -12.0F;
    161        float f15;
    162
    163        for (int i = 0; i < 5; ++i)
    164        {
    165            double[] adouble1 = entitydragon.getMovementOffsets(5 - i, this.partialTicks);
    166            f15 = (float)Math.cos((double)((float)i * 0.45F + f13)) * 0.15F;
    167            this.neck.rotateAngleY = this.updateRotations(adouble1[0] - adouble[0]) * (float)Math.PI / 180.0F * f10;
    168            this.neck.rotateAngleX = f15 + (float)(adouble1[1] - adouble[1]) * (float)Math.PI / 180.0F * f10 * 5.0F;
    169            this.neck.rotateAngleZ = -this.updateRotations(adouble1[0] - (double)f12) * (float)Math.PI / 180.0F * f10;
    170            this.neck.rotationPointY = f8;
    171            this.neck.rotationPointZ = f14;
    172            this.neck.rotationPointX = f9;
    173            f8 = (float)((double)f8 + Math.sin((double)this.neck.rotateAngleX) * 10.0D);
    174            f14 = (float)((double)f14 - Math.cos((double)this.neck.rotateAngleY) * Math.cos((double)this.neck.rotateAngleX) * 10.0D);
    175            f9 = (float)((double)f9 - Math.sin((double)this.neck.rotateAngleY) * Math.cos((double)this.neck.rotateAngleX) * 10.0D);
    176            this.neck.render(par7);
    177        }
    178
    179        this.head.rotationPointY = f8;
    180        this.head.rotationPointZ = f14;
    181        this.head.rotationPointX = f9;
    182        double[] adouble2 = entitydragon.getMovementOffsets(0, this.partialTicks);
    183        this.head.rotateAngleY = this.updateRotations(adouble2[0] - adouble[0]) * (float)Math.PI / 180.0F * 1.0F;
    184        this.head.rotateAngleZ = -this.updateRotations(adouble2[0] - (double)f12) * (float)Math.PI / 180.0F * 1.0F;
    185        this.head.render(par7);
    186        GL11.glPushMatrix();
    187        GL11.glTranslatef(0.0F, 1.0F, 0.0F);
    188        GL11.glRotatef(-f11 * f10 * 1.0F, 0.0F, 0.0F, 1.0F);
    189        GL11.glTranslatef(0.0F, -1.0F, 0.0F);
    190        this.body.rotateAngleZ = 0.0F;
    191        this.body.render(par7);
    192
    193        for (int j = 0; j < 2; ++j)
    194        {
    195            GL11.glEnable(GL11.GL_CULL_FACE);
    196            f15 = f6 * (float)Math.PI * 2.0F;
    197            this.wing.rotateAngleX = 0.125F - (float)Math.cos((double)f15) * 0.2F;
    198            this.wing.rotateAngleY = 0.25F;
    199            this.wing.rotateAngleZ = (float)(Math.sin((double)f15) + 0.125D) * 0.8F;
    200            this.wingTip.rotateAngleZ = -((float)(Math.sin((double)(f15 + 2.0F)) + 0.5D)) * 0.75F;
    201            this.rearLeg.rotateAngleX = 1.0F + f7 * 0.1F;
    202            this.rearLegTip.rotateAngleX = 0.5F + f7 * 0.1F;
    203            this.rearFoot.rotateAngleX = 0.75F + f7 * 0.1F;
    204            this.frontLeg.rotateAngleX = 1.3F + f7 * 0.1F;
    205            this.frontLegTip.rotateAngleX = -0.5F - f7 * 0.1F;
    206            this.frontFoot.rotateAngleX = 0.75F + f7 * 0.1F;
    207            this.wing.render(par7);
    208            this.frontLeg.render(par7);
    209            this.rearLeg.render(par7);
    210            GL11.glScalef(-1.0F, 1.0F, 1.0F);
    211
    212            if (j == 0)
    213            {
    214                GL11.glCullFace(GL11.GL_FRONT);
    215            }
    216        }
    217
    218        GL11.glPopMatrix();
    219        GL11.glCullFace(GL11.GL_BACK);
    220        GL11.glDisable(GL11.GL_CULL_FACE);
    221        float f16 = -((float)Math.sin((double)(f6 * (float)Math.PI * 2.0F))) * 0.0F;
    222        f13 = f6 * (float)Math.PI * 2.0F;
    223        f8 = 10.0F;
    224        f14 = 60.0F;
    225        f9 = 0.0F;
    226        adouble = entitydragon.getMovementOffsets(11, this.partialTicks);
    227
    228        for (int k = 0; k < 12; ++k)
    229        {
    230            adouble2 = entitydragon.getMovementOffsets(12 + k, this.partialTicks);
    231            f16 = (float)((double)f16 + Math.sin((double)((float)k * 0.45F + f13)) * 0.05000000074505806D);
    232            this.neck.rotateAngleY = (this.updateRotations(adouble2[0] - adouble[0]) * f10 + 180.0F) * (float)Math.PI / 180.0F;
    233            this.neck.rotateAngleX = f16 + (float)(adouble2[1] - adouble[1]) * (float)Math.PI / 180.0F * f10 * 5.0F;
    234            this.neck.rotateAngleZ = this.updateRotations(adouble2[0] - (double)f12) * (float)Math.PI / 180.0F * f10;
    235            this.neck.rotationPointY = f8;
    236            this.neck.rotationPointZ = f14;
    237            this.neck.rotationPointX = f9;
    238            f8 = (float)((double)f8 + Math.sin((double)this.neck.rotateAngleX) * 10.0D);
    239            f14 = (float)((double)f14 - Math.cos((double)this.neck.rotateAngleY) * Math.cos((double)this.neck.rotateAngleX) * 10.0D);
    240            f9 = (float)((double)f9 - Math.sin((double)this.neck.rotateAngleY) * Math.cos((double)this.neck.rotateAngleX) * 10.0D);
    241            this.neck.render(par7);
    242        }
    243
    244        GL11.glPopMatrix();
    245    }
    246
    247    /**
    248     * Updates the rotations in the parameters for rotations greater than 180 degrees or less than -180 degrees. It adds
    249     * or subtracts 360 degrees, so that the appearance is the same, although the numbers are then simplified to range
    250     * -180 to 180
    251     */
    252    private float updateRotations(double par1)
    253    {
    254        while (par1 >= 180.0D)
    255        {
    256            par1 -= 360.0D;
    257        }
    258
    259        while (par1 < -180.0D)
    260        {
    261            par1 += 360.0D;
    262        }
    263
    264        return (float)par1;
    265    }
    266}