001 package net.minecraft.client.model;
002
003 import cpw.mods.fml.relauncher.Side;
004 import cpw.mods.fml.relauncher.SideOnly;
005 import net.minecraft.entity.Entity;
006 import net.minecraft.entity.EntityLiving;
007 import net.minecraft.entity.boss.EntityDragon;
008 import org.lwjgl.opengl.GL11;
009
010 @SideOnly(Side.CLIENT)
011 public 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 var2 = -16.0F;
074 this.head = new ModelRenderer(this, "head");
075 this.head.addBox("upperlip", -6.0F, -1.0F, -8.0F + var2, 12, 5, 16);
076 this.head.addBox("upperhead", -8.0F, -8.0F, 6.0F + var2, 16, 16, 16);
077 this.head.mirror = true;
078 this.head.addBox("scale", -5.0F, -12.0F, 12.0F + var2, 2, 4, 6);
079 this.head.addBox("nostril", -5.0F, -3.0F, -6.0F + var2, 2, 2, 4);
080 this.head.mirror = false;
081 this.head.addBox("scale", 3.0F, -12.0F, 12.0F + var2, 2, 4, 6);
082 this.head.addBox("nostril", 3.0F, -3.0F, -6.0F + var2, 2, 2, 4);
083 this.jaw = new ModelRenderer(this, "jaw");
084 this.jaw.setRotationPoint(0.0F, 4.0F, 8.0F + var2);
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 var8 = (EntityDragon)par1Entity;
145 float var9 = var8.prevAnimTime + (var8.animTime - var8.prevAnimTime) * this.partialTicks;
146 this.jaw.rotateAngleX = (float)(Math.sin((double)(var9 * (float)Math.PI * 2.0F)) + 1.0D) * 0.2F;
147 float var10 = (float)(Math.sin((double)(var9 * (float)Math.PI * 2.0F - 1.0F)) + 1.0D);
148 var10 = (var10 * var10 * 1.0F + var10 * 2.0F) * 0.05F;
149 GL11.glTranslatef(0.0F, var10 - 2.0F, -3.0F);
150 GL11.glRotatef(var10 * 2.0F, 1.0F, 0.0F, 0.0F);
151 float var11 = -30.0F;
152 float var13 = 0.0F;
153 float var14 = 1.5F;
154 double[] var15 = var8.getMovementOffsets(6, this.partialTicks);
155 float var16 = this.updateRotations(var8.getMovementOffsets(5, this.partialTicks)[0] - var8.getMovementOffsets(10, this.partialTicks)[0]);
156 float var17 = this.updateRotations(var8.getMovementOffsets(5, this.partialTicks)[0] + (double)(var16 / 2.0F));
157 var11 += 2.0F;
158 float var18 = var9 * (float)Math.PI * 2.0F;
159 var11 = 20.0F;
160 float var12 = -12.0F;
161 float var21;
162
163 for (int var19 = 0; var19 < 5; ++var19)
164 {
165 double[] var20 = var8.getMovementOffsets(5 - var19, this.partialTicks);
166 var21 = (float)Math.cos((double)((float)var19 * 0.45F + var18)) * 0.15F;
167 this.neck.rotateAngleY = this.updateRotations(var20[0] - var15[0]) * (float)Math.PI / 180.0F * var14;
168 this.neck.rotateAngleX = var21 + (float)(var20[1] - var15[1]) * (float)Math.PI / 180.0F * var14 * 5.0F;
169 this.neck.rotateAngleZ = -this.updateRotations(var20[0] - (double)var17) * (float)Math.PI / 180.0F * var14;
170 this.neck.rotationPointY = var11;
171 this.neck.rotationPointZ = var12;
172 this.neck.rotationPointX = var13;
173 var11 = (float)((double)var11 + Math.sin((double)this.neck.rotateAngleX) * 10.0D);
174 var12 = (float)((double)var12 - Math.cos((double)this.neck.rotateAngleY) * Math.cos((double)this.neck.rotateAngleX) * 10.0D);
175 var13 = (float)((double)var13 - 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 = var11;
180 this.head.rotationPointZ = var12;
181 this.head.rotationPointX = var13;
182 double[] var23 = var8.getMovementOffsets(0, this.partialTicks);
183 this.head.rotateAngleY = this.updateRotations(var23[0] - var15[0]) * (float)Math.PI / 180.0F * 1.0F;
184 this.head.rotateAngleZ = -this.updateRotations(var23[0] - (double)var17) * (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(-var16 * var14 * 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 var22 = 0; var22 < 2; ++var22)
194 {
195 GL11.glEnable(GL11.GL_CULL_FACE);
196 var21 = var9 * (float)Math.PI * 2.0F;
197 this.wing.rotateAngleX = 0.125F - (float)Math.cos((double)var21) * 0.2F;
198 this.wing.rotateAngleY = 0.25F;
199 this.wing.rotateAngleZ = (float)(Math.sin((double)var21) + 0.125D) * 0.8F;
200 this.wingTip.rotateAngleZ = -((float)(Math.sin((double)(var21 + 2.0F)) + 0.5D)) * 0.75F;
201 this.rearLeg.rotateAngleX = 1.0F + var10 * 0.1F;
202 this.rearLegTip.rotateAngleX = 0.5F + var10 * 0.1F;
203 this.rearFoot.rotateAngleX = 0.75F + var10 * 0.1F;
204 this.frontLeg.rotateAngleX = 1.3F + var10 * 0.1F;
205 this.frontLegTip.rotateAngleX = -0.5F - var10 * 0.1F;
206 this.frontFoot.rotateAngleX = 0.75F + var10 * 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 (var22 == 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 var24 = -((float)Math.sin((double)(var9 * (float)Math.PI * 2.0F))) * 0.0F;
222 var18 = var9 * (float)Math.PI * 2.0F;
223 var11 = 10.0F;
224 var12 = 60.0F;
225 var13 = 0.0F;
226 var15 = var8.getMovementOffsets(11, this.partialTicks);
227
228 for (int var25 = 0; var25 < 12; ++var25)
229 {
230 var23 = var8.getMovementOffsets(12 + var25, this.partialTicks);
231 var24 = (float)((double)var24 + Math.sin((double)((float)var25 * 0.45F + var18)) * 0.05000000074505806D);
232 this.neck.rotateAngleY = (this.updateRotations(var23[0] - var15[0]) * var14 + 180.0F) * (float)Math.PI / 180.0F;
233 this.neck.rotateAngleX = var24 + (float)(var23[1] - var15[1]) * (float)Math.PI / 180.0F * var14 * 5.0F;
234 this.neck.rotateAngleZ = this.updateRotations(var23[0] - (double)var17) * (float)Math.PI / 180.0F * var14;
235 this.neck.rotationPointY = var11;
236 this.neck.rotationPointZ = var12;
237 this.neck.rotationPointX = var13;
238 var11 = (float)((double)var11 + Math.sin((double)this.neck.rotateAngleX) * 10.0D);
239 var12 = (float)((double)var12 - Math.cos((double)this.neck.rotateAngleY) * Math.cos((double)this.neck.rotateAngleX) * 10.0D);
240 var13 = (float)((double)var13 - 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 }