f37812be3e
I may have got a bit behind with version control. A lot behind, in fact. Maybe I'll go back and split this sometime - then again, I probably won't. But hey, at least it's here!
310 lines
13 KiB
Java
310 lines
13 KiB
Java
package electroblob.wizardry.client.model;
|
|
|
|
import electroblob.wizardry.entity.living.EntityIceGiant;
|
|
import net.minecraft.client.model.ModelBase;
|
|
import net.minecraft.client.model.ModelRenderer;
|
|
import net.minecraft.entity.Entity;
|
|
import net.minecraft.entity.EntityLivingBase;
|
|
import net.minecraft.util.math.MathHelper;
|
|
|
|
import javax.vecmath.Matrix4f;
|
|
import javax.vecmath.Vector3f;
|
|
|
|
//@SideOnly(Side.CLIENT)
|
|
public class ModelIceGiant extends ModelBase {
|
|
/** The head model for the iron golem. */
|
|
public ModelRenderer iceGiantHead;
|
|
|
|
/** The body model for the iron golem. */
|
|
public ModelRenderer iceGiantBody;
|
|
|
|
/** The right arm model for the iron golem. */
|
|
public ModelRenderer iceGiantRightArm;
|
|
|
|
/** The left arm model for the iron golem. */
|
|
public ModelRenderer iceGiantLeftArm;
|
|
|
|
/** The left leg model for the Iron Golem. */
|
|
public ModelRenderer iceGiantLeftLeg;
|
|
|
|
/** The right leg model for the Iron Golem. */
|
|
public ModelRenderer iceGiantRightLeg;
|
|
|
|
ModelRenderer headSpike1;
|
|
ModelRenderer headSpike2;
|
|
ModelRenderer headSpike3;
|
|
ModelRenderer headSpike4;
|
|
ModelRenderer headSpike5;
|
|
ModelRenderer headSpike6;
|
|
ModelRenderer headSpike7;
|
|
ModelRenderer rightArmSpike1;
|
|
ModelRenderer rightArmSpike2;
|
|
ModelRenderer leftArmSpike1;
|
|
ModelRenderer leftArmSpike2;
|
|
ModelRenderer bodySpike1;
|
|
ModelRenderer bodySpike2;
|
|
ModelRenderer bodySpike3;
|
|
ModelRenderer bodySpike4;
|
|
ModelRenderer bodySpike5;
|
|
|
|
public ModelIceGiant(){
|
|
this(0.0F);
|
|
}
|
|
|
|
public ModelIceGiant(float par1){
|
|
this(par1, -7.0F);
|
|
}
|
|
|
|
public ModelIceGiant(float par1, float par2){
|
|
short short1 = 128;
|
|
short short2 = 128;
|
|
|
|
this.iceGiantHead = (new ModelRenderer(this)).setTextureSize(short1, short2);
|
|
this.iceGiantHead.setRotationPoint(0.0F, 0.0F + par2, -1.0F);
|
|
this.iceGiantHead.setTextureOffset(0, 10).addBox(-6.0F, -14.0F, -6.5F, 12, 12, 12, par1);
|
|
|
|
this.iceGiantBody = (new ModelRenderer(this)).setTextureSize(short1, short2);
|
|
this.iceGiantBody.setRotationPoint(0.0F, 0.0F + par2, 0.0F);
|
|
this.iceGiantBody.setTextureOffset(0, 40).addBox(-9.0F, -2.0F, -6.0F, 18, 12, 11, par1);
|
|
this.iceGiantBody.setTextureOffset(0, 70).addBox(-4.5F, 10.0F, -3.0F, 9, 5, 6, par1 + 0.5F);
|
|
|
|
this.iceGiantRightArm = (new ModelRenderer(this)).setTextureSize(short1, short2);
|
|
this.iceGiantRightArm.setRotationPoint(0.0F, -7.0F, 0.0F);
|
|
this.iceGiantRightArm.setTextureOffset(60, 21).addBox(-13.0F, -2.5F, -3.0F, 4, 30, 6, par1);
|
|
|
|
this.iceGiantLeftArm = (new ModelRenderer(this)).setTextureSize(short1, short2);
|
|
this.iceGiantLeftArm.setRotationPoint(0.0F, -7.0F, 0.0F);
|
|
this.iceGiantLeftArm.setTextureOffset(60, 58).addBox(9.0F, -2.5F, -3.0F, 4, 30, 6, par1);
|
|
|
|
this.iceGiantLeftLeg = (new ModelRenderer(this, 0, 22)).setTextureSize(short1, short2);
|
|
this.iceGiantLeftLeg.setRotationPoint(-4.0F, 18.0F + par2, 0.0F);
|
|
this.iceGiantLeftLeg.setTextureOffset(37, 0).addBox(-3.5F, -3.0F, -3.0F, 6, 16, 5, par1);
|
|
|
|
this.iceGiantRightLeg = (new ModelRenderer(this, 0, 22)).setTextureSize(short1, short2);
|
|
this.iceGiantRightLeg.mirror = true;
|
|
this.iceGiantRightLeg.setTextureOffset(60, 0).setRotationPoint(5.0F, 18.0F + par2, 0.0F);
|
|
this.iceGiantRightLeg.addBox(-3.5F, -3.0F, -3.0F, 6, 16, 5, par1);
|
|
|
|
headSpike1 = new ModelRenderer(this, 0, 0).setTextureSize(short1, short2);
|
|
headSpike1.addBox(-4F, -4F, 0F, 4, 4, 4);
|
|
headSpike1.setRotationPoint(-4F, -10F, -5F);
|
|
headSpike1.mirror = true;
|
|
setRotationWithEulerYzx(headSpike1, -0.1047198F, -0.5235988F, 0.9599311F);
|
|
|
|
headSpike2 = new ModelRenderer(this, 0, 0).setTextureSize(short1, short2);
|
|
headSpike2.addBox(0F, -4F, 0F, 4, 4, 4);
|
|
headSpike2.setRotationPoint(4F, -16F, 0F);
|
|
headSpike2.mirror = true;
|
|
setRotationWithEulerYzx(headSpike2, 0.5585054F, 0.9250245F, -0.5235988F);
|
|
|
|
headSpike3 = new ModelRenderer(this, 0, 0).setTextureSize(short1, short2);
|
|
headSpike3.addBox(-2F, -2F, -2F, 4, 4, 4);
|
|
headSpike3.setRotationPoint(4F, -13F, 4F);
|
|
headSpike3.mirror = true;
|
|
setRotationWithEulerYzx(headSpike3, 0.7853982F, -1.396263F, 0.7853982F);
|
|
|
|
headSpike4 = new ModelRenderer(this, 0, 0).setTextureSize(short1, short2);
|
|
headSpike4.addBox(-4F, -4F, 0F, 4, 4, 4);
|
|
headSpike4.setRotationPoint(-4F, -16F, 0F);
|
|
headSpike4.mirror = true;
|
|
setRotationWithEulerYzx(headSpike4, 0.5585054F, -0.9250245F, 0.5235988F);
|
|
|
|
headSpike5 = new ModelRenderer(this, 0, 0).setTextureSize(short1, short2);
|
|
headSpike5.addBox(0F, -4F, 0F, 4, 4, 4);
|
|
headSpike5.setRotationPoint(4F, -10F, -5F);
|
|
headSpike5.mirror = true;
|
|
setRotationWithEulerYzx(headSpike5, 0.5235988F, -0.9599311F, 0.1047198F);
|
|
|
|
rightArmSpike1 = new ModelRenderer(this, 0, 0).setTextureSize(short1, short2);
|
|
rightArmSpike1.addBox(-2F, -2F, -2F, 4, 4, 4);
|
|
rightArmSpike1.setRotationPoint(-11F, -8F, 0F);
|
|
rightArmSpike1.mirror = true;
|
|
setRotationWithEulerYzx(rightArmSpike1, 0.7853982F, 1.134464F, 0.9599311F);
|
|
|
|
headSpike6 = new ModelRenderer(this, 0, 0).setTextureSize(short1, short2);
|
|
headSpike6.addBox(-2F, -2F, -2F, 4, 4, 4);
|
|
headSpike6.setRotationPoint(-4F, -13F, 4F);
|
|
headSpike6.mirror = true;
|
|
setRotationWithEulerYzx(headSpike6, 0.7853982F, -1.745329F, 0.7853982F);
|
|
|
|
leftArmSpike1 = new ModelRenderer(this, 0, 0).setTextureSize(short1, short2);
|
|
leftArmSpike1.addBox(-2F, -2F, -2F, 4, 4, 4);
|
|
leftArmSpike1.setRotationPoint(11F, -8F, 0F);
|
|
leftArmSpike1.mirror = true;
|
|
setRotationWithEulerYzx(leftArmSpike1, 0.7853982F, -1.134464F, -0.9599311F);
|
|
|
|
leftArmSpike2 = new ModelRenderer(this, 0, 0).setTextureSize(short1, short2);
|
|
leftArmSpike2.addBox(-2F, -2F, -2F, 4, 4, 4);
|
|
leftArmSpike2.setRotationPoint(12F, -4F, 0F);
|
|
leftArmSpike2.mirror = true;
|
|
setRotationWithEulerYzx(leftArmSpike2, 0.7853982F, 0F, -0.9599311F);
|
|
|
|
bodySpike1 = new ModelRenderer(this, 32, 69).setTextureSize(short1, short2);
|
|
bodySpike1.addBox(-3F, -3F, -3F, 6, 6, 6);
|
|
bodySpike1.setRotationPoint(-4F, -4F, 3F);
|
|
bodySpike1.mirror = true;
|
|
setRotationWithEulerYzx(bodySpike1, 0.2808018F, 0.8096675F, 0.8339369F);
|
|
|
|
rightArmSpike2 = new ModelRenderer(this, 0, 0).setTextureSize(short1, short2);
|
|
rightArmSpike2.addBox(-2F, -2F, -2F, 4, 4, 4);
|
|
rightArmSpike2.setRotationPoint(-12F, -4F, 0F);
|
|
rightArmSpike2.mirror = true;
|
|
setRotationWithEulerYzx(rightArmSpike2, 0.7853982F, 0F, 0.9599311F);
|
|
|
|
bodySpike2 = new ModelRenderer(this, 32, 69).setTextureSize(short1, short2);
|
|
bodySpike2.addBox(-3F, -3F, -3F, 6, 6, 6);
|
|
bodySpike2.setRotationPoint(4F, -4F, 3F);
|
|
bodySpike2.mirror = true;
|
|
setRotationWithEulerYzx(bodySpike2, 0.2808018F, -0.8096757F, -0.8339358F);
|
|
|
|
bodySpike3 = new ModelRenderer(this, 0, 0).setTextureSize(short1, short2);
|
|
bodySpike3.addBox(-2F, -2F, -2F, 4, 4, 4);
|
|
bodySpike3.setRotationPoint(6F, -2F, -5F);
|
|
bodySpike3.mirror = true;
|
|
setRotationWithEulerYzx(bodySpike3, 1.120006F, -1.347726F, -0.8969422F);
|
|
|
|
bodySpike4 = new ModelRenderer(this, 32, 69).setTextureSize(short1, short2);
|
|
bodySpike4.addBox(-3F, -3F, -3F, 6, 6, 6);
|
|
bodySpike4.setRotationPoint(0F, -4F, -4F);
|
|
bodySpike4.mirror = true;
|
|
setRotationWithEulerYzx(bodySpike4, 0.7853982F, -1.570796F, 0.9599311F);
|
|
|
|
headSpike7 = new ModelRenderer(this, 0, 0).setTextureSize(short1, short2);
|
|
headSpike7.addBox(-2F, -2F, -2F, 4, 4, 4);
|
|
headSpike7.setRotationPoint(0F, -20F, 4F);
|
|
headSpike7.mirror = true;
|
|
setRotationWithEulerYzx(headSpike7, 0.7853982F, 1.570796F, 0.7853982F);
|
|
|
|
bodySpike5 = new ModelRenderer(this, 0, 0).setTextureSize(short1, short2);
|
|
bodySpike5.addBox(-2F, -2F, -2F, 4, 4, 4);
|
|
bodySpike5.setRotationPoint(-6F, -2F, -5F);
|
|
bodySpike5.mirror = true;
|
|
setRotationWithEulerYzx(bodySpike5, 1.120006F, 1.347725F, 0.896934F);
|
|
|
|
this.convertToChild(this.iceGiantHead, headSpike1);
|
|
this.convertToChild(this.iceGiantHead, headSpike2);
|
|
this.convertToChild(this.iceGiantHead, headSpike3);
|
|
this.convertToChild(this.iceGiantHead, headSpike4);
|
|
this.convertToChild(this.iceGiantHead, headSpike5);
|
|
this.convertToChild(this.iceGiantHead, headSpike6);
|
|
this.convertToChild(this.iceGiantHead, headSpike7);
|
|
this.convertToChild(this.iceGiantRightArm, rightArmSpike1);
|
|
this.convertToChild(this.iceGiantRightArm, rightArmSpike2);
|
|
this.convertToChild(this.iceGiantLeftArm, leftArmSpike1);
|
|
this.convertToChild(this.iceGiantLeftArm, leftArmSpike2);
|
|
this.convertToChild(this.iceGiantBody, bodySpike1);
|
|
this.convertToChild(this.iceGiantBody, bodySpike2);
|
|
this.convertToChild(this.iceGiantBody, bodySpike3);
|
|
this.convertToChild(this.iceGiantBody, bodySpike4);
|
|
this.convertToChild(this.iceGiantBody, bodySpike5);
|
|
|
|
}
|
|
|
|
/**
|
|
* Sets the models various rotation angles then renders the model.
|
|
*/
|
|
public void render(Entity par1Entity, float par2, float par3, float par4, float par5, float par6, float par7){
|
|
this.setRotationAngles(par2, par3, par4, par5, par6, par7, par1Entity);
|
|
this.iceGiantHead.render(par7);
|
|
this.iceGiantBody.render(par7);
|
|
this.iceGiantLeftLeg.render(par7);
|
|
this.iceGiantRightLeg.render(par7);
|
|
this.iceGiantRightArm.render(par7);
|
|
this.iceGiantLeftArm.render(par7);
|
|
}
|
|
|
|
/**
|
|
* Sets the model's various rotation angles. For bipeds, par1 and par2 are used for animating the movement of arms
|
|
* and legs, where par1 represents the time(so that arms and legs swing back and forth) and par2 represents how
|
|
* "far" arms and legs can swing at most.
|
|
*/
|
|
public void setRotationAngles(float par1, float par2, float par3, float par4, float par5, float par6,
|
|
Entity par7Entity){
|
|
this.iceGiantHead.rotateAngleY = par4 / (180F / (float)Math.PI);
|
|
this.iceGiantHead.rotateAngleX = par5 / (180F / (float)Math.PI);
|
|
this.iceGiantLeftLeg.rotateAngleX = -1.5F * this.func_78172_a(par1, 13.0F) * par2;
|
|
this.iceGiantRightLeg.rotateAngleX = 1.5F * this.func_78172_a(par1, 13.0F) * par2;
|
|
this.iceGiantLeftLeg.rotateAngleY = 0.0F;
|
|
this.iceGiantRightLeg.rotateAngleY = 0.0F;
|
|
}
|
|
|
|
/**
|
|
* Used for easily adding entity-dependent animations. The second and third float params here are the same second
|
|
* and third as in the setRotationAngles method.
|
|
*/
|
|
public void setLivingAnimations(EntityLivingBase par1EntityLivingBase, float par2, float par3, float par4){
|
|
EntityIceGiant entityicegiant = (EntityIceGiant)par1EntityLivingBase;
|
|
int i = entityicegiant.getAttackTimer();
|
|
|
|
if(i > 0){
|
|
this.iceGiantRightArm.rotateAngleX = -2.0F + 1.5F * this.func_78172_a((float)i - par4, 10.0F);
|
|
this.iceGiantLeftArm.rotateAngleX = -2.0F + 1.5F * this.func_78172_a((float)i - par4, 10.0F);
|
|
}else{
|
|
this.iceGiantRightArm.rotateAngleX = (-0.2F + 1.5F * this.func_78172_a(par2, 13.0F)) * par3;
|
|
this.iceGiantLeftArm.rotateAngleX = (-0.2F - 1.5F * this.func_78172_a(par2, 13.0F)) * par3;
|
|
}
|
|
}
|
|
|
|
private float func_78172_a(float par1, float par2){
|
|
return (Math.abs(par1 % par2 - par2 * 0.5F) - par2 * 0.25F) / (par2 * 0.25F);
|
|
}
|
|
|
|
/**
|
|
* This is really useful for converting the source from a Techne model export which will have absolute rotation
|
|
* points that need to be converted before creating the addChild() relationship. [Courtesy of jabelar]
|
|
*/
|
|
protected void convertToChild(ModelRenderer parent, ModelRenderer child){
|
|
// move child rotation point to be relative to parent
|
|
child.rotationPointX -= parent.rotationPointX;
|
|
child.rotationPointY -= parent.rotationPointY;
|
|
child.rotationPointZ -= parent.rotationPointZ;
|
|
// make rotations relative to parent
|
|
child.rotateAngleX -= parent.rotateAngleX;
|
|
child.rotateAngleY -= parent.rotateAngleY;
|
|
child.rotateAngleZ -= parent.rotateAngleZ;
|
|
// create relationship
|
|
parent.addChild(child);
|
|
}
|
|
|
|
/** Fixes the Techne rotation order bug. [Courtesy of tprk77] */
|
|
private Vector3f ConvertEulerYzxToZyx(Vector3f eulerYzx){
|
|
// Create a matrix from YZX ordered Euler angles
|
|
float a = MathHelper.cos(eulerYzx.x);
|
|
float b = MathHelper.sin(eulerYzx.x);
|
|
float c = MathHelper.cos(eulerYzx.y);
|
|
float d = MathHelper.sin(eulerYzx.y);
|
|
float e = MathHelper.cos(eulerYzx.z);
|
|
float f = MathHelper.sin(eulerYzx.z);
|
|
Matrix4f matrix = new Matrix4f();
|
|
matrix.m00 = c * e;
|
|
matrix.m01 = b * d - a * c * f;
|
|
matrix.m02 = b * c * f + a * d;
|
|
matrix.m10 = f;
|
|
matrix.m11 = a * e;
|
|
matrix.m12 = -b * e;
|
|
matrix.m20 = -d * e;
|
|
matrix.m21 = a * d * f + b * c;
|
|
matrix.m22 = a * c - b * d * f;
|
|
matrix.m33 = 1.0F;
|
|
// Create ZYX ordered Euler angles from the matrix
|
|
Vector3f eulerZyx = new Vector3f();
|
|
eulerZyx.y = (float)Math.asin(MathHelper.clamp(-matrix.m20, -1, 1));
|
|
if(MathHelper.abs(matrix.m20) < 0.99999){
|
|
eulerZyx.x = (float)Math.atan2(matrix.m21, matrix.m22);
|
|
eulerZyx.z = (float)Math.atan2(matrix.m10, matrix.m00);
|
|
}else{
|
|
eulerZyx.x = 0.0F;
|
|
eulerZyx.z = (float)Math.atan2(-matrix.m01, matrix.m11);
|
|
}
|
|
return eulerZyx;
|
|
}
|
|
|
|
private void setRotationWithEulerYzx(ModelRenderer model, float x, float y, float z){
|
|
Vector3f eulerYzx = new Vector3f(x, y, z);
|
|
Vector3f eulerZyx = ConvertEulerYzxToZyx(eulerYzx);
|
|
model.rotateAngleX = eulerZyx.x;
|
|
model.rotateAngleY = eulerZyx.y;
|
|
model.rotateAngleZ = eulerZyx.z;
|
|
}
|
|
}
|