mirror of
https://github.com/MineLittlePony/MineLittlePony.git
synced 2025-02-13 16:24:23 +01:00
Rewrite wings - fix walking/interacting wing animation
This commit is contained in:
parent
280013c8a4
commit
618a9b78bb
3 changed files with 116 additions and 124 deletions
|
@ -13,59 +13,59 @@ public final class PonyModelConstants {
|
||||||
NECK_CENTRE_Y = BODY_CENTRE_Y - 6.8f,
|
NECK_CENTRE_Y = BODY_CENTRE_Y - 6.8f,
|
||||||
NECK_CENTRE_Z = BODY_CENTRE_Z - 8.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_SNEAK = 0.4F,
|
||||||
BODY_ROTATE_ANGLE_X_RIDING = (float) (Math.PI * 3.8),
|
BODY_ROTATE_ANGLE_X_RIDING = (float) (Math.PI * 3.8),
|
||||||
|
|
||||||
BODY_RP_Y_NOTSNEAK = 0.0F,
|
BODY_RP_Y_NOTSNEAK = 0,
|
||||||
BODY_RP_Y_SNEAK = 7.0F,
|
BODY_RP_Y_SNEAK = 7,
|
||||||
BODY_RP_Y_RIDING = 1,
|
BODY_RP_Y_RIDING = 1,
|
||||||
|
|
||||||
BODY_RP_Z_NOTSNEAK = 0.0F,
|
BODY_RP_Z_NOTSNEAK = 0,
|
||||||
BODY_RP_Z_SNEAK = -4.0F,
|
BODY_RP_Z_SNEAK = -4,
|
||||||
BODY_RP_Z_RIDING = 4F,
|
BODY_RP_Z_RIDING = 4,
|
||||||
|
|
||||||
EXT_WING_ROTATE_ANGLE_X = 2.5F,
|
EXT_WING_ROTATE_ANGLE_X = 2.5F,
|
||||||
|
|
||||||
FIRSTP_ARM_CENTRE_X = -1.0F,
|
FIRSTP_ARM_CENTRE_X = -1,
|
||||||
FIRSTP_ARM_CENTRE_Y = 4.0F,
|
FIRSTP_ARM_CENTRE_Y = 4,
|
||||||
FIRSTP_ARM_CENTRE_Z = 0.0F,
|
FIRSTP_ARM_CENTRE_Z = 0,
|
||||||
|
|
||||||
FRONT_LEG_RP_Y_NOTSNEAK = 8.0F,
|
FRONT_LEG_RP_Y_NOTSNEAK = 8,
|
||||||
FRONT_LEG_RP_Y_SNEAK = 8.0F,
|
FRONT_LEG_RP_Y_SNEAK = 8,
|
||||||
|
|
||||||
HEAD_CENTRE_X = 0.0F,
|
HEAD_CENTRE_X = 0,
|
||||||
HEAD_CENTRE_Y = -1.0F,
|
HEAD_CENTRE_Y = -1,
|
||||||
HEAD_CENTRE_Z = -2.0F,
|
HEAD_CENTRE_Z = -2,
|
||||||
|
|
||||||
HEAD_RP_X = 0.0F,
|
HEAD_RP_X = 0,
|
||||||
HEAD_RP_Y = 0.0F,
|
HEAD_RP_Y = 0,
|
||||||
HEAD_RP_Z = 0.0F,
|
HEAD_RP_Z = 0,
|
||||||
|
|
||||||
LEFT_WING_EXT_RP_X = 4.5F,
|
LEFT_WING_EXT_RP_X = 4.5F,
|
||||||
LEFT_WING_EXT_RP_Y = 5.0F,
|
LEFT_WING_EXT_RP_Y = 6,
|
||||||
LEFT_WING_EXT_RP_Z = 6.0F,
|
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_270 = 4.712F,
|
||||||
ROTATE_90 = 1.571F,
|
ROTATE_90 = 1.571F,
|
||||||
|
|
||||||
SNEAK_LEG_X_ROTATION_ADJUSTMENT = 0.4F,
|
SNEAK_LEG_X_ROTATION_ADJUSTMENT = 0.4F,
|
||||||
|
|
||||||
TAIL_RP_X = 0.0F,
|
TAIL_RP_X = 0,
|
||||||
TAIL_RP_Y = 0.0F,
|
TAIL_RP_Y = 0,
|
||||||
TAIL_RP_Z = 0.0F,
|
TAIL_RP_Z = 0,
|
||||||
|
|
||||||
TAIL_RP_Z_NOTSNEAK = 14.0F,
|
TAIL_RP_Z_NOTSNEAK = 14,
|
||||||
TAIL_RP_Z_SNEAK = 15.0F,
|
TAIL_RP_Z_SNEAK = 15,
|
||||||
|
|
||||||
THIRDP_ARM_CENTRE_X = 0.0F,
|
THIRDP_ARM_CENTRE_X = 0,
|
||||||
THIRDP_ARM_CENTRE_Y = 10.0F,
|
THIRDP_ARM_CENTRE_Y = 10,
|
||||||
THIRDP_ARM_CENTRE_Z = 0.0F,
|
THIRDP_ARM_CENTRE_Z = 0,
|
||||||
|
|
||||||
WING_FOLDED_RP_Y = 13.0F,
|
WING_FOLDED_RP_Y = 13,
|
||||||
WING_FOLDED_RP_Z = -3.0F,
|
WING_FOLDED_RP_Z = -3,
|
||||||
|
|
||||||
NECK_ROT_X = 0.166F;
|
NECK_ROT_X = 0.166F;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,95 +1,70 @@
|
||||||
package com.minelittlepony.model.components;
|
package com.minelittlepony.model.components;
|
||||||
|
|
||||||
import net.minecraft.client.model.ModelRenderer;
|
|
||||||
|
|
||||||
import static com.minelittlepony.model.PonyModelConstants.*;
|
import static com.minelittlepony.model.PonyModelConstants.*;
|
||||||
|
|
||||||
import com.minelittlepony.model.AbstractPonyModel;
|
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 class ModelWing {
|
||||||
public ModelRenderer[] folded = new ModelRenderer[3],
|
public PonyRenderer extended;
|
||||||
extended = new ModelRenderer[6];
|
public PonyRenderer folded;
|
||||||
|
|
||||||
public ModelWing(AbstractPonyModel pony, boolean mirror, float xOffset, float yOffset, float stretch, int texY) {
|
private boolean mirror;
|
||||||
|
|
||||||
// TODO: Don't add the model to the pony if you're just going to remove it again.
|
public ModelWing(AbstractPonyModel pony, boolean mirror, float x, float y, float scale, int texY) {
|
||||||
for (int i = 0; i < folded.length; i++) {
|
this.mirror = mirror;
|
||||||
folded[i] = new ModelRenderer(pony, 56, texY);
|
|
||||||
pony.boxList.remove(folded[i]);
|
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)
|
||||||
for (int i = 0; i < extended.length; i++) {
|
.around(HEAD_RP_X, WING_FOLDED_RP_Y, WING_FOLDED_RP_Z).mirror(mirror);
|
||||||
extended[i] = new ModelRenderer(pony, 56, texY + 3);
|
|
||||||
pony.boxList.remove(extended[i]);
|
addCloseWing(x, y, scale);
|
||||||
// this seems to hide the wings being a different size when folded
|
addFeathers(mirror, y, scale);
|
||||||
extended[i].mirror = mirror;
|
}
|
||||||
}
|
|
||||||
|
private void addCloseWing(float x, float y, float scale) {
|
||||||
init(xOffset, yOffset, stretch);
|
folded.box(x, 5f, 2, 2, 6, 2, scale)
|
||||||
addFeathers(mirror ? -1 : 1, yOffset, stretch);
|
.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) {
|
private void addFeathers(boolean mirror, float y, float scale) {
|
||||||
addFeather(0, r, y, 6.0F, 0.0F, 8, scale + 0.1F);
|
float r = mirror ? -1 : 1;
|
||||||
addFeather(1, r, y, -1.2F, -0.2F, 8, scale + 0.2F);
|
extended.cubeList.clear();
|
||||||
addFeather(2, r, y, 1.8F, 1.3F, 8, scale - 0.1F);
|
extended.around(r * LEFT_WING_EXT_RP_X, LEFT_WING_EXT_RP_Y + y, LEFT_WING_EXT_RP_Z);
|
||||||
addFeather(3, r, y, 5.0F, 2.0F, 8, scale);
|
addFeather(0, r, y, 6, 0, 8, scale + 0.1F);
|
||||||
addFeather(4, r, y, 0.0F, -0.2F, 6, scale + 0.3F);
|
addFeather(1, r, y, -1.2F, -0.2F, 8, scale + 0.2F) .rotateAngleX = -0.85F;
|
||||||
addFeather(5, r, y, 0.0F, 0.2F, 3, scale + 0.19F);
|
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) {
|
private PonyRenderer 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);
|
return extended.child(i).around(0, 0, 0).box(-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 void init(float x, float y, float scale) {
|
public void rotateWalking(float swing) {
|
||||||
initFeather(folded[0], y, x, 2F, 6, scale);
|
folded.rotateAngleY = swing * 0.2F;
|
||||||
initFeather(folded[1], y, x, 4F, 8, scale);
|
|
||||||
initFeather(folded[2], y, x, 6F, 6, scale);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initFeather(ModelRenderer wing, float y, float x, float z, int h, float scale) {
|
|
||||||
wing.addBox(x, 5f, z, 2, h, 2, scale);
|
public void render(boolean extend, float scale) {
|
||||||
wing.setRotationPoint(HEAD_RP_X, WING_FOLDED_RP_Y + y, WING_FOLDED_RP_Z);
|
extended.rotationPointX = (mirror ? -1 : 1) * LEFT_WING_EXT_RP_X;
|
||||||
wing.rotateAngleX = ROTATE_90;
|
extended.rotationPointY = LEFT_WING_EXT_RP_Y;
|
||||||
}
|
|
||||||
|
extended.rotateAngleY = 3;
|
||||||
public void updateModelRotation(float swing) {
|
if (extend) {
|
||||||
for (ModelRenderer feather : folded) {
|
extended.render(scale);
|
||||||
feather.rotateAngleY = swing * 0.2F;
|
} else {
|
||||||
|
folded.render(scale);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void rotate(float angle) {
|
public void rotateFlying(float angle) {
|
||||||
for (ModelRenderer feather : folded) {
|
extended.rotateAngleZ = angle;
|
||||||
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 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,35 +23,52 @@ public class PegasusWings extends ModelBase {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setRotationAngles(float limbSwing, float limbSwingAmount, float ticks, float netHeadYaw, float headPitch, float scaleFactor, Entity entityIn) {
|
public void setRotationAngles(float limbSwing, float limbSwingAmount, float ticks, float netHeadYaw, float headPitch, float scaleFactor, Entity entityIn) {
|
||||||
|
if (!isVisible()) return;
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
leftWing.updateModelRotation(bodySwingRotation);
|
float swing = 0;
|
||||||
rightWing.updateModelRotation(bodySwingRotation);
|
|
||||||
|
|
||||||
if (pony.isSneak && !pony.isFlying) {
|
if (pony.swingProgress > 0) {
|
||||||
leftWing.rotateSneaked(LEFT_WING_ROTATE_ANGLE_Z_SNEAK);
|
swing = MathHelper.sin(MathHelper.sqrt(pony.swingProgress) * PI * 2);
|
||||||
rightWing.rotateSneaked(-LEFT_WING_ROTATE_ANGLE_Z_SNEAK);
|
} else {
|
||||||
} else if (pony.isFlying) {
|
float pi = PI * (float) Math.pow(limbSwingAmount, 16);
|
||||||
float WingRotateAngleZ = (MathHelper.sin(ticks * 0.536F) * 1.0F) + ROTATE_270 + 0.4F;
|
|
||||||
|
|
||||||
leftWing.rotateUnsneaked(WingRotateAngleZ);
|
float mve = limbSwing * 0.6662F; // magic number ahoy
|
||||||
rightWing.rotateUnsneaked(-WingRotateAngleZ);
|
float srt = limbSwingAmount / 4;
|
||||||
|
|
||||||
|
swing = MathHelper.cos(mve + pi) * srt;
|
||||||
}
|
}
|
||||||
|
|
||||||
leftWing.rotate(ROTATE_90);
|
leftWing.rotateWalking(swing);
|
||||||
rightWing.rotate(ROTATE_90);
|
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
|
@Override
|
||||||
public void render(Entity entityIn, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch, float scale) {
|
public void render(Entity entityIn, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch, float scale) {
|
||||||
if (pony.metadata.getRace().hasWings()) {
|
if (!isVisible()) return;
|
||||||
boolean standing = !pony.isFlying && !pony.isSneak;
|
boolean standing = isExtended();
|
||||||
leftWing.render(standing, scale);
|
leftWing.render(standing, scale);
|
||||||
rightWing.render(standing, scale);
|
rightWing.render(standing, scale);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue