diff --git a/src/main/java/com/minelittlepony/model/PonyModelConstants.java b/src/main/java/com/minelittlepony/model/PonyModelConstants.java index 79aaab00..944949e3 100644 --- a/src/main/java/com/minelittlepony/model/PonyModelConstants.java +++ b/src/main/java/com/minelittlepony/model/PonyModelConstants.java @@ -13,59 +13,59 @@ public final class PonyModelConstants { NECK_CENTRE_Y = BODY_CENTRE_Y - 6.8f, NECK_CENTRE_Z = BODY_CENTRE_Z - 8.8f, - BODY_ROTATE_ANGLE_X_NOTSNEAK = 0.0F, + BODY_ROTATE_ANGLE_X_NOTSNEAK = 0, BODY_ROTATE_ANGLE_X_SNEAK = 0.4F, BODY_ROTATE_ANGLE_X_RIDING = (float) (Math.PI * 3.8), - BODY_RP_Y_NOTSNEAK = 0.0F, - BODY_RP_Y_SNEAK = 7.0F, + BODY_RP_Y_NOTSNEAK = 0, + BODY_RP_Y_SNEAK = 7, BODY_RP_Y_RIDING = 1, - BODY_RP_Z_NOTSNEAK = 0.0F, - BODY_RP_Z_SNEAK = -4.0F, - BODY_RP_Z_RIDING = 4F, + BODY_RP_Z_NOTSNEAK = 0, + BODY_RP_Z_SNEAK = -4, + BODY_RP_Z_RIDING = 4, EXT_WING_ROTATE_ANGLE_X = 2.5F, - FIRSTP_ARM_CENTRE_X = -1.0F, - FIRSTP_ARM_CENTRE_Y = 4.0F, - FIRSTP_ARM_CENTRE_Z = 0.0F, + FIRSTP_ARM_CENTRE_X = -1, + FIRSTP_ARM_CENTRE_Y = 4, + FIRSTP_ARM_CENTRE_Z = 0, - FRONT_LEG_RP_Y_NOTSNEAK = 8.0F, - FRONT_LEG_RP_Y_SNEAK = 8.0F, + FRONT_LEG_RP_Y_NOTSNEAK = 8, + FRONT_LEG_RP_Y_SNEAK = 8, - HEAD_CENTRE_X = 0.0F, - HEAD_CENTRE_Y = -1.0F, - HEAD_CENTRE_Z = -2.0F, + HEAD_CENTRE_X = 0, + HEAD_CENTRE_Y = -1, + HEAD_CENTRE_Z = -2, - HEAD_RP_X = 0.0F, - HEAD_RP_Y = 0.0F, - HEAD_RP_Z = 0.0F, + HEAD_RP_X = 0, + HEAD_RP_Y = 0, + HEAD_RP_Z = 0, LEFT_WING_EXT_RP_X = 4.5F, - LEFT_WING_EXT_RP_Y = 5.0F, - LEFT_WING_EXT_RP_Z = 6.0F, + LEFT_WING_EXT_RP_Y = 6, + LEFT_WING_EXT_RP_Z = 6, - LEFT_WING_ROTATE_ANGLE_Z_SNEAK = -6.0F, + LEFT_WING_ROTATE_ANGLE_Z_SNEAK = 4, ROTATE_270 = 4.712F, ROTATE_90 = 1.571F, SNEAK_LEG_X_ROTATION_ADJUSTMENT = 0.4F, - TAIL_RP_X = 0.0F, - TAIL_RP_Y = 0.0F, - TAIL_RP_Z = 0.0F, + TAIL_RP_X = 0, + TAIL_RP_Y = 0, + TAIL_RP_Z = 0, - TAIL_RP_Z_NOTSNEAK = 14.0F, - TAIL_RP_Z_SNEAK = 15.0F, + TAIL_RP_Z_NOTSNEAK = 14, + TAIL_RP_Z_SNEAK = 15, - THIRDP_ARM_CENTRE_X = 0.0F, - THIRDP_ARM_CENTRE_Y = 10.0F, - THIRDP_ARM_CENTRE_Z = 0.0F, + THIRDP_ARM_CENTRE_X = 0, + THIRDP_ARM_CENTRE_Y = 10, + THIRDP_ARM_CENTRE_Z = 0, - WING_FOLDED_RP_Y = 13.0F, - WING_FOLDED_RP_Z = -3.0F, + WING_FOLDED_RP_Y = 13, + WING_FOLDED_RP_Z = -3, NECK_ROT_X = 0.166F; } diff --git a/src/main/java/com/minelittlepony/model/components/ModelWing.java b/src/main/java/com/minelittlepony/model/components/ModelWing.java index c43d31f5..b09e3120 100644 --- a/src/main/java/com/minelittlepony/model/components/ModelWing.java +++ b/src/main/java/com/minelittlepony/model/components/ModelWing.java @@ -1,95 +1,70 @@ package com.minelittlepony.model.components; -import net.minecraft.client.model.ModelRenderer; - import static com.minelittlepony.model.PonyModelConstants.*; import com.minelittlepony.model.AbstractPonyModel; +import com.minelittlepony.render.PonyRenderer; -// TODO: Combine each wing into one ModelRenderer with multiple boxes, not multiple ModelRenderers each with one box. public class ModelWing { - public ModelRenderer[] folded = new ModelRenderer[3], - extended = new ModelRenderer[6]; + public PonyRenderer extended; + public PonyRenderer folded; - public ModelWing(AbstractPonyModel pony, boolean mirror, float xOffset, float yOffset, float stretch, int texY) { - - // TODO: Don't add the model to the pony if you're just going to remove it again. - for (int i = 0; i < folded.length; i++) { - folded[i] = new ModelRenderer(pony, 56, texY); - pony.boxList.remove(folded[i]); - } - - for (int i = 0; i < extended.length; i++) { - extended[i] = new ModelRenderer(pony, 56, texY + 3); - pony.boxList.remove(extended[i]); - // this seems to hide the wings being a different size when folded - extended[i].mirror = mirror; - } - - init(xOffset, yOffset, stretch); - addFeathers(mirror ? -1 : 1, yOffset, stretch); + private boolean mirror; + + public ModelWing(AbstractPonyModel pony, boolean mirror, float x, float y, float scale, int texY) { + this.mirror = mirror; + + folded = new PonyRenderer(pony, 56, texY) + .around(HEAD_RP_X, WING_FOLDED_RP_Y, WING_FOLDED_RP_Z); + extended = new PonyRenderer(pony, 56, texY + 3) + .around(HEAD_RP_X, WING_FOLDED_RP_Y, WING_FOLDED_RP_Z).mirror(mirror); + + addCloseWing(x, y, scale); + addFeathers(mirror, y, scale); + } + + private void addCloseWing(float x, float y, float scale) { + folded.box(x, 5f, 2, 2, 6, 2, scale) + .box(x, 5f, 4, 2, 8, 2, scale) + .box(x, 5f, 6, 2, 6, 2, scale) + .rotateAngleX = ROTATE_90; } - private void addFeathers(float r, float y, float scale) { - addFeather(0, r, y, 6.0F, 0.0F, 8, scale + 0.1F); - addFeather(1, r, y, -1.2F, -0.2F, 8, scale + 0.2F); - addFeather(2, r, y, 1.8F, 1.3F, 8, scale - 0.1F); - addFeather(3, r, y, 5.0F, 2.0F, 8, scale); - addFeather(4, r, y, 0.0F, -0.2F, 6, scale + 0.3F); - addFeather(5, r, y, 0.0F, 0.2F, 3, scale + 0.19F); + private void addFeathers(boolean mirror, float y, float scale) { + float r = mirror ? -1 : 1; + extended.cubeList.clear(); + extended.around(r * LEFT_WING_EXT_RP_X, LEFT_WING_EXT_RP_Y + y, LEFT_WING_EXT_RP_Z); + addFeather(0, r, y, 6, 0, 8, scale + 0.1F); + addFeather(1, r, y, -1.2F, -0.2F, 8, scale + 0.2F) .rotateAngleX = -0.85F; + addFeather(2, r, y, 1.8F, 1.3F, 8, scale - 0.1F) .rotateAngleX = -0.75F; + addFeather(3, r, y, 5, 2, 8, scale) .rotateAngleX = -0.5F; + addFeather(4, r, y, 0, -0.2F, 6, scale + 0.3F); + addFeather(5, r, y, 0, 0.2F, 3, scale + 0.19F).rotateAngleX = -0.85F; } - private void addFeather(int i, float r, float Y, float y, float z, int h, float scale) { - extended[i].addBox(-0.5f, y, z, 1, h, 2, scale); - extended[i].setRotationPoint(r * LEFT_WING_EXT_RP_X, LEFT_WING_EXT_RP_Y + Y, LEFT_WING_EXT_RP_Z); + private PonyRenderer addFeather(int i, float r, float Y, float y, float z, int h, float scale) { + return extended.child(i).around(0, 0, 0).box(-0.5f, y, z, 1, h, 2, scale); } - private void init(float x, float y, float scale) { - initFeather(folded[0], y, x, 2F, 6, scale); - initFeather(folded[1], y, x, 4F, 8, scale); - initFeather(folded[2], y, x, 6F, 6, scale); + public void rotateWalking(float swing) { + folded.rotateAngleY = swing * 0.2F; } - private void initFeather(ModelRenderer wing, float y, float x, float z, int h, float scale) { - wing.addBox(x, 5f, z, 2, h, 2, scale); - wing.setRotationPoint(HEAD_RP_X, WING_FOLDED_RP_Y + y, WING_FOLDED_RP_Z); - wing.rotateAngleX = ROTATE_90; - } - - public void updateModelRotation(float swing) { - for (ModelRenderer feather : folded) { - feather.rotateAngleY = swing * 0.2F; + + public void render(boolean extend, float scale) { + extended.rotationPointX = (mirror ? -1 : 1) * LEFT_WING_EXT_RP_X; + extended.rotationPointY = LEFT_WING_EXT_RP_Y; + + extended.rotateAngleY = 3; + if (extend) { + extended.render(scale); + } else { + folded.render(scale); } } - public void rotate(float angle) { - for (ModelRenderer feather : folded) { - feather.rotateAngleX = angle; - } - // Special - extended[1].rotateAngleX -= 0.85F; - extended[2].rotateAngleX -= 0.75F; - extended[3].rotateAngleX -= 0.5F; - extended[5].rotateAngleX -= 0.85F; + public void rotateFlying(float angle) { + extended.rotateAngleZ = angle; } - public void render(boolean standing, float scale) { - for (ModelRenderer feather : (standing ? folded : extended)) { - feather.render(scale); - } - } - - public void rotateSneaked(float rotZ) { - for (ModelRenderer feather : extended) { - feather.rotateAngleX = EXT_WING_ROTATE_ANGLE_X; - feather.rotateAngleZ = rotZ; - } - } - - public void rotateUnsneaked(float angle) { - for (ModelRenderer aLeftWingExt : extended) { - aLeftWingExt.rotateAngleX = EXT_WING_ROTATE_ANGLE_X; - aLeftWingExt.rotateAngleZ = -angle; - } - } } diff --git a/src/main/java/com/minelittlepony/model/components/PegasusWings.java b/src/main/java/com/minelittlepony/model/components/PegasusWings.java index 655ed09c..7d889d17 100644 --- a/src/main/java/com/minelittlepony/model/components/PegasusWings.java +++ b/src/main/java/com/minelittlepony/model/components/PegasusWings.java @@ -23,35 +23,52 @@ public class PegasusWings extends ModelBase { @Override public void setRotationAngles(float limbSwing, float limbSwingAmount, float ticks, float netHeadYaw, float headPitch, float scaleFactor, Entity entityIn) { - - float bodySwingRotation = 0.0F; - if (pony.swingProgress > -9990.0F && !pony.metadata.hasMagic()) { - bodySwingRotation = MathHelper.sin(MathHelper.sqrt(pony.swingProgress) * 3.1415927F * 2.0F) * 0.2F; - } + if (!isVisible()) return; - leftWing.updateModelRotation(bodySwingRotation); - rightWing.updateModelRotation(bodySwingRotation); + float swing = 0; - if (pony.isSneak && !pony.isFlying) { - leftWing.rotateSneaked(LEFT_WING_ROTATE_ANGLE_Z_SNEAK); - rightWing.rotateSneaked(-LEFT_WING_ROTATE_ANGLE_Z_SNEAK); - } else if (pony.isFlying) { - float WingRotateAngleZ = (MathHelper.sin(ticks * 0.536F) * 1.0F) + ROTATE_270 + 0.4F; + if (pony.swingProgress > 0) { + swing = MathHelper.sin(MathHelper.sqrt(pony.swingProgress) * PI * 2); + } else { + float pi = PI * (float) Math.pow(limbSwingAmount, 16); - leftWing.rotateUnsneaked(WingRotateAngleZ); - rightWing.rotateUnsneaked(-WingRotateAngleZ); + float mve = limbSwing * 0.6662F; // magic number ahoy + float srt = limbSwingAmount / 4; + + swing = MathHelper.cos(mve + pi) * srt; } - leftWing.rotate(ROTATE_90); - rightWing.rotate(ROTATE_90); + leftWing.rotateWalking(swing); + rightWing.rotateWalking(-swing); + + if (isExtended()) { + float flapAngle = getWingRotationFactor(ticks); + leftWing.rotateFlying(flapAngle); + rightWing.rotateFlying(-flapAngle); + } + + } + + public float getWingRotationFactor(float ticks) { + if (pony.isFlying) { + return (MathHelper.sin(ticks * 0.536F) * 1.0F) + ROTATE_270 + 0.4F; + } + return LEFT_WING_ROTATE_ANGLE_Z_SNEAK; + } + + public boolean isVisible() { + return pony.metadata.getRace().hasWings(); + } + + public boolean isExtended() { + return pony.isFlying || pony.isSneak; } @Override public void render(Entity entityIn, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch, float scale) { - if (pony.metadata.getRace().hasWings()) { - boolean standing = !pony.isFlying && !pony.isSneak; - leftWing.render(standing, scale); - rightWing.render(standing, scale); - } + if (!isVisible()) return; + boolean standing = isExtended(); + leftWing.render(standing, scale); + rightWing.render(standing, scale); } }