diff --git a/src/main/java/com/minelittlepony/client/PonyRenderManager.java b/src/main/java/com/minelittlepony/client/PonyRenderManager.java index 725aa8e2..e399c31a 100644 --- a/src/main/java/com/minelittlepony/client/PonyRenderManager.java +++ b/src/main/java/com/minelittlepony/client/PonyRenderManager.java @@ -6,12 +6,12 @@ import java.util.function.Function; import com.google.common.collect.Maps; import com.minelittlepony.client.gui.hdskins.DummyPony; import com.minelittlepony.client.gui.hdskins.RenderDummyPony; +import com.minelittlepony.client.model.IPonyModel; import com.minelittlepony.client.model.races.PlayerModels; import com.minelittlepony.client.render.LevitatingItemRenderer; import com.minelittlepony.client.render.IPonyRender; import com.minelittlepony.client.render.entities.MobRenderers; import com.minelittlepony.client.render.entities.player.RenderPonyPlayer; -import com.minelittlepony.model.IPonyModel; import javax.annotation.Nullable; diff --git a/src/main/java/com/minelittlepony/client/model/AbstractPonyModel.java b/src/main/java/com/minelittlepony/client/model/AbstractPonyModel.java index a53de39f..39f63ee5 100644 --- a/src/main/java/com/minelittlepony/client/model/AbstractPonyModel.java +++ b/src/main/java/com/minelittlepony/client/model/AbstractPonyModel.java @@ -4,7 +4,6 @@ import com.minelittlepony.client.model.armour.ModelPonyArmour; import com.minelittlepony.client.model.armour.ArmourWrapper; import com.minelittlepony.client.model.components.PonySnout; import com.minelittlepony.client.model.components.PonyTail; -import com.minelittlepony.client.pony.PonyData; import com.minelittlepony.client.transform.PonyTransformation; import com.minelittlepony.client.util.render.AbstractRenderer; import com.minelittlepony.client.util.render.PonyRenderer; @@ -12,20 +11,14 @@ import com.minelittlepony.client.util.render.plane.PlaneRenderer; import com.minelittlepony.model.BodyPart; import com.minelittlepony.model.IPart; import com.minelittlepony.model.armour.IEquestrianArmour; -import com.minelittlepony.pony.IPony; -import com.minelittlepony.pony.IPonyData; -import com.minelittlepony.pony.meta.Size; -import com.minelittlepony.util.math.MathUtil; import net.minecraft.client.model.Cuboid; -import net.minecraft.client.render.entity.model.BipedEntityModel; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; import net.minecraft.util.AbsoluteHand; import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; -import java.util.UUID; +import java.util.function.Consumer; import static com.mojang.blaze3d.platform.GlStateManager.*; @@ -34,38 +27,11 @@ import static com.mojang.blaze3d.platform.GlStateManager.*; */ public abstract class AbstractPonyModel extends ClientPonyModel { - public boolean isSleeping; - public boolean isFlying; - public boolean isElytraFlying; - public boolean isSwimming; - public boolean isCrouching; - public boolean isRidingInteractive; - public boolean headGear; + protected PlaneRenderer upperTorso; + protected PlaneRenderer neck; - /** - * Associated pony data. - */ - private IPonyData metadata = new PonyData(); - - /** - * Vertical pitch whilst flying. - */ - public float motionPitch; - - /** - * Flag indicating that this model is performing a rainboom (flight). - */ - protected boolean rainboom; - - protected double motionLerp; - - public PlaneRenderer upperTorso; - public PlaneRenderer neck; - - public IPart tail; - public PonySnout snout; - - public UUID interpolatorId; + protected IPart tail; + protected PonySnout snout; public AbstractPonyModel(boolean arms) { super(0, arms); @@ -76,67 +42,37 @@ public abstract class AbstractPonyModel extends ClientPo return new ArmourWrapper<>(new ModelPonyArmour<>(), new ModelPonyArmour<>()); } - /** - * Checks flying and speed conditions and sets rainboom to true if we're a species with wings and is going faaast. - */ - private void checkRainboom(T entity, float swing) { - Vec3d motion = entity.getVelocity(); - double zMotion = Math.sqrt(motion.x * motion.x + motion.z * motion.z); - - rainboom = (isFlying() && canFly()) || isElytraFlying(); - rainboom &= zMotion > 0.4F; - - motionLerp = MathUtil.clampLimit(zMotion * 30, 1); - } - - @Override - public void updateLivingState(T entity, IPony pony) { - isChild = entity.isBaby(); - isSneaking = entity.isSneaking(); - isCrouching = pony.isCrouching(entity); - isSleeping = entity.isSleeping(); - isFlying = pony.isFlying(entity); - isElytraFlying = entity.isFallFlying(); - isSwimming = pony.isSwimming(entity); - headGear = pony.isWearingHeadgear(entity); - isRidingInteractive = pony.isRidingInteractive(entity); - interpolatorId = entity.getUuid(); - } - /** * Sets the model's various rotation angles. * - * @param move Entity motion parameter - i.e. velocity in no specific direction used in bipeds to calculate step amount. + * @param move Entity motion parameter + * i.e. velocity in no specific direction used in bipeds to calculate step amount. * @param swing Degree to which each 'limb' swings. - * @param ticks Total whole and partial ticks since the entity's existance. Used in animations together with {@code swing} and {@code move}. + * @param ticks Total whole and partial ticks since the entity's existence. + * Used in animations together with {@code swing} and {@code move}. * @param headYaw Horizontal head motion in radians. * @param headPitch Vertical head motion in radians. - * @param scale Scaling factor used to render this model. Determined by the return value of {@link RenderLivingBase.prepareScale}. Usually {@code 0.0625F}. + * @param scale Scaling factor used to render this model. + * Determined by the return value of {@link RenderLivingBase.prepareScale}. + * Usually {@code 0.0625F}. * @param entity The entity we're being called for. */ @Override public void setAngles(T entity, float move, float swing, float ticks, float headYaw, float headPitch, float scale) { - checkRainboom(entity, swing); + attributes.checkRainboom(entity, swing, canFly()); super.setAngles(entity, move, swing, ticks, headYaw, headPitch, scale); - float headRotateAngleY = isSleeping() ? (Math.abs(entity.getUuid().getMostSignificantBits()) % 2.8F) - 1.9F : headYaw / 57.29578F; - float headRotateAngleX = isSleeping() ? 0.1f : headPitch / 57.29578F; - - headRotateAngleX = Math.min(headRotateAngleX, (float) (0.5f - Math.toRadians(motionPitch))); - headRotateAngleX = Math.max(headRotateAngleX, (float) (-1.25f - Math.toRadians(motionPitch))); - - updateHeadRotation(headRotateAngleX, headRotateAngleY); - + updateHeadRotation(headYaw, headPitch); shakeBody(move, swing, getWobbleAmount(), ticks); rotateLegs(move, swing, ticks, entity); - if (!isSwimming() && !rainboom) { + if (!attributes.isSwimming && !attributes.isGoingFast) { holdItem(swing); } swingItem(entity); - if (isCrouching()) { + if (attributes.isCrouching) { ponyCrouch(); } else if (isRiding) { ponyRide(); @@ -145,27 +81,17 @@ public abstract class AbstractPonyModel extends ClientPo rightLeg.rotationPointY = FRONT_LEG_RP_Y_NOTSNEAK; leftLeg.rotationPointY = FRONT_LEG_RP_Y_NOTSNEAK; - swingArms(ticks); - setHead(0, 0, 0); + animateBreathing(ticks); + head.setRotationPoint(0, 0, 0); } - if (isSleeping) { + if (attributes.isSleeping) { ponySleep(); } animateWears(); - snout.setGender(metadata.getGender()); - } - - @Override - public float getWobbleAmount() { - - if (getSwingAmount() <= 0) { - return 0; - } - - return MathHelper.sin(MathHelper.sqrt(getSwingAmount()) * PI * 2) * 0.04F; + snout.setGender(getMetadata().getGender()); } /** @@ -173,7 +99,7 @@ public abstract class AbstractPonyModel extends ClientPo */ protected void ponyCrouch() { adjustBody(BODY_ROT_X_SNEAK, BODY_RP_Y_SNEAK, BODY_RP_Z_SNEAK); - setHead(0, 6, -2); + head.setRotationPoint(0, 6, -2); rightArm.pitch -= LEG_ROT_X_SNEAK_ADJ; leftArm.pitch -= LEG_ROT_X_SNEAK_ADJ; @@ -189,23 +115,23 @@ public abstract class AbstractPonyModel extends ClientPo rightLeg.pitch = ROTATE_90; leftLeg.pitch = ROTATE_90; - setHead(1, 2, isSneaking ? -1 : 1); + head.setRotationPoint(1, 2, isSneaking ? -1 : 1); - AbstractRenderer.shiftRotationPoint(rightArm, 0, 2, 6); - AbstractRenderer.shiftRotationPoint(leftArm, 0, 2, 6); + AbstractRenderer.shiftRotationPoint(rightArm, 0, 2, 6); + AbstractRenderer.shiftRotationPoint(leftArm, 0, 2, 6); AbstractRenderer.shiftRotationPoint(rightLeg, 0, 2, -8); - AbstractRenderer.shiftRotationPoint(leftLeg, 0, 2, -8); + AbstractRenderer.shiftRotationPoint(leftLeg, 0, 2, -8); } protected void ponyRide() { - if (isRidingInteractive) { + if (attributes.isSitting) { adjustBodyComponents(BODY_ROT_X_RIDING * 2, BODY_RP_Y_RIDING, BODY_RP_Z_RIDING); adjustNeck(BODY_ROT_X_NOTSNEAK * 2, BODY_RP_Y_NOTSNEAK, BODY_RP_Z_NOTSNEAK - 4); - setHead(0, -2, -5); + head.setRotationPoint(0, -2, -5); } else { adjustBodyComponents(BODY_ROT_X_RIDING, BODY_RP_Y_RIDING, BODY_RP_Z_RIDING); adjustNeck(BODY_ROT_X_NOTSNEAK, BODY_RP_Y_NOTSNEAK, BODY_RP_Z_NOTSNEAK); - setHead(0, 0, 0); + head.setRotationPoint(0, 0, 0); } leftLeg.rotationPointZ = 15; @@ -221,7 +147,7 @@ public abstract class AbstractPonyModel extends ClientPo leftArm.roll = -PI * 0.06f; rightArm.roll = PI * 0.06f; - if (isRidingInteractive) { + if (attributes.isSitting) { leftLeg.yaw = PI / 15; leftLeg.pitch = PI / 9; @@ -251,7 +177,7 @@ public abstract class AbstractPonyModel extends ClientPo * @param ticks Total whole and partial ticks since the entity's existance. Used in animations together with {@code swing} and {@code move}. */ protected void shakeBody(float move, float swing, float bodySwing, float ticks) { - tail.setRotationAndAngles(isSwimming() || rainboom, interpolatorId, move, swing, bodySwing * 5, ticks); + tail.setRotationAndAngles(attributes.isSwimming || attributes.isGoingFast, attributes.interpolatorId, move, swing, bodySwing * 5, ticks); upperTorso.yaw = bodySwing; body.yaw = bodySwing; @@ -264,29 +190,7 @@ public abstract class AbstractPonyModel extends ClientPo leftLegOverlay.copyRotation(leftLeg); rightLegOverlay.copyRotation(rightLeg); bodyOverlay.copyRotation(body); - } - - @Override - public Cuboid getHead() { - return head; - } - - @Override - public void setPitch(float pitch) { - motionPitch = pitch; - } - - @Override - public float getPitch() { - return motionPitch; - } - - /** - * Sets the head rotation point. - */ - protected void setHead(float posX, float posY, float posZ) { - head.setRotationPoint(posX, posY, posZ); - headwear.setRotationPoint(posX, posY, posZ); + headwear.copyRotation(head); } /** @@ -295,9 +199,15 @@ public abstract class AbstractPonyModel extends ClientPo * @param x New rotation X * @param y New rotation Y */ - protected void updateHeadRotation(float x, float y) { - headwear.yaw = head.yaw = y; - headwear.pitch = head.pitch = x; + private void updateHeadRotation(float headYaw, float headPitch) { + + head.yaw = attributes.isSleeping ? (Math.abs(attributes.interpolatorId.getMostSignificantBits()) % 2.8F) - 1.9F : headYaw / 57.29578F; + + headPitch = attributes.isSleeping ? 0.1f : headPitch / 57.29578F; + headPitch = Math.min(headPitch, (float) (0.5f - Math.toRadians(attributes.motionPitch))); + headPitch = Math.max(headPitch, (float) (-1.25f - Math.toRadians(attributes.motionPitch))); + + head.pitch = headPitch; } /** @@ -308,9 +218,9 @@ public abstract class AbstractPonyModel extends ClientPo * */ protected void rotateLegs(float move, float swing, float ticks, T entity) { - if (isSwimming()) { + if (attributes.isSwimming) { rotateLegsSwimming(move, swing, ticks, entity); - } else if (isGoingFast()) { + } else if (attributes.isGoingFast) { rotateLegsInFlight(move, swing, ticks, entity); } else { rotateLegsOnGround(move, swing, ticks, entity); @@ -319,14 +229,14 @@ public abstract class AbstractPonyModel extends ClientPo float sin = MathHelper.sin(body.yaw) * 5; float cos = MathHelper.cos(body.yaw) * 5; - float spread = getLegSpread(); + float spread = attributes.isGoingFast ? 2 : 1; rightArm.rotationPointZ = spread + sin; leftArm.rotationPointZ = spread - sin; float legRPX = cos - getLegOutset() - 0.001F; - legRPX = metadata.getInterpolator(entity.getUuid()).interpolate("legOffset", legRPX, 3); + legRPX = getMetadata().getInterpolator(attributes.interpolatorId).interpolate("legOffset", legRPX, 3); rightArm.rotationPointX = -legRPX; rightLeg.rotationPointX = -legRPX; @@ -342,20 +252,16 @@ public abstract class AbstractPonyModel extends ClientPo } /** - * Rotates legs in quopy fashion whilst swimming. - * - * @param move Entity motion parameter - i.e. velocity in no specific direction used in bipeds to calculate step amount. - * @param swing Degree to which each 'limb' swings. - * @param ticks Total whole and partial ticks since the entity's existance. Used in animations together with {@code swing} and {@code move}. - * @param entity The entity we're being called for. + * Rotates legs in a quopy fashion whilst swimming. * + * Takes the same parameters as {@link AbstractPonyModel.setRotationAndAngles} */ protected void rotateLegsSwimming(float move, float swing, float ticks, T entity) { - float legLeft = (ROTATE_90 + MathHelper.sin((move / 3) + 2 * PI/3) / 2) * (float)motionLerp; + float legLeft = (ROTATE_90 + MathHelper.sin((move / 3) + 2 * PI/3) / 2) * (float)attributes.motionLerp; - float left = (ROTATE_90 + MathHelper.sin((move / 3) + 2 * PI) / 2) * (float)motionLerp; - float right = (ROTATE_90 + MathHelper.sin(move / 3) / 2) * (float)motionLerp; + float left = (ROTATE_90 + MathHelper.sin((move / 3) + 2 * PI) / 2) * (float)attributes.motionLerp; + float right = (ROTATE_90 + MathHelper.sin(move / 3) / 2) * (float)attributes.motionLerp; leftArm.pitch = -left; leftArm.yaw = -left/2; @@ -375,15 +281,12 @@ public abstract class AbstractPonyModel extends ClientPo /** * Rotates legs in quopy fashion whilst flying. * - * @param move Entity motion parameter - i.e. velocity in no specific direction used in bipeds to calculate step amount. - * @param swing Degree to which each 'limb' swings. - * @param ticks Total whole and partial ticks since the entity's existance. Used in animations together with {@code swing} and {@code move}. - * @param entity The entity we're being called for. + * Takes the same parameters as {@link AbstractPonyModel.setRotationAndAngles} * */ protected void rotateLegsInFlight(float move, float swing, float ticks, Entity entity) { - float armX = rainboom ? ROTATE_270 : MathHelper.sin(-swing / 2); - float legX = rainboom ? ROTATE_90 : MathHelper.sin(swing / 2); + float armX = attributes.isGoingFast ? ROTATE_270 : MathHelper.sin(-swing / 2); + float legX = attributes.isGoingFast ? ROTATE_90 : MathHelper.sin(swing / 2); leftArm.pitch = armX; rightArm.pitch = armX; @@ -404,10 +307,7 @@ public abstract class AbstractPonyModel extends ClientPo /** * Rotates legs in quopy fashion for walking. * - * @param move Entity motion parameter - i.e. velocity in no specific direction used in bipeds to calculate step amount. - * @param swing Degree to which each 'limb' swings. - * @param ticks Total whole and partial ticks since the entity's existance. Used in animations together with {@code swing} and {@code move}. - * @param entity The entity we're being called for. + * Takes the same parameters as {@link AbstractPonyModel.setRotationAndAngles} * */ protected void rotateLegsOnGround(float move, float swing, float ticks, T entity) { @@ -433,25 +333,19 @@ public abstract class AbstractPonyModel extends ClientPo } protected float getLegOutset() { - if (isSleeping()) { + if (attributes.isSleeping) { return 3.6f; } - if (isCrouching()) { + if (attributes.isCrouching) { return 1; } return 5; } - protected float getLegSpread() { - return rainboom ? 2 : 1; - } - /** - * Adjusts legs as if holding an item. Delegates to the correct arm/leg/limb as neccessary. - * - * @param swing + * Adjusts legs as if holding an item. Delegates to the correct arm/leg/limb as necessary. */ protected void holdItem(float swing) { boolean both = leftArmPose == ArmPose.ITEM && rightArmPose == ArmPose.ITEM; @@ -490,7 +384,7 @@ public abstract class AbstractPonyModel extends ClientPo float mult = 1 - swag/2; arm.pitch = arm.pitch * mult - (PI / 10) * swag; arm.roll = -reflect * (PI / 15); - if (isCrouching()) { + if (attributes.isCrouching) { arm.rotationPointX -= reflect * 2; } case EMPTY: @@ -504,7 +398,7 @@ public abstract class AbstractPonyModel extends ClientPo } arm.rotationPointX += reflect; arm.rotationPointZ += 3; - if (isCrouching()) { + if (attributes.isCrouching) { arm.rotationPointY += 4; } break; @@ -539,14 +433,13 @@ public abstract class AbstractPonyModel extends ClientPo } } - /** * Animates arm swinging. Delegates to the correct arm/leg/limb as neccessary. * * @param entity The entity we are being called for. */ protected void swingItem(T entity) { - if (getSwingAmount() > 0 && !isSleeping()) { + if (getSwingAmount() > 0 && !attributes.isSleeping) { AbsoluteHand mainSide = getPreferedHand(entity); swingArm(getArm(mainSide)); @@ -572,12 +465,13 @@ public abstract class AbstractPonyModel extends ClientPo } /** - * Animates the walking animation. + * Animates the arm's breathing animation when holding items. * - * @param ticks Total whole and partial ticks since the entity's existance. Used in animations together with {@code swing} and {@code move}. + * @param ticks Total whole and partial ticks since the entity's existence. + * Used in animations together with {@code swing} and {@code move}. */ - protected void swingArms(float ticks) { - if (isSleeping()) { + protected void animateBreathing(float ticks) { + if (attributes.isSleeping) { return; } @@ -610,7 +504,7 @@ public abstract class AbstractPonyModel extends ClientPo upperTorso.rotationPointZ = rotationPointZ; } - protected void adjustNeck(float rotateAngleX, float rotationPointY, float rotationPointZ) { + private void adjustNeck(float rotateAngleX, float rotationPointY, float rotationPointZ) { neck.setRotationPoint(NECK_ROT_X + rotateAngleX, rotationPointY, rotationPointZ); } @@ -650,7 +544,6 @@ public abstract class AbstractPonyModel extends ClientPo tail.init(yOffset, stretch); } - /** * Creates the main torso and neck. */ @@ -716,12 +609,12 @@ public abstract class AbstractPonyModel extends ClientPo preInitLegs(); preInitLegwear(); - int armLength = getArmLength(); - int armWidth = getArmWidth(); - int armDepth = getArmDepth(); + int armLength = attributes.armLength; + int armWidth = attributes.armWidth; + int armDepth = attributes.armDepth; - float rarmX = getLegRotationX(); - float rarmY = getArmRotationY(); + float rarmX = attributes.armRotationX; + float rarmY = attributes.armRotationY; float armX = THIRDP_ARM_CENTRE_X; float armY = THIRDP_ARM_CENTRE_Y; @@ -748,95 +641,6 @@ public abstract class AbstractPonyModel extends ClientPo rightLegOverlay.addBox(armX - armWidth, armY, armZ, armWidth, armLength, armDepth, stretch + 0.25f); } - protected int getArmWidth() { - return 4; - } - - protected int getArmDepth() { - return 4; - } - - protected int getArmLength() { - return 12; - } - - protected float getLegRotationX() { - return 3; - } - - protected float getArmRotationY() { - return 8; - } - - public ArmPose getArmPoseForSide(AbsoluteHand side) { - return side == AbsoluteHand.RIGHT ? rightArmPose : leftArmPose; - } - - @Override - public IPonyData getMetadata() { - return metadata; - } - - @Override - public void apply(IPonyData meta) { - metadata = meta; - } - - @Override - public boolean isCrouching() { - return isCrouching; - } - - @Override - public boolean isGoingFast() { - return rainboom; - } - - @Override - public boolean hasHeadGear() { - return headGear; - } - - @Override - public boolean isFlying() { - return isFlying && canFly(); - } - - @Override - public boolean isElytraFlying() { - return isElytraFlying; - } - - @Override - public boolean isSleeping() { - return isSleeping; - } - - @Override - public boolean isRiding() { - return isRiding; - } - - @Override - public boolean isSwimming() { - return isSwimming; - } - - @Override - public boolean isChild() { - return getSize() == Size.FOAL; - } - - @Override - public Size getSize() { - return isChild ? Size.FOAL : getMetadata().getSize(); - } - - @Override - public float getSwingAmount() { - return handSwingProgress; - } - @Override public float getRiderYOffset() { @@ -853,11 +657,6 @@ public abstract class AbstractPonyModel extends ClientPo } } - @Override - public float getModelHeight() { - return 2; - } - /** * Sets the model's various rotation angles. * @@ -871,41 +670,27 @@ public abstract class AbstractPonyModel extends ClientPo */ @Override public void render(T entity, float move, float swing, float ticks, float headYaw, float headPitch, float scale) { + renderStage(BodyPart.BODY, scale, this::renderBody); + renderStage(BodyPart.NECK, scale, this::renderNeck); + renderStage(BodyPart.HEAD, scale, this::renderHead); + renderStage(BodyPart.LEGS, scale, this::renderLegs); + if (textureHeight == 64) { + renderStage(BodyPart.LEGS, scale, this::renderSleeves); + renderStage(BodyPart.BODY, scale, this::renderVest); + } + + renderStage(BodyPart.HEAD, scale, this::renderHelmet); + } + + protected void renderStage(BodyPart part, float scale, Consumer action) { pushMatrix(); transform(BodyPart.BODY); - renderBody(entity, move, swing, ticks, headYaw, headPitch, scale); - popMatrix(); - - pushMatrix(); - transform(BodyPart.NECK); - renderNeck(scale); - popMatrix(); - - pushMatrix(); - transform(BodyPart.HEAD); - renderHead(entity, move, swing, ticks, headYaw, headPitch, scale); - popMatrix(); - - pushMatrix(); - transform(BodyPart.LEGS); - renderLegs(scale); - popMatrix(); - - pushMatrix(); - transform(BodyPart.HEAD); - renderHelmet(scale); + action.accept(scale); popMatrix(); } - /** - * - * Called to render the head. - * - * Takes the same parameters as {@link AbstractPonyModel.setRotationAndAngles} - * - */ - protected void renderHead(T entity, float move, float swing, float ticks, float headYaw, float headPitch, float scale) { + protected void renderHead(float scale) { head.render(scale); } @@ -918,23 +703,16 @@ public abstract class AbstractPonyModel extends ClientPo neck.render(scale); } - /** - * - * Called to render the head. - * - * Takes the same parameters as {@link AbstractPonyModel.setRotationAndAngles} - * - */ - protected void renderBody(T entity, float move, float swing, float ticks, float headYaw, float headPitch, float scale) { + protected void renderBody(float scale) { body.render(scale); - if (textureHeight == 64) { - bodyOverlay.render(scale); - } - upperTorso.render(scale); body.applyTransform(scale); - tail.renderPart(scale, entity.getUuid()); + tail.renderPart(scale, attributes.interpolatorId); + } + protected void renderVest(float scale) { + body.applyTransform(scale); + bodyOverlay.render(scale); } protected void renderLegs(float scale) { @@ -946,10 +724,6 @@ public abstract class AbstractPonyModel extends ClientPo rightArm.render(scale); leftLeg.render(scale); rightLeg.render(scale); - - if (textureHeight == 64) { - renderSleeves(scale); - } } protected void renderSleeves(float scale) { @@ -961,36 +735,15 @@ public abstract class AbstractPonyModel extends ClientPo @Override public void transform(BodyPart part) { - if (isSleeping()) { + if (attributes.isSleeping) { rotatef(90, 1, 0, 0); rotatef(180, 0, 1, 0); } if (part == BodyPart.HEAD) { - rotatef(motionPitch, 1, 0, 0); + rotatef(attributes.motionPitch, 1, 0, 0); } PonyTransformation.forSize(getSize()).transform(this, part); } - - /** - * Copies this model's attributes from some other. - */ - @Override - public void setAttributes(BipedEntityModel model) { - super.setAttributes(model); - - if (model instanceof AbstractPonyModel) { - AbstractPonyModel pony = (AbstractPonyModel) model; - isFlying = pony.isFlying; - isCrouching = pony.isCrouching; - isElytraFlying = pony.isElytraFlying; - isSwimming = pony.isSwimming; - isSleeping = pony.isSleeping; - headGear = pony.headGear; - metadata = pony.metadata; - motionPitch = pony.motionPitch; - rainboom = pony.rainboom; - } - } } diff --git a/src/main/java/com/minelittlepony/client/model/ClientPonyModel.java b/src/main/java/com/minelittlepony/client/model/ClientPonyModel.java index 91d095e3..0f961fbc 100644 --- a/src/main/java/com/minelittlepony/client/model/ClientPonyModel.java +++ b/src/main/java/com/minelittlepony/client/model/ClientPonyModel.java @@ -1,19 +1,96 @@ package com.minelittlepony.client.model; import net.minecraft.client.model.Cuboid; +import net.minecraft.client.render.entity.model.BipedEntityModel; import net.minecraft.client.render.entity.model.PlayerEntityModel; import net.minecraft.entity.LivingEntity; -import com.minelittlepony.model.IPonyModel; +import com.minelittlepony.client.pony.PonyData; +import com.minelittlepony.model.ModelAttributes; +import com.minelittlepony.pony.IPony; +import com.minelittlepony.pony.IPonyData; +import com.minelittlepony.pony.meta.Size; import java.util.Random; +/** + * The raw pony model without any implementations. + * Will act effectively the same as a normal player model without any hints + * of being cute and adorable. + * + * Modders can extend this class to make their own pony models if they wish. + */ public abstract class ClientPonyModel extends PlayerEntityModel implements IPonyModel { + /** + * The model attributes. + */ + protected ModelAttributes attributes = new ModelAttributes<>(); + + /** + * Associated pony data. + */ + protected IPonyData metadata = new PonyData(); + public ClientPonyModel(float float_1, boolean boolean_1) { super(float_1, boolean_1); } + @Override + public void updateLivingState(T entity, IPony pony) { + isChild = entity.isBaby(); + isSneaking = entity.isSneaking(); + attributes.updateLivingState(entity, pony); + } + + @Override + public ModelAttributes getAttributes() { + return attributes; + } + + @Override + public IPonyData getMetadata() { + return metadata; + } + + @Override + public Size getSize() { + return isChild ? Size.FOAL : getMetadata().getSize(); + } + + @Override + public void apply(IPonyData meta) { + metadata = meta; + } + + @Override + public Cuboid getHead() { + return head; + } + + @Override + public boolean isRiding() { + return isRiding; + } + + @Override + public float getSwingAmount() { + return handSwingProgress; + } + + /** + * Copies this model's attributes from some other. + */ + @Override + public void setAttributes(BipedEntityModel model) { + super.setAttributes(model); + + if (model instanceof ClientPonyModel) { + attributes = ((ClientPonyModel)model).attributes; + metadata = ((ClientPonyModel)model).metadata; + } + } + @Override public Cuboid getRandomCuboid(Random rand) { // grab one at random, but cycle through the list until you find one that's filled. diff --git a/src/main/java/com/minelittlepony/model/IPonyMixinModel.java b/src/main/java/com/minelittlepony/client/model/IPonyMixinModel.java similarity index 67% rename from src/main/java/com/minelittlepony/model/IPonyMixinModel.java rename to src/main/java/com/minelittlepony/client/model/IPonyMixinModel.java index 1f922c05..b6c3e512 100644 --- a/src/main/java/com/minelittlepony/model/IPonyMixinModel.java +++ b/src/main/java/com/minelittlepony/client/model/IPonyMixinModel.java @@ -1,9 +1,12 @@ -package com.minelittlepony.model; +package com.minelittlepony.client.model; import net.minecraft.client.model.Cuboid; import net.minecraft.entity.LivingEntity; import net.minecraft.util.AbsoluteHand; +import com.minelittlepony.model.BodyPart; +import com.minelittlepony.model.IUnicorn; +import com.minelittlepony.model.ModelAttributes; import com.minelittlepony.model.armour.IEquestrianArmour; import com.minelittlepony.pony.IPonyData; import com.minelittlepony.pony.meta.Size; @@ -23,13 +26,13 @@ public interface IPonyMixinModel } @Override - default void setPitch(float pitch) { - mixin().setPitch(pitch); + default IPonyData getMetadata() { + return mixin().getMetadata(); } @Override - default float getPitch() { - return mixin().getPitch(); + default ModelAttributes getAttributes() { + return mixin().getAttributes(); } @Override @@ -42,56 +45,16 @@ public interface IPonyMixinModel return mixin().createArmour(); } - @Override - default IPonyData getMetadata() { - return mixin().getMetadata(); - } - @Override default void apply(IPonyData meta) { mixin().apply(meta); } - @Override - default boolean isCrouching() { - return mixin().isCrouching(); - } - - @Override - default boolean isFlying() { - return mixin().isFlying(); - } - - @Override - default boolean isElytraFlying() { - return mixin().isElytraFlying(); - } - - @Override - default boolean isSleeping() { - return mixin().isSleeping(); - } - - @Override - default boolean isSwimming() { - return mixin().isSwimming(); - } - @Override default boolean isRiding() { return mixin().isRiding(); } - @Override - default boolean isGoingFast() { - return mixin().isGoingFast(); - } - - @Override - default boolean isChild() { - return mixin().isChild(); - } - @Override default float getSwingAmount() { return mixin().getSwingAmount(); @@ -107,11 +70,6 @@ public interface IPonyMixinModel return mixin().getRiderYOffset(); } - @Override - default float getModelHeight() { - return mixin().getModelHeight(); - } - @Override default void setArmAngle(float var1, AbsoluteHand var2) { mixin().setArmAngle(var1, var2); @@ -122,11 +80,6 @@ public interface IPonyMixinModel return mixin().getHead(); } - @Override - default boolean hasHeadGear() { - return mixin().hasHeadGear(); - } - @Override default Cuboid getBodyPart(BodyPart part) { return mixin().getBodyPart(part); diff --git a/src/main/java/com/minelittlepony/model/IPonyModel.java b/src/main/java/com/minelittlepony/client/model/IPonyModel.java similarity index 50% rename from src/main/java/com/minelittlepony/model/IPonyModel.java rename to src/main/java/com/minelittlepony/client/model/IPonyModel.java index be0f7348..0d2599d8 100644 --- a/src/main/java/com/minelittlepony/model/IPonyModel.java +++ b/src/main/java/com/minelittlepony/client/model/IPonyModel.java @@ -1,12 +1,21 @@ -package com.minelittlepony.model; +package com.minelittlepony.client.model; import net.minecraft.client.model.Cuboid; import net.minecraft.entity.LivingEntity; +import com.minelittlepony.model.ICapitated; +import com.minelittlepony.model.ICompartmented; +import com.minelittlepony.model.IModel; +import com.minelittlepony.model.PonyModelConstants; import com.minelittlepony.pony.IPony; public interface IPonyModel extends PonyModelConstants, IModel, ICapitated, ICompartmented { default void updateLivingState(T entity, IPony pony) { } + + @Override + default boolean hasHeadGear() { + return getAttributes().hasHeadGear; + } } diff --git a/src/main/java/com/minelittlepony/client/model/armour/ModelPonyArmour.java b/src/main/java/com/minelittlepony/client/model/armour/ModelPonyArmour.java index 48037e4d..f01229fe 100644 --- a/src/main/java/com/minelittlepony/client/model/armour/ModelPonyArmour.java +++ b/src/main/java/com/minelittlepony/client/model/armour/ModelPonyArmour.java @@ -27,7 +27,7 @@ public class ModelPonyArmour extends AbstractPonyModel implements IPart, PonyMode if (pegasus.wingsAreOpen()) { flapAngle = pegasus.getWingRotationFactor(ticks); - if (!pegasus.isCrouching() && pegasus.isWearing(Wearable.SADDLE_BAGS)) { + if (!pegasus.getAttributes().isCrouching && pegasus.isWearing(Wearable.SADDLE_BAGS)) { flapAngle -= 1F; } } diff --git a/src/main/java/com/minelittlepony/client/model/components/PonyTail.java b/src/main/java/com/minelittlepony/client/model/components/PonyTail.java index ee9c2da7..6e9bbea3 100644 --- a/src/main/java/com/minelittlepony/client/model/components/PonyTail.java +++ b/src/main/java/com/minelittlepony/client/model/components/PonyTail.java @@ -34,7 +34,7 @@ public class PonyTail extends PlaneRenderer implements IPart { roll = rainboom ? 0 : MathHelper.cos(move * 0.8F) * 0.2f * swing; yaw = bodySwing; - if (theModel.isCrouching() && !rainboom) { + if (theModel.getAttributes().isCrouching && !rainboom) { rotateSneak(); } else if (theModel.isRiding()) { rotationPointZ = TAIL_RP_Z_RIDING; diff --git a/src/main/java/com/minelittlepony/client/model/components/SeaponyTail.java b/src/main/java/com/minelittlepony/client/model/components/SeaponyTail.java index b0f9e5ab..047bf5c9 100644 --- a/src/main/java/com/minelittlepony/client/model/components/SeaponyTail.java +++ b/src/main/java/com/minelittlepony/client/model/components/SeaponyTail.java @@ -1,10 +1,10 @@ package com.minelittlepony.client.model.components; import com.minelittlepony.client.model.AbstractPonyModel; +import com.minelittlepony.client.model.IPonyModel; import com.minelittlepony.client.util.render.PonyRenderer; import com.minelittlepony.client.util.render.plane.PlaneRenderer; import com.minelittlepony.model.IPart; -import com.minelittlepony.model.IPonyModel; import com.mojang.blaze3d.platform.GlStateManager; import java.util.UUID; @@ -53,7 +53,7 @@ public class SeaponyTail implements IPart { @Override public void setRotationAndAngles(boolean rainboom, UUID interpolatorId, float move, float swing, float bodySwing, float ticks) { - float rotation = model.isSleeping() ? 0 : MathHelper.sin(ticks * 0.536f) / 4; + float rotation = model.getAttributes().isSleeping ? 0 : MathHelper.sin(ticks * 0.536f) / 4; tailBase.pitch = TAIL_ROTX + rotation; tailTip.pitch = rotation; diff --git a/src/main/java/com/minelittlepony/client/model/entities/ModelEnderStallion.java b/src/main/java/com/minelittlepony/client/model/entities/ModelEnderStallion.java index e073ee16..95d6ac98 100644 --- a/src/main/java/com/minelittlepony/client/model/entities/ModelEnderStallion.java +++ b/src/main/java/com/minelittlepony/client/model/entities/ModelEnderStallion.java @@ -20,6 +20,14 @@ public class ModelEnderStallion extends ModelSkeletonPony { private PonyRenderer leftHorn; private PonyRenderer rightHorn; + public ModelEnderStallion() { + super(); + attributes.armRotationX = 3; + attributes.armRotationY = 14; + attributes.armLength = 30; + attributes.visualHeight = 3; + } + @Override public void animateModel(EndermanEntity entity, float move, float swing, float ticks) { rightArmPose = isCarrying ? ArmPose.BLOCK : ArmPose.EMPTY; @@ -44,12 +52,6 @@ public class ModelEnderStallion extends ModelSkeletonPony { rightHorn.pitch = 0.5F; } - @Override - public void setVisible(boolean visible) { - super.setVisible(visible); - - } - @Override public void setAngles(EndermanEntity entity, float move, float swing, float ticks, float headYaw, float headPitch, float scale) { super.setAngles(entity, move, swing, ticks, headYaw, headPitch, scale); @@ -130,26 +132,6 @@ public class ModelEnderStallion extends ModelSkeletonPony { return isAttacking; } - @Override - protected float getLegRotationX() { - return 3; - } - - @Override - protected float getArmRotationY() { - return 14; - } - - @Override - protected int getArmLength() { - return 30; - } - - @Override - public float getModelHeight() { - return 3; - } - @Override public float getWingRotationFactor(float ticks) { return MathHelper.sin(ticks) + WING_ROT_Z_SNEAK; diff --git a/src/main/java/com/minelittlepony/client/model/entities/ModelGuardianPony.java b/src/main/java/com/minelittlepony/client/model/entities/ModelGuardianPony.java index f00f5627..95c9d384 100644 --- a/src/main/java/com/minelittlepony/client/model/entities/ModelGuardianPony.java +++ b/src/main/java/com/minelittlepony/client/model/entities/ModelGuardianPony.java @@ -4,8 +4,8 @@ import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.client.render.entity.model.GuardianEntityModel; import net.minecraft.entity.mob.GuardianEntity; +import com.minelittlepony.client.model.IPonyMixinModel; import com.minelittlepony.client.util.render.PonyRenderer; -import com.minelittlepony.model.IPonyMixinModel; public class ModelGuardianPony extends GuardianEntityModel implements IPonyMixinModel.Caster, PonyRenderer> { private final ModelSeapony mixin = new ModelSeapony<>(); diff --git a/src/main/java/com/minelittlepony/client/model/entities/ModelSeapony.java b/src/main/java/com/minelittlepony/client/model/entities/ModelSeapony.java index ca99809a..38575b61 100644 --- a/src/main/java/com/minelittlepony/client/model/entities/ModelSeapony.java +++ b/src/main/java/com/minelittlepony/client/model/entities/ModelSeapony.java @@ -44,7 +44,7 @@ public class ModelSeapony extends ModelUnicorn { // Seaponies can't sneak, silly isSneaking = false; - isCrouching = false; + attributes.isCrouching = false; } @Override @@ -99,7 +99,7 @@ public class ModelSeapony extends ModelUnicorn { float flapMotion = MathHelper.cos(ticks / 10) / 5; - if (isSleeping()) { + if (attributes.isSleeping) { flapMotion /= 2; } @@ -108,7 +108,7 @@ public class ModelSeapony extends ModelUnicorn { leftFin.yaw = finAngle; rightFin.yaw = -finAngle; - if (!isSleeping()) { + if (!attributes.isSleeping) { centerFin.roll = flapMotion; } @@ -152,12 +152,12 @@ public class ModelSeapony extends ModelUnicorn { } @Override - protected void renderBody(T entity, float move, float swing, float ticks, float headYaw, float headPitch, float scale) { + protected void renderBody(float scale) { body.render(scale); bodyCenter.render(scale); body.applyTransform(scale); - tail.renderPart(scale, entity.getUuid()); + tail.renderPart(scale, attributes.interpolatorId); GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); GlStateManager.enableBlend(); @@ -169,7 +169,6 @@ public class ModelSeapony extends ModelUnicorn { GlStateManager.disableBlend(); GL11.glPopAttrib(); - } @Override diff --git a/src/main/java/com/minelittlepony/client/model/entities/ModelSkeletonPony.java b/src/main/java/com/minelittlepony/client/model/entities/ModelSkeletonPony.java index 03797b20..76db0f50 100644 --- a/src/main/java/com/minelittlepony/client/model/entities/ModelSkeletonPony.java +++ b/src/main/java/com/minelittlepony/client/model/entities/ModelSkeletonPony.java @@ -15,10 +15,19 @@ public class ModelSkeletonPony extends ModelMobPony public boolean isWithered; + public ModelSkeletonPony() { + super(); + attributes.armWidth = 2; + attributes.armDepth = 2; + attributes.armRotationX = 3F; + attributes.armRotationY = 8F; + } + @Override public void animateModel(T entity, float move, float swing, float ticks) { isUnicorn = entity.getUuid().getLeastSignificantBits() % 3 != 0; isWithered = entity instanceof WitherSkeletonEntity; + attributes.visualHeight = isWithered ? 2.5F : 2; rightArmPose = ArmPose.EMPTY; leftArmPose = ArmPose.EMPTY; @@ -77,33 +86,8 @@ public class ModelSkeletonPony extends ModelMobPony @Override protected float getLegOutset() { - if (isSleeping()) return 2.6f; - if (isCrouching()) return 0; + if (attributes.isSleeping) return 2.6f; + if (attributes.isCrouching) return 0; return 4; } - - @Override - protected int getArmWidth() { - return 2; - } - - @Override - protected int getArmDepth() { - return 2; - } - - @Override - protected float getLegRotationX() { - return 3; - } - - @Override - public float getModelHeight() { - return isWithered ? 2.5F : 2; - } - - @Override - protected float getArmRotationY() { - return 8; - } } diff --git a/src/main/java/com/minelittlepony/client/model/entities/ModelVillagerPony.java b/src/main/java/com/minelittlepony/client/model/entities/ModelVillagerPony.java index cc9898a9..d7c38e20 100644 --- a/src/main/java/com/minelittlepony/client/model/entities/ModelVillagerPony.java +++ b/src/main/java/com/minelittlepony/client/model/entities/ModelVillagerPony.java @@ -31,11 +31,12 @@ public class ModelVillagerPony e profession = entity.getVillagerData().getProfession(); special = entity.hasCustomName() && "Derpy".equals(entity.getCustomName().getString()); special2 = special && entity.getUuid().getLeastSignificantBits() % 20 == 0; + attributes.visualHeight = special2 ? 2.3F : 2; } @Override - protected void renderBody(T entity, float move, float swing, float ticks, float headYaw, float headPitch, float scale) { - super.renderBody(entity, move, swing, ticks, headYaw, headPitch, scale); + protected void renderBody(float scale) { + super.renderBody(scale); if (!special && profession != VillagerProfession.NONE && profession != VillagerProfession.NITWIT) { if (profession == VillagerProfession.BUTCHER) { @@ -46,11 +47,6 @@ public class ModelVillagerPony e } } - @Override - public float getModelHeight() { - return special2 ? 2.3F : 2; - } - @Override public boolean isWearing(Wearable wearable) { if (wearable == Wearable.SADDLE_BAGS) { diff --git a/src/main/java/com/minelittlepony/client/model/entities/ModelWitchPony.java b/src/main/java/com/minelittlepony/client/model/entities/ModelWitchPony.java index ff4d66a6..547c9b58 100644 --- a/src/main/java/com/minelittlepony/client/model/entities/ModelWitchPony.java +++ b/src/main/java/com/minelittlepony/client/model/entities/ModelWitchPony.java @@ -11,6 +11,7 @@ public class ModelWitchPony extends ModelZebra { public ModelWitchPony() { super(false); + attributes.visualHeight = 2.5F; } @Override @@ -48,10 +49,12 @@ public class ModelWitchPony extends ModelZebra { rightArmOverlay.pitch = legDrinkingAngle; rightArm.yaw = 0.1F; rightArmOverlay.yaw = 0.1F; - rightArm.z = 0.1f; - rightArmOverlay.z = 0.1f; + rightArm.z = 0.1F; + rightArmOverlay.z = 0.1F; - if (rot > 0) rot = 0; + if (rot > 0) { + rot = 0; + } head.pitch = -rot / 2; headwear.pitch = -rot / 2; @@ -59,18 +62,6 @@ public class ModelWitchPony extends ModelZebra { rightArm.z = 0; rightArmOverlay.z = 0; } - - - } - - @Override - public boolean isChild() { - return isChild; - } - - @Override - public float getModelHeight() { - return 2.5F; } @Override diff --git a/src/main/java/com/minelittlepony/client/model/gear/ChristmasHat.java b/src/main/java/com/minelittlepony/client/model/gear/ChristmasHat.java index 3765d35d..cf5fb0a1 100644 --- a/src/main/java/com/minelittlepony/client/model/gear/ChristmasHat.java +++ b/src/main/java/com/minelittlepony/client/model/gear/ChristmasHat.java @@ -9,7 +9,7 @@ import org.lwjgl.opengl.GL11; import com.minelittlepony.client.util.render.Color; import com.minelittlepony.client.util.render.PonyRenderer; import com.minelittlepony.model.BodyPart; -import com.minelittlepony.model.IPonyModel; +import com.minelittlepony.model.IModel; import com.minelittlepony.pony.meta.Wearable; import java.util.Calendar; @@ -48,12 +48,12 @@ public class ChristmasHat extends AbstractGear { } @Override - public boolean canRender(IPonyModel model, Entity entity) { + public boolean canRender(IModel model, Entity entity) { return isChristmasDay() || model.isWearing(Wearable.ANTLERS); } @Override - public void setLivingAnimations(IPonyModel model, Entity entity) { + public void setLivingAnimations(IModel model, Entity entity) { tint = model.getMetadata().getGlowColor(); } diff --git a/src/main/java/com/minelittlepony/client/model/gear/Muffin.java b/src/main/java/com/minelittlepony/client/model/gear/Muffin.java index d19086c2..295b3357 100644 --- a/src/main/java/com/minelittlepony/client/model/gear/Muffin.java +++ b/src/main/java/com/minelittlepony/client/model/gear/Muffin.java @@ -5,7 +5,7 @@ import net.minecraft.util.Identifier; import com.minelittlepony.client.util.render.PonyRenderer; import com.minelittlepony.model.BodyPart; -import com.minelittlepony.model.IPonyModel; +import com.minelittlepony.model.IModel; import com.minelittlepony.model.gear.IStackable; import com.minelittlepony.pony.meta.Wearable; @@ -34,7 +34,7 @@ public class Muffin extends AbstractGear implements IStackable { } @Override - public boolean canRender(IPonyModel model, Entity entity) { + public boolean canRender(IModel model, Entity entity) { return model.isWearing(Wearable.MUFFIN); } diff --git a/src/main/java/com/minelittlepony/client/model/gear/SaddleBags.java b/src/main/java/com/minelittlepony/client/model/gear/SaddleBags.java index fd3b0877..0a764963 100644 --- a/src/main/java/com/minelittlepony/client/model/gear/SaddleBags.java +++ b/src/main/java/com/minelittlepony/client/model/gear/SaddleBags.java @@ -2,8 +2,8 @@ package com.minelittlepony.client.model.gear; import com.minelittlepony.client.util.render.plane.PlaneRenderer; import com.minelittlepony.model.BodyPart; +import com.minelittlepony.model.IModel; import com.minelittlepony.model.IPegasus; -import com.minelittlepony.model.IPonyModel; import com.minelittlepony.pony.meta.Wearable; import com.mojang.blaze3d.platform.GlStateManager; @@ -25,7 +25,7 @@ public class SaddleBags extends AbstractGear { float dropAmount = 0; - private IPonyModel model; + private IModel model; @Override public void init(float yOffset, float stretch) { @@ -73,7 +73,7 @@ public class SaddleBags extends AbstractGear { } @Override - public void setLivingAnimations(IPonyModel model, Entity entity) { + public void setLivingAnimations(IModel model, Entity entity) { this.model = model; hangLow = false; @@ -126,7 +126,7 @@ public class SaddleBags extends AbstractGear { } @Override - public boolean canRender(IPonyModel model, Entity entity) { + public boolean canRender(IModel model, Entity entity) { return model.isWearing(Wearable.SADDLE_BAGS); } diff --git a/src/main/java/com/minelittlepony/client/model/gear/Stetson.java b/src/main/java/com/minelittlepony/client/model/gear/Stetson.java index c48968cb..ef05c4d2 100644 --- a/src/main/java/com/minelittlepony/client/model/gear/Stetson.java +++ b/src/main/java/com/minelittlepony/client/model/gear/Stetson.java @@ -6,7 +6,7 @@ import net.minecraft.util.Identifier; import com.minelittlepony.client.util.render.PonyRenderer; import com.minelittlepony.client.util.render.plane.PlaneRenderer; import com.minelittlepony.model.BodyPart; -import com.minelittlepony.model.IPonyModel; +import com.minelittlepony.model.IModel; import com.minelittlepony.model.gear.IStackable; import com.minelittlepony.pony.meta.Wearable; @@ -49,7 +49,7 @@ public class Stetson extends AbstractGear implements IStackable { } @Override - public boolean canRender(IPonyModel model, Entity entity) { + public boolean canRender(IModel model, Entity entity) { return model.isWearing(Wearable.STETSON); } diff --git a/src/main/java/com/minelittlepony/client/model/gear/WitchHat.java b/src/main/java/com/minelittlepony/client/model/gear/WitchHat.java index f25b1884..3342b9ae 100644 --- a/src/main/java/com/minelittlepony/client/model/gear/WitchHat.java +++ b/src/main/java/com/minelittlepony/client/model/gear/WitchHat.java @@ -5,7 +5,7 @@ import net.minecraft.util.Identifier; import com.minelittlepony.client.util.render.PonyRenderer; import com.minelittlepony.model.BodyPart; -import com.minelittlepony.model.IPonyModel; +import com.minelittlepony.model.IModel; import com.minelittlepony.model.gear.IStackable; import com.minelittlepony.pony.meta.Wearable; @@ -40,7 +40,7 @@ public class WitchHat extends AbstractGear implements IStackable { @Override - public boolean canRender(IPonyModel model, Entity entity) { + public boolean canRender(IModel model, Entity entity) { return model.isWearing(Wearable.HAT); } diff --git a/src/main/java/com/minelittlepony/client/model/races/ModelAlicorn.java b/src/main/java/com/minelittlepony/client/model/races/ModelAlicorn.java index 551803e9..f1de38d2 100644 --- a/src/main/java/com/minelittlepony/client/model/races/ModelAlicorn.java +++ b/src/main/java/com/minelittlepony/client/model/races/ModelAlicorn.java @@ -28,16 +28,16 @@ public class ModelAlicorn extends ModelUnicorn implem super.setAngles(entity, move, swing, ticks, headYaw, headPitch, scale); if (canFly()) { - wings.setRotationAndAngles(rainboom, entity.getUuid(), move, swing, 0, ticks); + wings.setRotationAndAngles(attributes.isGoingFast, attributes.interpolatorId, move, swing, 0, ticks); } } @Override - protected void renderBody(T entity, float move, float swing, float ticks, float headYaw, float headPitch, float scale) { - super.renderBody(entity, move, swing, ticks, headYaw, headPitch, scale); + protected void renderBody(float scale) { + super.renderBody(scale); if (canFly()) { - wings.renderPart(scale, entity.getUuid()); + wings.renderPart(scale, attributes.interpolatorId); } } } diff --git a/src/main/java/com/minelittlepony/client/model/races/ModelChangeling.java b/src/main/java/com/minelittlepony/client/model/races/ModelChangeling.java index 16d56c63..5195f176 100644 --- a/src/main/java/com/minelittlepony/client/model/races/ModelChangeling.java +++ b/src/main/java/com/minelittlepony/client/model/races/ModelChangeling.java @@ -19,7 +19,7 @@ public class ModelChangeling extends ModelAlicorn { @Override public boolean wingsAreOpen() { - return (isFlying() || isCrouching()) && !isElytraFlying(); + return (isFlying() || attributes.isCrouching) && !getAttributes().isGliding; } @Override diff --git a/src/main/java/com/minelittlepony/client/model/races/ModelEarthPony.java b/src/main/java/com/minelittlepony/client/model/races/ModelEarthPony.java index f00026ab..5919a289 100644 --- a/src/main/java/com/minelittlepony/client/model/races/ModelEarthPony.java +++ b/src/main/java/com/minelittlepony/client/model/races/ModelEarthPony.java @@ -14,6 +14,12 @@ public class ModelEarthPony extends AbstractPonyModel public ModelEarthPony(boolean smallArms) { super(smallArms); this.smallArms = smallArms; + + if (smallArms) { + attributes.armWidth = 3; + attributes.armRotationX = 2F; + attributes.armRotationY = 8.5F; + } } @Override @@ -28,28 +34,13 @@ public class ModelEarthPony extends AbstractPonyModel @Override protected float getLegOutset() { if (smallArms) { - if (isSleeping()) return 2.6f; - if (isCrouching()) return 1; + if (attributes.isSleeping) return 2.6f; + if (attributes.isCrouching) return 1; return 4; } return super.getLegOutset(); } - @Override - protected int getArmWidth() { - return smallArms ? 3 : super.getArmWidth(); - } - - @Override - protected float getLegRotationX() { - return smallArms ? 2 : super.getLegRotationX(); - } - - @Override - protected float getArmRotationY() { - return smallArms ? 8.5f : super.getArmRotationY(); - } - @Override protected void initHead(float yOffset, float stretch) { super.initHead(yOffset, stretch); diff --git a/src/main/java/com/minelittlepony/client/model/races/ModelPegasus.java b/src/main/java/com/minelittlepony/client/model/races/ModelPegasus.java index c371f836..d2ab3023 100644 --- a/src/main/java/com/minelittlepony/client/model/races/ModelPegasus.java +++ b/src/main/java/com/minelittlepony/client/model/races/ModelPegasus.java @@ -26,12 +26,12 @@ public class ModelPegasus extends ModelEarthPony impl @Override public void setAngles(T entity, float move, float swing, float ticks, float headYaw, float headPitch, float scale) { super.setAngles(entity, move, swing, ticks, headYaw, headPitch, scale); - wings.setRotationAndAngles(rainboom, entity.getUuid(), move, swing, 0, ticks); + wings.setRotationAndAngles(attributes.isGoingFast, entity.getUuid(), move, swing, 0, ticks); } @Override - protected void renderBody(T entity, float move, float swing, float ticks, float headYaw, float headPitch, float scale) { - super.renderBody(entity, move, swing, ticks, headYaw, headPitch, scale); - wings.renderPart(scale, entity.getUuid()); + protected void renderBody(float scale) { + super.renderBody(scale); + wings.renderPart(scale, attributes.interpolatorId); } } diff --git a/src/main/java/com/minelittlepony/client/model/races/ModelUnicorn.java b/src/main/java/com/minelittlepony/client/model/races/ModelUnicorn.java index e39c5474..5e80b232 100644 --- a/src/main/java/com/minelittlepony/client/model/races/ModelUnicorn.java +++ b/src/main/java/com/minelittlepony/client/model/races/ModelUnicorn.java @@ -75,7 +75,7 @@ public class ModelUnicorn extends ModelEarthPony impl AbsoluteHand mainSide = getPreferedHand(entity); if (canCast() && getArmPoseForSide(mainSide) != ArmPose.EMPTY) { - if (getSwingAmount() > -9990 && !isSleeping()) { + if (getSwingAmount() > -9990 && !attributes.isSleeping) { swingArm(getUnicornArmForSide(mainSide)); } } else { @@ -83,9 +83,15 @@ public class ModelUnicorn extends ModelEarthPony impl } } + public ArmPose getArmPoseForSide(AbsoluteHand side) { + return side == AbsoluteHand.RIGHT ? rightArmPose : leftArmPose; + } + @Override - protected void swingArms(float ticks) { - if (isSleeping()) return; + protected void animateBreathing(float ticks) { + if (attributes.isSleeping) { + return; + } if (canCast()) { float cos = MathHelper.cos(ticks * 0.09F) * 0.05F + 0.05F; @@ -101,7 +107,7 @@ public class ModelUnicorn extends ModelEarthPony impl unicornArmLeft.pitch += sin; } } else { - super.swingArms(ticks); + super.animateBreathing(ticks); } } @@ -123,12 +129,12 @@ public class ModelUnicorn extends ModelEarthPony impl } @Override - protected void renderHead(T entity, float move, float swing, float ticks, float headYaw, float headPitch, float scale) { - super.renderHead(entity, move, swing, ticks, headYaw, headPitch, scale); + protected void renderHead(float scale) { + super.renderHead(scale); if (canCast()) { head.applyTransform(scale); - horn.renderPart(scale, entity.getUuid()); + horn.renderPart(scale, attributes.interpolatorId); if (isCasting()) { horn.renderMagic(getMagicColor(), scale); } @@ -141,12 +147,12 @@ public class ModelUnicorn extends ModelEarthPony impl unicornArmLeft = new PonyRenderer(this, 40, 32).size(64, 64); unicornArmRight = new PonyRenderer(this, 40, 32).size(64, 64); - int armLength = getArmLength(); - int armWidth = getArmWidth(); - int armDepth = getArmDepth(); + int armLength = attributes.armLength; + int armWidth = attributes.armWidth; + int armDepth = attributes.armDepth; - float rarmX = getLegRotationX(); - float rarmY = getArmRotationY(); + float rarmX = attributes.armRotationX; + float rarmY = attributes.armRotationY; float armX = THIRDP_ARM_CENTRE_X; float armY = THIRDP_ARM_CENTRE_Y; diff --git a/src/main/java/com/minelittlepony/client/render/IPonyRender.java b/src/main/java/com/minelittlepony/client/render/IPonyRender.java index d1a97658..8f021537 100644 --- a/src/main/java/com/minelittlepony/client/render/IPonyRender.java +++ b/src/main/java/com/minelittlepony/client/render/IPonyRender.java @@ -1,8 +1,8 @@ package com.minelittlepony.client.render; +import com.minelittlepony.client.model.IPonyModel; import com.minelittlepony.client.model.ModelWrapper; import com.minelittlepony.model.BodyPart; -import com.minelittlepony.model.IPonyModel; import com.minelittlepony.model.PonyModelConstants; import com.minelittlepony.pony.IPony; import com.minelittlepony.util.math.MathUtil; diff --git a/src/main/java/com/minelittlepony/client/render/RenderPony.java b/src/main/java/com/minelittlepony/client/render/RenderPony.java index 98f3a751..3855e398 100644 --- a/src/main/java/com/minelittlepony/client/render/RenderPony.java +++ b/src/main/java/com/minelittlepony/client/render/RenderPony.java @@ -1,9 +1,9 @@ package com.minelittlepony.client.render; import com.minelittlepony.client.PonyRenderManager; +import com.minelittlepony.client.model.IPonyModel; import com.minelittlepony.client.model.ModelWrapper; import com.minelittlepony.client.transform.PonyPosture; -import com.minelittlepony.model.IPonyModel; import com.minelittlepony.pony.IPony; import com.minelittlepony.settings.PonySettings; import com.minelittlepony.util.math.MathUtil; @@ -20,8 +20,6 @@ public class RenderPony & IPony public ModelWrapper playerModel; - private M ponyModel; - private IPony pony; private final IPonyRender renderer; @@ -52,7 +50,7 @@ public class RenderPony & IPony public void preRenderCallback(T entity, float ticks) { updateModel(entity); - ponyModel.updateLivingState(entity, pony); + getModel().updateLivingState(entity, pony); float s = getScaleFactor(); GlStateManager.scalef(s, s, s); @@ -94,12 +92,12 @@ public class RenderPony & IPony @SuppressWarnings("unchecked") public void applyPostureTransform(T player, float yaw, float ticks) { - ((PonyPosture)getPosture(player)).apply(player, ponyModel, yaw, ticks, 1); + ((PonyPosture)getPosture(player)).apply(player, getModel(), yaw, ticks, 1); } @SuppressWarnings("unchecked") public void applyPostureRiding(T player, float yaw, float ticks) { - ((PonyPosture)getPosture(player)).apply(player, ponyModel, yaw, ticks, -1); + ((PonyPosture)getPosture(player)).apply(player, getModel(), yaw, ticks, -1); } @Nonnull @@ -112,11 +110,11 @@ public class RenderPony & IPony return PonyPosture.DEFAULT; } - if (getModel().isSwimming()) { + if (getModel().getAttributes().isSwimming) { return PonyPosture.SWIMMING; } - if (getModel().isGoingFast()) { + if (getModel().getAttributes().isGoingFast) { return PonyPosture.FLIGHT; } @@ -129,9 +127,8 @@ public class RenderPony & IPony public M setPonyModel(ModelWrapper model) { playerModel = model; - ponyModel = playerModel.getBody(); - return ponyModel; + return getModel(); } public void updateModel(T entity) { @@ -154,11 +151,11 @@ public class RenderPony & IPony public double getNamePlateYOffset(T entity, double initial) { - // We start by negating the height calculation done by mohjong. + // We start by negating the height calculation done by mahjong. float y = -(entity.getHeight() + 0.5F - (entity.isSneaking() ? 0.25F : 0)); // Then we add our own offsets. - y += ponyModel.getModelHeight() * getScaleFactor() + 0.25F; + y += getModel().getAttributes().visualHeight * getScaleFactor() + 0.25F; if (entity.isSneaking()) { y -= 0.25F; diff --git a/src/main/java/com/minelittlepony/client/render/entities/RenderPonyMob.java b/src/main/java/com/minelittlepony/client/render/entities/RenderPonyMob.java index f1543d29..468e163d 100644 --- a/src/main/java/com/minelittlepony/client/render/entities/RenderPonyMob.java +++ b/src/main/java/com/minelittlepony/client/render/entities/RenderPonyMob.java @@ -2,6 +2,7 @@ package com.minelittlepony.client.render.entities; import com.minelittlepony.MineLittlePony; import com.minelittlepony.client.model.ClientPonyModel; +import com.minelittlepony.client.model.IPonyModel; import com.minelittlepony.client.model.ModelWrapper; import com.minelittlepony.client.render.DebugBoundingBoxRenderer; import com.minelittlepony.client.render.IPonyRender; @@ -14,7 +15,6 @@ import com.minelittlepony.client.render.layer.LayerPonyCustomHead; import com.minelittlepony.client.render.layer.LayerPonyElytra; import com.minelittlepony.client.util.render.PonyRenderer; import com.minelittlepony.hdskins.HDSkins; -import com.minelittlepony.model.IPonyModel; import com.minelittlepony.model.IUnicorn; import com.minelittlepony.pony.IPony; import com.mojang.blaze3d.platform.GlStateManager; diff --git a/src/main/java/com/minelittlepony/client/render/layer/AbstractPonyLayer.java b/src/main/java/com/minelittlepony/client/render/layer/AbstractPonyLayer.java index f0b93d29..3cc1dfb6 100644 --- a/src/main/java/com/minelittlepony/client/render/layer/AbstractPonyLayer.java +++ b/src/main/java/com/minelittlepony/client/render/layer/AbstractPonyLayer.java @@ -1,7 +1,7 @@ package com.minelittlepony.client.render.layer; +import com.minelittlepony.client.model.IPonyModel; import com.minelittlepony.client.render.IPonyRender; -import com.minelittlepony.model.IPonyModel; import net.minecraft.client.render.entity.feature.FeatureRenderer; import net.minecraft.client.render.entity.feature.FeatureRendererContext; diff --git a/src/main/java/com/minelittlepony/client/render/layer/LayerDJPon3Head.java b/src/main/java/com/minelittlepony/client/render/layer/LayerDJPon3Head.java index ba25351d..b605e493 100644 --- a/src/main/java/com/minelittlepony/client/render/layer/LayerDJPon3Head.java +++ b/src/main/java/com/minelittlepony/client/render/layer/LayerDJPon3Head.java @@ -3,10 +3,10 @@ package com.minelittlepony.client.render.layer; import net.minecraft.client.network.AbstractClientPlayerEntity; import net.minecraft.client.render.entity.model.EntityModel; +import com.minelittlepony.client.model.IPonyModel; import com.minelittlepony.client.model.components.ModelDeadMau5Ears; import com.minelittlepony.client.render.IPonyRender; import com.minelittlepony.model.BodyPart; -import com.minelittlepony.model.IPonyModel; import com.mojang.blaze3d.platform.GlStateManager; public class LayerDJPon3Head & IPonyModel> extends AbstractPonyLayer { diff --git a/src/main/java/com/minelittlepony/client/render/layer/LayerEyeGlow.java b/src/main/java/com/minelittlepony/client/render/layer/LayerEyeGlow.java index dd4adf94..6d72d36d 100644 --- a/src/main/java/com/minelittlepony/client/render/layer/LayerEyeGlow.java +++ b/src/main/java/com/minelittlepony/client/render/layer/LayerEyeGlow.java @@ -5,8 +5,8 @@ import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.entity.LivingEntity; import net.minecraft.util.Identifier; +import com.minelittlepony.client.model.IPonyModel; import com.minelittlepony.client.render.IPonyRender; -import com.minelittlepony.model.IPonyModel; import com.mojang.blaze3d.platform.GLX; import static com.mojang.blaze3d.platform.GlStateManager.*; diff --git a/src/main/java/com/minelittlepony/client/render/layer/LayerGear.java b/src/main/java/com/minelittlepony/client/render/layer/LayerGear.java index 64413039..5a973cbb 100644 --- a/src/main/java/com/minelittlepony/client/render/layer/LayerGear.java +++ b/src/main/java/com/minelittlepony/client/render/layer/LayerGear.java @@ -7,6 +7,7 @@ import net.minecraft.util.Identifier; import org.lwjgl.opengl.GL11; import com.google.common.collect.Lists; +import com.minelittlepony.client.model.IPonyModel; import com.minelittlepony.client.model.gear.ChristmasHat; import com.minelittlepony.client.model.gear.Muffin; import com.minelittlepony.client.model.gear.SaddleBags; @@ -14,7 +15,6 @@ import com.minelittlepony.client.model.gear.Stetson; import com.minelittlepony.client.model.gear.WitchHat; import com.minelittlepony.client.render.IPonyRender; import com.minelittlepony.model.BodyPart; -import com.minelittlepony.model.IPonyModel; import com.minelittlepony.model.gear.IGear; import com.minelittlepony.model.gear.IStackable; import com.mojang.blaze3d.platform.GlStateManager; @@ -83,7 +83,7 @@ public class LayerGear & IPonyM getContext().bindTexture(texture); gear.setLivingAnimations(model, entity); - gear.setRotationAndAngles(model.isGoingFast(), entity.getUuid(), move, swing, model.getWobbleAmount(), ticks); + gear.setRotationAndAngles(model.getAttributes().isGoingFast, entity.getUuid(), move, swing, model.getWobbleAmount(), ticks); gear.renderPart(scale, entity.getUuid()); GL11.glPopAttrib(); diff --git a/src/main/java/com/minelittlepony/client/render/layer/LayerHeldPonyItem.java b/src/main/java/com/minelittlepony/client/render/layer/LayerHeldPonyItem.java index a284db40..7cf43d0d 100644 --- a/src/main/java/com/minelittlepony/client/render/layer/LayerHeldPonyItem.java +++ b/src/main/java/com/minelittlepony/client/render/layer/LayerHeldPonyItem.java @@ -1,8 +1,8 @@ package com.minelittlepony.client.render.layer; +import com.minelittlepony.client.model.IPonyModel; import com.minelittlepony.client.render.IPonyRender; import com.minelittlepony.model.BodyPart; -import com.minelittlepony.model.IPonyModel; import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.entity.model.EntityModel; diff --git a/src/main/java/com/minelittlepony/client/render/layer/LayerHeldPonyItemMagical.java b/src/main/java/com/minelittlepony/client/render/layer/LayerHeldPonyItemMagical.java index 859886bb..bb3c5fe1 100644 --- a/src/main/java/com/minelittlepony/client/render/layer/LayerHeldPonyItemMagical.java +++ b/src/main/java/com/minelittlepony/client/render/layer/LayerHeldPonyItemMagical.java @@ -1,9 +1,9 @@ package com.minelittlepony.client.render.layer; import com.minelittlepony.client.PonyRenderManager; +import com.minelittlepony.client.model.IPonyModel; import com.minelittlepony.client.render.IPonyRender; import com.minelittlepony.client.util.render.PonyRenderer; -import com.minelittlepony.model.IPonyModel; import com.minelittlepony.model.IUnicorn; import com.mojang.blaze3d.platform.GlStateManager; diff --git a/src/main/java/com/minelittlepony/client/render/layer/LayerPonyArmor.java b/src/main/java/com/minelittlepony/client/render/layer/LayerPonyArmor.java index 46abe216..ce76086c 100644 --- a/src/main/java/com/minelittlepony/client/render/layer/LayerPonyArmor.java +++ b/src/main/java/com/minelittlepony/client/render/layer/LayerPonyArmor.java @@ -1,11 +1,11 @@ package com.minelittlepony.client.render.layer; import com.minelittlepony.client.ForgeProxy; +import com.minelittlepony.client.model.IPonyModel; import com.minelittlepony.client.model.ModelWrapper; import com.minelittlepony.client.model.armour.DefaultArmourTextureResolver; import com.minelittlepony.client.render.IPonyRender; import com.minelittlepony.client.util.render.Color; -import com.minelittlepony.model.IPonyModel; import com.minelittlepony.model.armour.ArmourLayer; import com.minelittlepony.model.armour.IArmour; import com.minelittlepony.model.armour.IArmourTextureResolver; diff --git a/src/main/java/com/minelittlepony/client/render/layer/LayerPonyCustomHead.java b/src/main/java/com/minelittlepony/client/render/layer/LayerPonyCustomHead.java index 737b24bf..699f7da3 100644 --- a/src/main/java/com/minelittlepony/client/render/layer/LayerPonyCustomHead.java +++ b/src/main/java/com/minelittlepony/client/render/layer/LayerPonyCustomHead.java @@ -1,10 +1,10 @@ package com.minelittlepony.client.render.layer; import com.minelittlepony.client.model.AbstractPonyModel; +import com.minelittlepony.client.model.IPonyModel; import com.minelittlepony.client.render.IPonyRender; import com.minelittlepony.client.render.tileentities.skull.PonySkullRenderer; import com.minelittlepony.model.BodyPart; -import com.minelittlepony.model.IPonyModel; import com.mojang.authlib.GameProfile; import net.minecraft.block.AbstractSkullBlock; diff --git a/src/main/java/com/minelittlepony/client/render/layer/LayerPonyElytra.java b/src/main/java/com/minelittlepony/client/render/layer/LayerPonyElytra.java index 55fdb374..a8cd84be 100644 --- a/src/main/java/com/minelittlepony/client/render/layer/LayerPonyElytra.java +++ b/src/main/java/com/minelittlepony/client/render/layer/LayerPonyElytra.java @@ -1,9 +1,9 @@ package com.minelittlepony.client.render.layer; +import com.minelittlepony.client.model.IPonyModel; import com.minelittlepony.client.model.components.PonyElytra; import com.minelittlepony.client.render.IPonyRender; import com.minelittlepony.model.BodyPart; -import com.minelittlepony.model.IPonyModel; import com.mojang.blaze3d.platform.GlStateManager; import net.minecraft.client.network.AbstractClientPlayerEntity; diff --git a/src/main/java/com/minelittlepony/client/transform/PonyTransformation.java b/src/main/java/com/minelittlepony/client/transform/PonyTransformation.java index c9c0bfbc..a64f7041 100644 --- a/src/main/java/com/minelittlepony/client/transform/PonyTransformation.java +++ b/src/main/java/com/minelittlepony/client/transform/PonyTransformation.java @@ -15,16 +15,16 @@ public enum PonyTransformation { NORMAL(Size.NORMAL, 0, 3F, 0.75F) { @Override public void transform(IModel model, BodyPart part) { - if (model.isCrouching()) translate(0, -0.2F, 0); - if (model.isSleeping()) translate(0, -0.61F, 0.1F); + if (model.getAttributes().isCrouching) translate(0, -0.2F, 0); + if (model.getAttributes().isSleeping) translate(0, -0.61F, 0.1F); if (model.isRiding()) translate(0, -0.2F, -0.2F); switch (part) { case NECK: - if (model.isCrouching()) translate(-0.03F, 0.03F, 0.1F); + if (model.getAttributes().isCrouching) translate(-0.03F, 0.03F, 0.1F); break; case HEAD: - if (model.isCrouching()) translate(0, 0.1F, 0); + if (model.getAttributes().isCrouching) translate(0, 0.1F, 0); break; case BACK: translateVec(riderOffset); @@ -36,19 +36,19 @@ public enum PonyTransformation { LANKY(Size.LANKY, 0, 2.6F, 0.75F) { @Override public void transform(IModel model, BodyPart part) { - if (model.isCrouching()) translate(0, -0.15F, 0); - if (model.isSleeping()) translate(0, -0.6F, 0.15F); + if (model.getAttributes().isCrouching) translate(0, -0.15F, 0); + if (model.getAttributes().isSleeping) translate(0, -0.6F, 0.15F); if (model.isRiding()) translate(0, 0, -0.2F); switch (part) { case NECK: translate(0, -0.15F, -0.07F); - if (model.isCrouching()) translate(-0.03F, 0.16F, 0.07F); + if (model.getAttributes().isCrouching) translate(-0.03F, 0.16F, 0.07F); break; case HEAD: translate(0, -0.17F, -0.04F); - if (model.isSleeping()) translate(0, 0, -0.1F); - if (model.isCrouching()) translate(0, 0.15F, 0); + if (model.getAttributes().isSleeping) translate(0, 0, -0.1F); + if (model.getAttributes().isCrouching) translate(0, 0.15F, 0); break; case BODY: translate(0, -0.2F, -0.04F); @@ -70,19 +70,19 @@ public enum PonyTransformation { BULKY(Size.BULKY, 0, 2.3F, 0.75F) { @Override public void transform(IModel model, BodyPart part) { - if (model.isCrouching()) translate(0, -0.15F, 0); - if (model.isSleeping()) translate(0, -0.6F, 0.25F); + if (model.getAttributes().isCrouching) translate(0, -0.15F, 0); + if (model.getAttributes().isSleeping) translate(0, -0.6F, 0.25F); if (model.isRiding()) translate(0, 0, -0.2F); switch (part) { case NECK: translate(0, -0.15F, -0.07F); - if (model.isCrouching()) translate(-0.03F, 0.16F, 0.07F); + if (model.getAttributes().isCrouching) translate(-0.03F, 0.16F, 0.07F); break; case HEAD: translate(0, -0.17F, -0.04F); - if (model.isSleeping()) translate(0, 0, -0.1F); - if (model.isCrouching()) translate(0, 0.15F, 0); + if (model.getAttributes().isSleeping) translate(0, 0, -0.1F); + if (model.getAttributes().isCrouching) translate(0, 0.15F, 0); break; case BODY: translate(0, -0.2F, -0.04F); @@ -104,8 +104,8 @@ public enum PonyTransformation { FOAL(Size.FOAL, 0, 3.8F, 0.75F) { @Override public void transform(IModel model, BodyPart part) { - if (model.isCrouching()) translate(0, -0.3F, 0); - if (model.isSleeping()) translate(0, -0.65F, -0.3F); + if (model.getAttributes().isCrouching) translate(0, -0.3F, 0); + if (model.getAttributes().isSleeping) translate(0, -0.65F, -0.3F); if (model.isRiding()) translate(0, -0.6F, -0.2F); translate(0, 0.2F, 0); @@ -114,7 +114,7 @@ public enum PonyTransformation { case NECK: translate(0, 0, 0.04F); scale(1.3F, 1.3F, 1.3F); - if (model.isCrouching()) translate(0, -0.01F, 0.15F); + if (model.getAttributes().isCrouching) translate(0, -0.01F, 0.15F); break; case HEAD: scale(1.3F, 1.3F, 1.3F); @@ -133,19 +133,19 @@ public enum PonyTransformation { TALL(Size.TALL, 0, 2.2F, 0.75F) { @Override public void transform(IModel model, BodyPart part) { - if (model.isCrouching()) translate(0, -0.15F, 0); - if (model.isSleeping()) translate(0, -0.5F, 0.35F); + if (model.getAttributes().isCrouching) translate(0, -0.15F, 0); + if (model.getAttributes().isSleeping) translate(0, -0.5F, 0.35F); if (model.isRiding()) translate(0, 0.1F, -0.2F); switch (part) { case NECK: translate(0, -0.09F, 0); scale(1, 1.1F, 1); - if (model.isCrouching()) translate(-0.02F, -0.02F, 0.1F); + if (model.getAttributes().isCrouching) translate(-0.02F, -0.02F, 0.1F); break; case HEAD: translate(0.01F, -0.15F, 0); - if (model.isCrouching()) translate(0, 0.04F, 0); + if (model.getAttributes().isCrouching) translate(0, 0.04F, 0); break; case BODY: case TAIL: @@ -154,7 +154,7 @@ public enum PonyTransformation { case LEGS: translate(0, -0.27F, 0.03F); scale(1, 1.18F, 1); - if (model.isGoingFast()) translate(0, 0.05F, 0); + if (model.getAttributes().isGoingFast) translate(0, 0.05F, 0); break; case BACK: riderOffset = new Vec3d(0, 2.2F, 0.75F); @@ -166,19 +166,19 @@ public enum PonyTransformation { YEARLING(Size.YEARLING, 0, 3.8F, 0.75F) { @Override public void transform(IModel model, BodyPart part) { - if (model.isCrouching()) translate(0, -0.15F, 0); - if (model.isSleeping()) translate(0, -0.4F, -0.3F); + if (model.getAttributes().isCrouching) translate(0, -0.15F, 0); + if (model.getAttributes().isSleeping) translate(0, -0.4F, -0.3F); if (model.isRiding()) translate(0, -0.4F, -0.2F); switch (part) { case NECK: translate(0, -0.09F, -0.01F); scale(1, 1.1F, 1); - if (model.isCrouching()) translate(-0.02F, -0.02F, 0.1F); + if (model.getAttributes().isCrouching) translate(-0.02F, -0.02F, 0.1F); break; case HEAD: translate(0, -0.15F, 0.01F); - if (model.isCrouching()) translate(0, 0.04F, 0); + if (model.getAttributes().isCrouching) translate(0, 0.04F, 0); scale(1.15F, 1.15F, 1.15F); break; case BODY: @@ -188,7 +188,7 @@ public enum PonyTransformation { case LEGS: translate(0, -0.265F, 0.03F); scale(1, 1.18F, 1); - if (model.isGoingFast()) translate(0, 0.05F, 0); + if (model.getAttributes().isGoingFast) translate(0, 0.05F, 0); break; case BACK: translateVec(riderOffset); diff --git a/src/main/java/com/minelittlepony/client/transform/PostureFalling.java b/src/main/java/com/minelittlepony/client/transform/PostureFalling.java index 7c54a76a..f8cf582f 100644 --- a/src/main/java/com/minelittlepony/client/transform/PostureFalling.java +++ b/src/main/java/com/minelittlepony/client/transform/PostureFalling.java @@ -7,6 +7,6 @@ import com.minelittlepony.model.IModel; public class PostureFalling implements PonyPosture { @Override public void transform(IModel model, LivingEntity entity, double motionX, double motionY, double motionZ, float yaw, float ticks) { - model.setPitch(0); + model.getAttributes().motionPitch = 0; } } diff --git a/src/main/java/com/minelittlepony/client/transform/PostureFlight.java b/src/main/java/com/minelittlepony/client/transform/PostureFlight.java index 84f9a19b..9d5aab5b 100644 --- a/src/main/java/com/minelittlepony/client/transform/PostureFlight.java +++ b/src/main/java/com/minelittlepony/client/transform/PostureFlight.java @@ -15,9 +15,9 @@ public class PostureFlight extends MotionCompositor implements PonyPosture createArmour(); + /** + * Gets the transitive properties of this model. + */ + ModelAttributes getAttributes(); + /** * Gets the skin metadata associated with this model. */ @@ -46,42 +47,18 @@ public interface IModel extends ModelWithArms { */ void apply(IPonyData meta); - /** - * Returns true if this model is on the ground and crouching. - */ - boolean isCrouching(); - /** * Returns true if the model is flying. */ - boolean isFlying(); - - /** - * Returns true if the model is elytra flying. Elytra flying is different - * from regular flying in that there are actual "wings" involved. - */ - boolean isElytraFlying(); - - /** - * Returns true if this model is lying on a bed or bed-like object. - */ - boolean isSleeping(); - - /** - * Returns true if this model is wimming underwater. - */ - boolean isSwimming(); + default boolean isFlying() { + return getAttributes().isFlying && canFly(); + } /** * Returns true if this model is riding a boat, horse, or other animals. */ boolean isRiding(); - /** - * Returns true if we're flying really fast. - */ - boolean isGoingFast(); - /** * Returns true if this model is being applied to a race that has wings. */ @@ -92,7 +69,9 @@ public interface IModel extends ModelWithArms { /** * Returns true if the current model is a child or a child-like foal. */ - boolean isChild(); + default boolean isChild() { + return getSize() == Size.FOAL; + } /** * Gets the current leg swing amount. @@ -100,20 +79,22 @@ public interface IModel extends ModelWithArms { float getSwingAmount(); /** - * Gets the step woddle used for various hair bits and animations. + * Gets the step wobble used for various hair bits and animations. */ - float getWobbleAmount(); + default float getWobbleAmount() { + + if (getSwingAmount() <= 0) { + return 0; + } + + return MathHelper.sin(MathHelper.sqrt(getSwingAmount()) * PonyModelConstants.PI * 2) * 0.04F; + } /** * Gets the y-offset applied to entities riding this one. */ float getRiderYOffset(); - /** - * Gets the actual, visible height of this model when rendered. - */ - float getModelHeight(); - /** * Tests if this model is wearing the given piece of gear. */ diff --git a/src/main/java/com/minelittlepony/model/IPegasus.java b/src/main/java/com/minelittlepony/model/IPegasus.java index 2329662f..96423050 100644 --- a/src/main/java/com/minelittlepony/model/IPegasus.java +++ b/src/main/java/com/minelittlepony/model/IPegasus.java @@ -11,7 +11,7 @@ public interface IPegasus extends IModel { * Returns true if the wings are spread. */ default boolean wingsAreOpen() { - return (isSwimming() || isFlying() || isCrouching()) && !isElytraFlying(); + return (getAttributes().isSwimming || isFlying() || getAttributes().isCrouching) && !getAttributes().isGliding; } /** @@ -20,7 +20,7 @@ public interface IPegasus extends IModel { * @param ticks Partial render ticks */ default float getWingRotationFactor(float ticks) { - if (isSwimming()) { + if (getAttributes().isSwimming) { return (MathHelper.sin(ticks * 0.136f) / 2) + ROTATE_270; } if (isFlying()) { diff --git a/src/main/java/com/minelittlepony/model/ModelAttributes.java b/src/main/java/com/minelittlepony/model/ModelAttributes.java new file mode 100644 index 00000000..efea2b36 --- /dev/null +++ b/src/main/java/com/minelittlepony/model/ModelAttributes.java @@ -0,0 +1,98 @@ +package com.minelittlepony.model; + +import com.minelittlepony.pony.IPony; +import com.minelittlepony.util.math.MathUtil; +import net.minecraft.entity.LivingEntity; +import net.minecraft.util.math.Vec3d; + +import java.util.UUID; + +public class ModelAttributes { + + /** + * True if the model is sleeping in a bed. + */ + public boolean isSleeping; + /** + * True if the model is flying like a pegasus. + */ + public boolean isFlying; + /** + * True if the model is elytra flying. Elytra flying is different + * from regular flying in that there are actual "wings" involved. + */ + public boolean isGliding; + /** + * True if the model is swimming under water. + */ + public boolean isSwimming; + /** + * True if the pony is crouching. + */ + public boolean isCrouching; + /** + * True if the model is sitting as in boats. + */ + public boolean isSitting; + /** + * Flag indicating that this model is performing a rainboom (flight). + */ + public boolean isGoingFast; + /** + * True if the model is wearing any unconventional headgear (ie. a Pumpkin) + */ + public boolean hasHeadGear; + + /** + * Vertical pitch whilst flying. + */ + public float motionPitch; + /** + * Lerp amount controlling leg swing whilst performing a rainboom. + */ + public double motionLerp; + + /** + * Unique id of the interpolator used for this model. + * Usually the UUID of the entity being rendered. + */ + public UUID interpolatorId; + + public int armWidth = 4; + public int armDepth = 4; + + public int armLength = 12; + + public float armRotationX = 3F; + public float armRotationY = 8F; + + /** + * The actual, visible height of this model when rendered. + * Used when drawing nameplates. + */ + public float visualHeight = 2F; + + /** + * Checks flying and speed conditions and sets rainboom to true if we're a species with wings and is going faaast. + */ + public void checkRainboom(T entity, float swing, boolean hasWings) { + Vec3d motion = entity.getVelocity(); + double zMotion = Math.sqrt(motion.x * motion.x + motion.z * motion.z); + + isGoingFast = (isFlying && hasWings) || isGliding; + isGoingFast &= zMotion > 0.4F; + + motionLerp = MathUtil.clampLimit(zMotion * 30, 1); + } + + public void updateLivingState(T entity, IPony pony) { + isCrouching = pony.isCrouching(entity); + isSleeping = entity.isSleeping(); + isFlying = pony.isFlying(entity); + isGliding = entity.isFallFlying(); + isSwimming = pony.isSwimming(entity); + hasHeadGear = pony.isWearingHeadgear(entity); + isSitting = pony.isRidingInteractive(entity); + interpolatorId = entity.getUuid(); + } +} diff --git a/src/main/java/com/minelittlepony/model/gear/IGear.java b/src/main/java/com/minelittlepony/model/gear/IGear.java index fe29e3dd..685fb23d 100644 --- a/src/main/java/com/minelittlepony/model/gear/IGear.java +++ b/src/main/java/com/minelittlepony/model/gear/IGear.java @@ -4,8 +4,8 @@ import net.minecraft.entity.Entity; import net.minecraft.util.Identifier; import com.minelittlepony.model.BodyPart; +import com.minelittlepony.model.IModel; import com.minelittlepony.model.IPart; -import com.minelittlepony.model.IPonyModel; import javax.annotation.Nullable; @@ -19,7 +19,7 @@ public interface IGear extends IPart { * * @return True to render this wearable */ - boolean canRender(IPonyModel model, Entity entity); + boolean canRender(IModel model, Entity entity); /** * Gets the body location that this wearable appears on. @@ -36,7 +36,7 @@ public interface IGear extends IPart { /** * Orients this wearable. */ - default void setLivingAnimations(IPonyModel model, Entity entity) { + default void setLivingAnimations(IModel model, Entity entity) { }