From f72fdaaebe2049b3c15cb57aedbc60fd05dfb21b Mon Sep 17 00:00:00 2001 From: Sollace Date: Thu, 21 Nov 2024 23:26:35 +0000 Subject: [PATCH] WIP Updating to 1.21.3 --- .../api/model/HornedPonyModel.java | 5 ++ .../api/model/ModelAttributes.java | 6 ++ .../minelittlepony/api/model/PonyModel.java | 4 + .../minelittlepony/api/model/SubModel.java | 17 ++-- .../api/model/WingedPonyModel.java | 14 +--- .../minelittlepony/api/pony/meta/Mats.java | 5 +- .../api/pony/meta/TriggerPixel.java | 4 +- .../client/model/AbstractPonyModel.java | 78 ++++++++----------- .../client/model/ClientPonyModel.java | 3 +- .../model/entity/EnderStallionModel.java | 11 --- .../client/model/entity/IllagerPonyModel.java | 2 +- .../client/model/entity/PiglinPonyModel.java | 10 +-- .../client/model/entity/ZomponyModel.java | 4 +- .../model/entity/race/ChangelingModel.java | 4 +- .../model/entity/race/SeaponyModel.java | 4 +- .../model/entity/race/UnicornModel.java | 16 +--- .../client/model/gear/SaddleBags.java | 2 +- .../client/model/part/LionTail.java | 12 +-- .../client/model/part/PonyEars.java | 12 +-- .../client/model/part/PonyTail.java | 10 +-- .../client/model/part/PonyWings.java | 21 +++-- .../client/model/part/SeaponyTail.java | 4 +- .../render/DebugBoundingBoxRenderer.java | 2 +- .../client/render/EquineRenderManager.java | 2 +- .../blockentity/skull/PonySkullRenderer.java | 10 +-- .../render/entity/AbstractPonyRenderer.java | 13 +++- .../render/entity/EnderStallionRenderer.java | 7 +- .../render/entity/PlayerPonyRenderer.java | 9 ++- .../render/entity/PonyStandRenderer.java | 76 ++++++++++++++---- .../client/render/entity/SeaponyRenderer.java | 73 +---------------- .../render/entity/feature/ElytraFeature.java | 6 +- .../render/entity/feature/GearFeature.java | 2 +- .../render/entity/feature/SkullFeature.java | 37 +++++---- .../entity/feature/SwappableFeature.java | 23 ++++-- .../render/entity/state/PonyRenderState.java | 44 +++-------- src/main/resources/minelp.aw | 5 +- 36 files changed, 262 insertions(+), 295 deletions(-) diff --git a/src/main/java/com/minelittlepony/api/model/HornedPonyModel.java b/src/main/java/com/minelittlepony/api/model/HornedPonyModel.java index b5833559..dd351c3b 100644 --- a/src/main/java/com/minelittlepony/api/model/HornedPonyModel.java +++ b/src/main/java/com/minelittlepony/api/model/HornedPonyModel.java @@ -12,4 +12,9 @@ public interface HornedPonyModel { - /** - * Sets the model's various rotation angles. - */ - default void setPartAngles(T state, float limbAngle, float limbSpeed, float bodySwing, float animationProgress) { - - } - +public interface SubModel { /** * Renders this model component. */ void renderPart(MatrixStack stack, VertexConsumer vertices, int overlay, int light, int color); + /** + * Sets the model's various rotation angles. + */ + default void setPartAngles(T state, float wobbleAmount) { + } + /** * Sets whether this part should be rendered. */ diff --git a/src/main/java/com/minelittlepony/api/model/WingedPonyModel.java b/src/main/java/com/minelittlepony/api/model/WingedPonyModel.java index 4d0fd3d9..055ad9a3 100644 --- a/src/main/java/com/minelittlepony/api/model/WingedPonyModel.java +++ b/src/main/java/com/minelittlepony/api/model/WingedPonyModel.java @@ -2,8 +2,6 @@ package com.minelittlepony.api.model; import net.minecraft.client.render.entity.state.BipedEntityRenderState; -import com.minelittlepony.api.config.PonyConfig; -import com.minelittlepony.api.pony.meta.Wearable; import com.minelittlepony.util.MathUtil; public interface WingedPonyModel extends PonyModel { @@ -20,14 +18,7 @@ public interface WingedPonyModel { static TriggerPixel ofColor(int x, int y) { MAX_COORDS.x = Math.max(MAX_COORDS.x, x); MAX_COORDS.y = Math.max(MAX_COORDS.y, y); - return image -> Color.abgrToArgb(image.getColor(x, y)); + return image -> image.getColor(x, y); } static & TValue> TriggerPixel> ofFlags(int x, int y, Flags def, T[] options) { diff --git a/src/main/java/com/minelittlepony/client/model/AbstractPonyModel.java b/src/main/java/com/minelittlepony/client/model/AbstractPonyModel.java index 99f606d1..b42b0449 100644 --- a/src/main/java/com/minelittlepony/client/model/AbstractPonyModel.java +++ b/src/main/java/com/minelittlepony/client/model/AbstractPonyModel.java @@ -127,23 +127,18 @@ public abstract class AbstractPonyModel extends Clien } protected void setModelAngles(T entity) { - setModelAngles((T)entity, entity.limbAmplitudeInverse, entity.limbAmplitudeMultiplier, entity.age, entity.yawDegrees, entity.pitch); - } - - @Deprecated - protected final void setModelAngles(T entity, float limbAngle, float limbSpeed, float animationProgress, float headYaw, float headPitch) { float pitch = entity.attributes.motionPitch * MathHelper.RADIANS_PER_DEGREE; head.setAngles( - MathHelper.clamp(entity.attributes.isSleeping ? 0.1f : headPitch / 57.29578F, -1.25f - pitch, 0.5f - pitch), - entity.attributes.isSleeping ? (Math.signum(MathHelper.wrapDegrees(headYaw)) * 1.3F) : headYaw * MathHelper.RADIANS_PER_DEGREE, + MathHelper.clamp(entity.attributes.isSleeping ? 0.1f : entity.pitch / 57.29578F, -1.25f - pitch, 0.5f - pitch), + entity.attributes.isSleeping ? (Math.signum(MathHelper.wrapDegrees(entity.yawDegrees)) * 1.3F) : entity.yawDegrees * MathHelper.RADIANS_PER_DEGREE, 0 ); - float wobbleAmount = entity.getWobbleAmount(); + float wobbleAmount = entity.wobbleAmount * getWobbleAmplitude(entity); body.yaw = wobbleAmount; neck.yaw = wobbleAmount; - rotateLegs(entity, limbAngle, limbSpeed, animationProgress); + rotateLegs(entity); ArmPose left = getArmPose(entity, Arm.LEFT); ArmPose right = getArmPose(entity, Arm.RIGHT); @@ -153,7 +148,8 @@ public abstract class AbstractPonyModel extends Clien } if (!entity.attributes.isSwimming && !entity.attributes.isGoingFast) { - holdItem(entity, limbSpeed, left, right); + alignArmForAction(entity, getArm(Arm.LEFT), left, right, 1); + alignArmForAction(entity, getArm(Arm.RIGHT), right, left, -1); } swingItem(entity); @@ -165,7 +161,7 @@ public abstract class AbstractPonyModel extends Clien adjustBody(entity, 0, ORIGIN); if (!entity.attributes.isLyingDown) { - animateBreathing(entity, animationProgress, left, right); + animateBreathing(entity, left, right); } if (entity.attributes.isSwimmingRotated) { @@ -184,7 +180,7 @@ public abstract class AbstractPonyModel extends Clien head.pitch = 0.5F; } - parts.forEach(part -> part.setPartAngles(entity, limbAngle, limbSpeed, wobbleAmount, animationProgress)); + parts.forEach(part -> part.setPartAngles(entity, wobbleAmount)); } public void setHeadRotation(float animationProgress, float yaw, float pitch) { @@ -249,11 +245,11 @@ public abstract class AbstractPonyModel extends Clien * Takes the same parameters as {@link AbstractPonyModel.setRotationAndAngles} * */ - protected void rotateLegs(T state, float move, float swing, float ticks) { + protected void rotateLegs(T state) { if (state.attributes.isSwimming) { - rotateLegsSwimming(state, move, swing, ticks); + rotateLegsSwimming(state, state.limbAmplitudeInverse, state.limbAmplitudeMultiplier, state.age); } else { - rotateLegsOnGround(state, move, swing, ticks); + rotateLegsOnGround(state, state.limbAmplitudeInverse, state.limbAmplitudeMultiplier, state.age); } float sin = MathHelper.sin(body.yaw) * 5; @@ -327,14 +323,6 @@ public abstract class AbstractPonyModel extends Clien rightLeg.setAngles(MathHelper.lerp(rainboomLegLotation, MathHelper.cos(baseRotation + angle / 5) * scale, MathUtil.Angles._90_DEG * rainboomLegLotation), -yAngle, rightLeg.roll); } - /** - * Adjusts legs as if holding an item. Delegates to the correct arm/leg/limb as necessary. - */ - protected void holdItem(T state, float limbSpeed, ArmPose left, ArmPose right) { - alignArmForAction(state, getArm(Arm.LEFT), left, right, limbSpeed, 1); - alignArmForAction(state, getArm(Arm.RIGHT), right, left, limbSpeed, -1); - } - @Override public ModelPart getBodyPart(BodyPart part) { switch (part) { @@ -355,7 +343,7 @@ public abstract class AbstractPonyModel extends Clien * @param pose The post to align to * @param limbSpeed Degree to which each 'limb' swings. */ - protected void alignArmForAction(T state, ModelPart arm, ArmPose pose, ArmPose complement, float limbSpeed, float sigma) { + protected void alignArmForAction(T state, ModelPart arm, ArmPose pose, ArmPose complement, float sigma) { switch (pose) { case ITEM: arm.yaw = 0; @@ -365,13 +353,13 @@ public abstract class AbstractPonyModel extends Clien if (state.attributes.shouldLiftArm(pose, complement, sigma)) { float swag = 1; if (!state.attributes.isFlying && both) { - swag -= (float)Math.pow(limbSpeed, 2); + swag -= (float)Math.pow(state.limbAmplitudeMultiplier, 2); } float mult = 1 - swag/2; arm.pitch = arm.pitch * mult - (MathHelper.PI / 10) * swag; arm.roll = -sigma * (MathHelper.PI / 15); - arm.roll += 0.3F * -limbSpeed * sigma; + arm.roll += 0.3F * -state.limbAmplitudeMultiplier * sigma; if (state.attributes.isCrouching) { arm.pivotX -= sigma * 2; @@ -385,7 +373,7 @@ public abstract class AbstractPonyModel extends Clien case BLOCK: arm.pitch = (arm.pitch / 2 - 0.9424779F) - 0.3F; arm.yaw = sigma * MathHelper.PI / 9; - arm.roll += 0.3F * -limbSpeed * sigma; + arm.roll += 0.3F * -state.limbAmplitudeMultiplier * sigma; if (complement == pose) { arm.yaw -= sigma * MathHelper.PI / 18; } @@ -396,24 +384,24 @@ public abstract class AbstractPonyModel extends Clien } break; case BOW_AND_ARROW: - aimBow(state, arm, limbSpeed); + aimBow(state, arm); break; case CROSSBOW_HOLD: - aimBow(state, arm, limbSpeed); + aimBow(state, arm); arm.pitch = head.pitch - MathUtil.Angles._90_DEG; arm.yaw = head.yaw + 0.06F; break; case CROSSBOW_CHARGE: - aimBow(state, arm, limbSpeed); + aimBow(state, arm); arm.pitch = -0.8F; arm.yaw = head.yaw + 0.06F; - arm.roll += 0.3F * -limbSpeed * sigma; + arm.roll += 0.3F * -state.limbAmplitudeMultiplier * sigma; break; case THROW_SPEAR: arm.pitch = MathUtil.Angles._90_DEG * 2; - arm.roll += (0.3F * -limbSpeed + 0.6F) * sigma; + arm.roll += (0.3F * -state.limbAmplitudeMultiplier + 0.6F) * sigma; arm.pivotY ++; break; case SPYGLASS: @@ -427,10 +415,10 @@ public abstract class AbstractPonyModel extends Clien arm.pivotX -= 6 * sigma; arm.pivotZ -= 2; } - if (state.getSize() == SizePreset.TALL) { + if (state.size == SizePreset.TALL) { arm.pivotY += 1; } - if (state.getSize() == SizePreset.FOAL) { + if (state.size == SizePreset.FOAL) { arm.pivotY -= 2; } @@ -439,22 +427,22 @@ public abstract class AbstractPonyModel extends Clien arm.pitch = MathHelper.clamp(head.pitch, -0.55f, 1.2f) - 1.7835298f; arm.yaw = head.yaw - 0.1235988f * sigma; arm.pivotY += 3; - arm.roll += 0.3F * -limbSpeed * sigma; + arm.roll += 0.3F * -state.limbAmplitudeMultiplier * sigma; break; case BRUSH: arm.pitch = arm.pitch * 0.5f - 0.62831855f; arm.yaw = 0; - arm.roll += 0.3F * -limbSpeed * sigma; + arm.roll += 0.3F * -state.limbAmplitudeMultiplier * sigma; break; default: break; } } - protected void aimBow(T state, ModelPart arm, float limbSpeed) { - arm.pitch = MathUtil.Angles._270_DEG + head.pitch + (MathHelper.sin(limbSpeed * 0.067F) * 0.05F); + protected final void aimBow(T state, ModelPart arm) { + arm.pitch = MathUtil.Angles._270_DEG + head.pitch + (MathHelper.sin(state.limbAmplitudeMultiplier * 0.067F) * 0.05F); arm.yaw = head.yaw - 0.06F; - arm.roll = MathHelper.cos(limbSpeed * 0.09F) * 0.05F + 0.05F; + arm.roll = MathHelper.cos(state.limbAmplitudeMultiplier * 0.09F) * 0.05F + 0.05F; if (state.isInSneakingPose) { arm.pivotY += 4; @@ -466,7 +454,7 @@ public abstract class AbstractPonyModel extends Clien * * @param entity The entity we are being called for. */ - protected void swingItem(T state) { + protected final void swingItem(T state) { if (state.getSwingAmount() > 0 && !state.attributes.isLyingDown) { swingArm(state, getArm(state.preferredArm)); } @@ -477,7 +465,7 @@ public abstract class AbstractPonyModel extends Clien * * @param arm The arm to swing */ - protected void swingArm(T state, ModelPart arm) { + protected final void swingArm(T state, ModelPart arm) { float swing = 1 - (float)Math.pow(1 - state.getSwingAmount(), 3); float deltaX = MathHelper.sin(swing * MathHelper.PI); @@ -496,9 +484,9 @@ public abstract class AbstractPonyModel extends Clien * @param animationProgress Total whole and partial ticks since the entity's existence. * Used in animations together with {@code swing} and {@code move}. */ - protected void animateBreathing(T state, float animationProgress, ArmPose left, ArmPose right) { - float cos = MathHelper.cos(animationProgress * 0.09F) * 0.05F + 0.05F; - float sin = MathHelper.sin(animationProgress * 0.067F) * 0.05F; + protected void animateBreathing(T state, ArmPose left, ArmPose right) { + float cos = MathHelper.cos(state.age * 0.09F) * 0.05F + 0.05F; + float sin = MathHelper.sin(state.age * 0.067F) * 0.05F; if (state.attributes.shouldLiftArm(right, left, -1)) { ModelPart arm = getArm(Arm.RIGHT); @@ -596,6 +584,6 @@ public abstract class AbstractPonyModel extends Clien neck.hidden = !head.visible; } - PonyTransformation.forSize(state.getSize()).transform(state.attributes, part, stack); + PonyTransformation.forSize(state.size).transform(state.attributes, part, stack); } } diff --git a/src/main/java/com/minelittlepony/client/model/ClientPonyModel.java b/src/main/java/com/minelittlepony/client/model/ClientPonyModel.java index 8a374f12..f95cdb35 100644 --- a/src/main/java/com/minelittlepony/client/model/ClientPonyModel.java +++ b/src/main/java/com/minelittlepony/client/model/ClientPonyModel.java @@ -8,7 +8,6 @@ import org.jetbrains.annotations.Nullable; import com.minelittlepony.api.model.*; import com.minelittlepony.client.render.entity.state.PonyRenderState; -import com.minelittlepony.mson.api.MsonModel; /** * The raw pony model without any implementations. @@ -17,7 +16,7 @@ import com.minelittlepony.mson.api.MsonModel; * * Modders can extend this class to make their own pony models if they wish. */ -public abstract class ClientPonyModel extends PlayerEntityModel implements MsonModel, PonyModel { +public abstract class ClientPonyModel extends PlayerEntityModel implements PonyModel { @Nullable protected PosingCallback onSetModelAngles; diff --git a/src/main/java/com/minelittlepony/client/model/entity/EnderStallionModel.java b/src/main/java/com/minelittlepony/client/model/entity/EnderStallionModel.java index 60e0f164..ec336714 100644 --- a/src/main/java/com/minelittlepony/client/model/entity/EnderStallionModel.java +++ b/src/main/java/com/minelittlepony/client/model/entity/EnderStallionModel.java @@ -3,7 +3,6 @@ package com.minelittlepony.client.model.entity; import net.minecraft.client.model.ModelPart; import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.math.MathHelper; import com.minelittlepony.client.render.entity.EnderStallionRenderer; @@ -54,14 +53,4 @@ public class EnderStallionModel extends SkeleponyModel extends Alico arm.roll = mult * MathHelper.cos(state.age * 0.6662F) / 4; arm.yaw = mult * 1.1F; } else if (pose == IllagerEntity.State.BOW_AND_ARROW) { - aimBow(state, arm, state.age); + aimBow(state, arm); } } } diff --git a/src/main/java/com/minelittlepony/client/model/entity/PiglinPonyModel.java b/src/main/java/com/minelittlepony/client/model/entity/PiglinPonyModel.java index ba2e64b4..e9b9243c 100644 --- a/src/main/java/com/minelittlepony/client/model/entity/PiglinPonyModel.java +++ b/src/main/java/com/minelittlepony/client/model/entity/PiglinPonyModel.java @@ -56,8 +56,8 @@ public class PiglinPonyModel extends ZomponyModel { } @Override - protected void rotateLegs(PonyPiglinRenderer.State state, float move, float swing, float ticks) { - super.rotateLegs(state, move, swing, ticks); + protected void rotateLegs(PonyPiglinRenderer.State state) { + super.rotateLegs(state); if (state.activity == PiglinActivity.ADMIRING_ITEM) { leftArm.yaw = 0.5F; @@ -65,13 +65,13 @@ public class PiglinPonyModel extends ZomponyModel { leftArm.pivotY += 4; leftArm.pivotZ += 3; leftArm.pivotX += 2; - head.pitch = MathHelper.sin(ticks / 12) / 6 + 0.5F; + head.pitch = MathHelper.sin(state.age / 12) / 6 + 0.5F; head.yaw = 0; - head.roll = MathHelper.sin(ticks / 10) / 3F; + head.roll = MathHelper.sin(state.age / 10) / 3F; } else if (state.activity == PiglinActivity.DANCING) { - float speed = ticks / 60; + float speed = state.age / 60; head.pivotX = MathHelper.sin(speed * 10); head.pivotY = MathHelper.sin(speed * 40) + 0.4F; diff --git a/src/main/java/com/minelittlepony/client/model/entity/ZomponyModel.java b/src/main/java/com/minelittlepony/client/model/entity/ZomponyModel.java index 656e02b8..2d5bf007 100644 --- a/src/main/java/com/minelittlepony/client/model/entity/ZomponyModel.java +++ b/src/main/java/com/minelittlepony/client/model/entity/ZomponyModel.java @@ -12,8 +12,8 @@ public class ZomponyModel extends AlicornModel< } @Override - protected void rotateLegs(T state, float move, float swing, float ticks) { - super.rotateLegs(state, move, swing, ticks); + protected void rotateLegs(T state) { + super.rotateLegs(state); if (shouldLiftBothArms(state)) { MobPosingHelper.rotateUndeadArms(state, this, state.limbFrequency, state.age); } diff --git a/src/main/java/com/minelittlepony/client/model/entity/race/ChangelingModel.java b/src/main/java/com/minelittlepony/client/model/entity/race/ChangelingModel.java index 55cab18a..9b19bf7b 100644 --- a/src/main/java/com/minelittlepony/client/model/entity/race/ChangelingModel.java +++ b/src/main/java/com/minelittlepony/client/model/entity/race/ChangelingModel.java @@ -17,7 +17,7 @@ public class ChangelingModel extends AlicornModel } @Override - public float getWingRotationFactor(T state, float ticks) { - return state.attributes.isFlying ? MathHelper.sin(ticks * 3) + WINGS_HALF_SPREAD_ANGLE : WINGS_RAISED_ANGLE; + public float getWingRotationFactor(T state) { + return state.attributes.isFlying ? MathHelper.sin(state.age * 3) + WINGS_HALF_SPREAD_ANGLE : WINGS_RAISED_ANGLE; } } diff --git a/src/main/java/com/minelittlepony/client/model/entity/race/SeaponyModel.java b/src/main/java/com/minelittlepony/client/model/entity/race/SeaponyModel.java index ad6c948c..f2fcb837 100644 --- a/src/main/java/com/minelittlepony/client/model/entity/race/SeaponyModel.java +++ b/src/main/java/com/minelittlepony/client/model/entity/race/SeaponyModel.java @@ -71,8 +71,8 @@ public class SeaponyModel extends UnicornModel { } @Override - protected void rotateLegs(T state, float move, float swing, float ticks) { - super.rotateLegs(state, move, swing, ticks); + protected void rotateLegs(T state) { + super.rotateLegs(state); leftArm.pitch -= 1.4F; leftArm.yaw -= 0.3F; rightArm.pitch -= 1.4F; diff --git a/src/main/java/com/minelittlepony/client/model/entity/race/UnicornModel.java b/src/main/java/com/minelittlepony/client/model/entity/race/UnicornModel.java index 1ce01e2e..8178b211 100644 --- a/src/main/java/com/minelittlepony/client/model/entity/race/UnicornModel.java +++ b/src/main/java/com/minelittlepony/client/model/entity/race/UnicornModel.java @@ -2,7 +2,6 @@ package com.minelittlepony.client.model.entity.race; import com.minelittlepony.api.config.PonyConfig; import com.minelittlepony.api.model.*; -import com.minelittlepony.api.pony.meta.Size; import com.minelittlepony.api.pony.meta.SizePreset; import com.minelittlepony.client.model.part.UnicornHorn; import com.minelittlepony.client.render.entity.state.PonyRenderState; @@ -11,7 +10,6 @@ import com.minelittlepony.mson.util.RenderList; import net.minecraft.client.model.ModelPart; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.LivingEntity; import net.minecraft.item.consume.UseAction; import net.minecraft.registry.Registries; import net.minecraft.util.*; @@ -43,13 +41,8 @@ public class UnicornModel extends EarthPonyModel i } @Override - public float getWobbleAmount() { - return isCasting(currentState) ? 0 : super.getWobbleAmount(); - } - - @Override - protected void rotateLegs(T state, float move, float swing, float ticks) { - super.rotateLegs(state, move, swing, ticks); + protected void rotateLegs(T state) { + super.rotateLegs(state); unicornArmRight.setAngles(0, 0, 0); unicornArmRight.setPivot(-7, 12, -2); @@ -97,13 +90,12 @@ public class UnicornModel extends EarthPonyModel i } if (main == arm) { if (action == UseAction.SPYGLASS) { - Size size = state.getSize(); float x = 0.3F; float z = -0.4F; - if (size == SizePreset.TALL || size == SizePreset.YEARLING) { + if (state.size == SizePreset.TALL || state.size == SizePreset.YEARLING) { z += 0.05F; - } else if (size == SizePreset.FOAL) { + } else if (state.size == SizePreset.FOAL) { x -= 0.1F; z -= 0.1F; } 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 4aaabe83..cc16b46b 100644 --- a/src/main/java/com/minelittlepony/client/model/gear/SaddleBags.java +++ b/src/main/java/com/minelittlepony/client/model/gear/SaddleBags.java @@ -48,7 +48,7 @@ public class SaddleBags extends WearableGear { rightBag.pitch = bodySwing; if (model instanceof WingedPonyModel pegasus && state.getAttributes().isFlying) { - bodySwing = pegasus.getWingRotationFactor(state, ticks) - MathUtil.Angles._270_DEG; + bodySwing = pegasus.getWingRotationFactor(state) - MathUtil.Angles._270_DEG; bodySwing /= 10; } diff --git a/src/main/java/com/minelittlepony/client/model/part/LionTail.java b/src/main/java/com/minelittlepony/client/model/part/LionTail.java index 8bc3cfff..e89be87a 100644 --- a/src/main/java/com/minelittlepony/client/model/part/LionTail.java +++ b/src/main/java/com/minelittlepony/client/model/part/LionTail.java @@ -18,18 +18,18 @@ public class LionTail implements SubModel { } @Override - public void setPartAngles(PonyRenderState state, float limbAngle, float limbSpeed, float bodySwing, float animationProgress) { + public void setPartAngles(PonyRenderState state, float bodySwing) { tail.resetTransform(); bodySwing *= 5; float baseSail = 1F; - float speed = limbSpeed > 0.01F ? 6 : 90; + float speed = state.limbAmplitudeMultiplier > 0.01F ? 6 : 90; Interpolator interpolator = state.attributes.getMainInterpolator(); - float straightness = 1.6F * (1 + (float)Math.sin(animationProgress / speed) / 8F); - float twist = (float)Math.sin(Math.PI/2F + 2 * animationProgress / speed) / 16F; + float straightness = 1.6F * (1 + (float)Math.sin(state.age / speed) / 8F); + float twist = (float)Math.sin(Math.PI/2F + 2 * state.age / speed) / 16F; float bend = state.attributes.motionRoll / 80F; if (state.attributes.isCrouching) { @@ -46,11 +46,11 @@ public class LionTail implements SubModel { bend = interpolator.interpolate("kirin_tail_bendiness", bend, 10); tail.pitch = baseSail; - tail.pitch += limbSpeed / 2; + tail.pitch += state.limbAmplitudeMultiplier / 2; tail.yaw = twist; tail.roll = bodySwing * 2; - float sinTickFactor = MathHelper.sin(animationProgress * 0.067f) * 0.05f; + float sinTickFactor = MathHelper.sin(state.age * 0.067f) * 0.05f; tail.pitch += sinTickFactor; tail.yaw += sinTickFactor; diff --git a/src/main/java/com/minelittlepony/client/model/part/PonyEars.java b/src/main/java/com/minelittlepony/client/model/part/PonyEars.java index 627238b6..e0e6f813 100644 --- a/src/main/java/com/minelittlepony/client/model/part/PonyEars.java +++ b/src/main/java/com/minelittlepony/client/model/part/PonyEars.java @@ -27,11 +27,11 @@ public class PonyEars implements SubModel, MsonModel { } @Override - public void setPartAngles(PonyRenderState state, float limbAngle, float limbSpeed, float bodySwing, float animationProgress) { + public void setPartAngles(PonyRenderState state, float bodySwing) { right.resetTransform(); left.resetTransform(); - limbSpeed = MathHelper.clamp(limbSpeed, 0, 1); + float limbSpeed = MathHelper.clamp(state.limbAmplitudeMultiplier, 0, 1); float forwardFold = 0.14F * limbSpeed; float sidewaysFlop = 0.11F * limbSpeed; @@ -42,12 +42,12 @@ public class PonyEars implements SubModel, MsonModel { right.roll -= sidewaysFlop; left.roll += sidewaysFlop; - float floppyness = Math.abs(MathHelper.sin(animationProgress / 99F)); + float floppyness = Math.abs(MathHelper.sin(state.age / 99F)); if (floppyness > 0.99F) { - boolean leftFlop = MathHelper.sin(animationProgress / 5F) > 0.5F; + boolean leftFlop = MathHelper.sin(state.age / 5F) > 0.5F; (leftFlop ? left : right).roll += - 0.01F * MathHelper.sin(animationProgress / 2F) - + 0.015F * MathHelper.cos(animationProgress / 3F); + 0.01F * MathHelper.sin(state.age / 2F) + + 0.015F * MathHelper.cos(state.age / 3F); } } diff --git a/src/main/java/com/minelittlepony/client/model/part/PonyTail.java b/src/main/java/com/minelittlepony/client/model/part/PonyTail.java index 31053d90..46c3e99b 100644 --- a/src/main/java/com/minelittlepony/client/model/part/PonyTail.java +++ b/src/main/java/com/minelittlepony/client/model/part/PonyTail.java @@ -44,9 +44,9 @@ public class PonyTail implements SubModel, MsonModel { } @Override - public void setPartAngles(PonyRenderState state, float limbAngle, float limbSpeed, float bodySwing, float animationProgress) { + public void setPartAngles(PonyRenderState state, float bodySwing) { boolean rainboom = state.attributes.isSwimming || state.attributes.isGoingFast; - tail.roll = rainboom ? 0 : MathHelper.cos(limbAngle * 0.8F) * 0.2f * limbSpeed; + tail.roll = rainboom ? 0 : MathHelper.cos(state.limbAmplitudeInverse * 0.8F) * 0.2f * state.limbAmplitudeMultiplier; tail.yaw = bodySwing * 5; if (state.attributes.isCrouching && !rainboom) { @@ -59,11 +59,11 @@ public class PonyTail implements SubModel, MsonModel { } else { tail.setPivot(0, 0, TAIL_Z); if (rainboom) { - tail.pitch = MathUtil.Angles._90_DEG + MathHelper.sin(limbAngle) / 10; + tail.pitch = MathUtil.Angles._90_DEG + MathHelper.sin(state.limbAmplitudeInverse) / 10; } else { - tail.pitch = limbSpeed / 2; + tail.pitch = state.limbAmplitudeMultiplier / 2; - swingX(animationProgress); + swingX(state.age); } } diff --git a/src/main/java/com/minelittlepony/client/model/part/PonyWings.java b/src/main/java/com/minelittlepony/client/model/part/PonyWings.java index aed26454..24e6d164 100644 --- a/src/main/java/com/minelittlepony/client/model/part/PonyWings.java +++ b/src/main/java/com/minelittlepony/client/model/part/PonyWings.java @@ -57,17 +57,17 @@ public class PonyWings implements SubModel, MsonMo } @Override - public void setPartAngles(S state, float move, float swing, float bodySwing, float ticks) { + public void setPartAngles(S state, float bodySwing) { float flap = 0; float progress = state.getSwingAmount(); if (progress > 0) { flap = MathHelper.sin(MathHelper.sqrt(progress) * MathHelper.TAU); } else { - float pi = MathHelper.PI * (float) Math.pow(swing, 16); + float pi = MathHelper.PI * (float) Math.pow(state.limbAmplitudeMultiplier, 16); - float mve = move * 0.6662f; // magic number ahoy (actually 2/3) - float srt = swing / 4; + float mve = state.limbAmplitudeInverse * 0.6662f; // magic number ahoy (actually 2/3) + float srt = state.limbAmplitudeMultiplier * 0.25F; flap = MathHelper.cos(mve + pi) * srt; } @@ -75,12 +75,12 @@ public class PonyWings implements SubModel, MsonMo float flapAngle = MathUtil.Angles._270_DEG; if (pegasus.wingsAreOpen(state)) { - flapAngle = pegasus.getWingRotationFactor(state, ticks); - if (!state.attributes.isCrouching && pegasus.isBurdened(state)) { + flapAngle = pegasus.getWingRotationFactor(state); + if (!state.attributes.isCrouching && isBurdened(state)) { flapAngle -= 1F; } } else { - flapAngle = MathUtil.Angles._270_DEG - 0.9F + (float)Math.sin(ticks / 10) / 15F; + flapAngle = MathUtil.Angles._270_DEG - 0.9F + (float)Math.sin(state.age * 0.1F) / 15F; } if (!state.attributes.isFlying) { @@ -114,6 +114,13 @@ public class PonyWings implements SubModel, MsonMo } } + + private boolean isBurdened(S state) { + return state.getAttributes().isWearing(Wearable.SADDLE_BAGS_BOTH) + || state.getAttributes().isWearing(Wearable.SADDLE_BAGS_LEFT) + || state.getAttributes().isWearing(Wearable.SADDLE_BAGS_RIGHT); + } + @Override public void renderPart(MatrixStack stack, VertexConsumer vertices, int overlay, int light, int color) { leftWing.render(stack, vertices, overlay, light, color); diff --git a/src/main/java/com/minelittlepony/client/model/part/SeaponyTail.java b/src/main/java/com/minelittlepony/client/model/part/SeaponyTail.java index 0e90d45e..10878e3f 100644 --- a/src/main/java/com/minelittlepony/client/model/part/SeaponyTail.java +++ b/src/main/java/com/minelittlepony/client/model/part/SeaponyTail.java @@ -22,8 +22,8 @@ public class SeaponyTail implements SubModel, MsonModel { } @Override - public void setPartAngles(PonyRenderState state, float limbAngle, float limbSpeed, float bodySwing, float animationProgress) { - float rotation = state.attributes.isLyingDown ? 0 : MathHelper.sin(animationProgress * 0.536f) / 4; + public void setPartAngles(PonyRenderState state, float bodySwing) { + float rotation = state.attributes.isLyingDown ? 0 : MathHelper.sin(state.age * 0.536f) / 4; tailBase.pitch = MathHelper.HALF_PI + rotation; tailTip.pitch = rotation; diff --git a/src/main/java/com/minelittlepony/client/render/DebugBoundingBoxRenderer.java b/src/main/java/com/minelittlepony/client/render/DebugBoundingBoxRenderer.java index e209f5f4..6b17491e 100644 --- a/src/main/java/com/minelittlepony/client/render/DebugBoundingBoxRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/DebugBoundingBoxRenderer.java @@ -37,7 +37,7 @@ public final class DebugBoundingBoxRenderer { } public static Box getBoundingBox(PonyRenderState state) { - final float scale = state.getScaleFactor(); + final float scale = state.size.scaleFactor(); final float width = state.width * scale; final float height = state.height * scale; diff --git a/src/main/java/com/minelittlepony/client/render/EquineRenderManager.java b/src/main/java/com/minelittlepony/client/render/EquineRenderManager.java index a07203ec..0539dcc7 100644 --- a/src/main/java/com/minelittlepony/client/render/EquineRenderManager.java +++ b/src/main/java/com/minelittlepony/client/render/EquineRenderManager.java @@ -87,7 +87,7 @@ public class EquineRenderManager< } public void setupTransforms(S state, MatrixStack stack, float animationProgress, float bodyYaw) { - float s = state.getScaleFactor(); + float s = state.size.scaleFactor(); stack.scale(s, s, s); if (state instanceof PlayerEntityRenderState && state.attributes.isSitting) { diff --git a/src/main/java/com/minelittlepony/client/render/blockentity/skull/PonySkullRenderer.java b/src/main/java/com/minelittlepony/client/render/blockentity/skull/PonySkullRenderer.java index 423bede8..aa72283c 100644 --- a/src/main/java/com/minelittlepony/client/render/blockentity/skull/PonySkullRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/blockentity/skull/PonySkullRenderer.java @@ -6,7 +6,6 @@ import com.minelittlepony.client.model.ModelType; import com.minelittlepony.client.model.armour.ArmourRendererPlugin; import com.minelittlepony.client.render.MobRenderers; import com.minelittlepony.client.render.entity.*; -import com.minelittlepony.common.util.Color; import net.minecraft.block.AbstractSkullBlock; import net.minecraft.block.SkullBlock; @@ -18,16 +17,17 @@ import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.block.entity.SkullBlockEntityModel; import net.minecraft.client.render.block.entity.SkullBlockEntityRenderer; +import net.minecraft.client.render.entity.state.LivingEntityRenderState; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.ProfileComponent; import net.minecraft.entity.EquipmentSlot; -import net.minecraft.entity.LivingEntity; import net.minecraft.item.BlockItem; import net.minecraft.item.ItemStack; import net.minecraft.item.equipment.EquipmentModel.LayerType; import net.minecraft.util.Identifier; import net.minecraft.util.Util; +import net.minecraft.util.math.ColorHelper; import net.minecraft.util.math.Direction; import java.util.HashMap; @@ -60,13 +60,13 @@ public class PonySkullRenderer { headModels = SkullBlockEntityRenderer.getModels(MinecraftClient.getInstance().getEntityModelLoader()); } - public void renderSkull(MatrixStack matrices, VertexConsumerProvider provider, ItemStack stack, LivingEntity entity, float tickDelta, int light, boolean isPony) { + public void renderSkull(MatrixStack matrices, VertexConsumerProvider provider, ItemStack stack, LivingEntityRenderState entity, float tickDelta, int light, boolean isPony) { isBeingWorn = true; this.isPony = isPony; SkullType type = ((AbstractSkullBlock) ((BlockItem) stack.getItem()).getBlock()).getSkullType(); SkullBlockEntityModel skullBlockEntityModel = headModels.get(type); RenderLayer renderLayer = SkullBlockEntityRenderer.getRenderLayer(type, stack.get(DataComponentTypes.PROFILE)); - SkullBlockEntityRenderer.renderSkull(null, 180, (entity.getVehicle() instanceof LivingEntity l ? l : entity).limbAnimator.getPos(tickDelta), matrices, provider, light, skullBlockEntityModel, renderLayer); + SkullBlockEntityRenderer.renderSkull(null, 180, entity.headItemAnimationProgress, matrices, provider, light, skullBlockEntityModel, renderLayer); isBeingWorn = false; this.isPony = false; } @@ -112,7 +112,7 @@ public class PonySkullRenderer { VertexConsumer vertices = renderContext.getBuffer(layer); selectedSkull.setAngles(yaw, animationProgress); - selectedSkull.render(stack, vertices, light, OverlayTexture.DEFAULT_UV, Color.argbToHex(ArmourRendererPlugin.INSTANCE.get().getArmourAlpha(EquipmentSlot.HEAD, LayerType.HUMANOID), 1, 1, 1)); + selectedSkull.render(stack, vertices, light, OverlayTexture.DEFAULT_UV, ColorHelper.fromFloats(ArmourRendererPlugin.INSTANCE.get().getArmourAlpha(EquipmentSlot.HEAD, LayerType.HUMANOID), 1, 1, 1)); stack.pop(); diff --git a/src/main/java/com/minelittlepony/client/render/entity/AbstractPonyRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/AbstractPonyRenderer.java index 53721d2d..6da3dbb8 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/AbstractPonyRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/AbstractPonyRenderer.java @@ -21,6 +21,7 @@ import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.entity.EntityRendererFactory; import net.minecraft.client.render.entity.MobEntityRenderer; import net.minecraft.client.render.entity.feature.FeatureRenderer; +import net.minecraft.client.render.entity.feature.HeadFeatureRenderer; import net.minecraft.client.render.entity.state.PlayerEntityRenderState; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.mob.MobEntity; @@ -58,7 +59,7 @@ public abstract class AbstractPonyRenderer< protected void addFeatures(EntityRendererFactory.Context context) { addFeature(new ArmourFeature<>(this, context.getEquipmentModelLoader())); addPonyFeature(createHeldItemFeature(context)); - addFeature(new SkullFeature<>(this, context.getModelLoader(), context.getItemRenderer())); + addFeature(createSkullFeature(context)); addPonyFeature(new ElytraFeature<>(this, context.getEquipmentRenderer())); addFeature(new GearFeature<>(this)); } @@ -71,6 +72,10 @@ public abstract class AbstractPonyRenderer< return ((List)features).add(feature); } + protected SkullFeature createSkullFeature(EntityRendererFactory.Context context) { + return new SkullFeature<>(this, context.getModelLoader(), context.getItemRenderer(), HeadFeatureRenderer.HeadTransformation.DEFAULT, true); + } + protected HeldItemFeature createHeldItemFeature(EntityRendererFactory.Context context) { return new HeldItemFeature<>(this, context.getItemRenderer()); } @@ -92,13 +97,13 @@ public abstract class AbstractPonyRenderer< } @Override - public boolean shouldRender(T state, Frustum visibleRegion, double camX, double camY, double camZ) { - return super.shouldRender(state, manager.getFrustrum(state, visibleRegion), camX, camY, camZ); + public boolean shouldRender(T entity, Frustum visibleRegion, double camX, double camY, double camZ) { + return super.shouldRender(entity, manager.getFrustrum(entity, visibleRegion), camX, camY, camZ); } @Override public void scale(S state, MatrixStack stack) { - shadowRadius = state.getShadowSize(); + shadowRadius = state.size.shadowSize(); if (state.baby) { shadowRadius *= 3; // undo vanilla shadow scaling diff --git a/src/main/java/com/minelittlepony/client/render/entity/EnderStallionRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/EnderStallionRenderer.java index aa204edf..807f7b85 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/EnderStallionRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/EnderStallionRenderer.java @@ -1,7 +1,6 @@ package com.minelittlepony.client.render.entity; -import com.minelittlepony.api.model.ModelAttributes; -import com.minelittlepony.api.model.PonyModel; +import com.minelittlepony.api.model.*; import com.minelittlepony.api.pony.Pony; import com.minelittlepony.api.pony.meta.Race; import com.minelittlepony.client.MineLittlePony; @@ -21,6 +20,7 @@ import net.minecraft.entity.LivingEntity; import net.minecraft.entity.mob.EndermanEntity; import net.minecraft.util.Arm; import net.minecraft.util.Identifier; +import net.minecraft.util.math.MathHelper; import org.jetbrains.annotations.Nullable; @@ -92,6 +92,9 @@ public class EnderStallionRenderer extends PonyRenderer { @@ -67,8 +68,8 @@ public class PlayerPonyRenderer addPonyFeature(new HeldItemFeature<>(this, context.getItemRenderer())); addPonyFeature(new DJPon3Feature<>(this)); addFeature(new CapeFeature(this, context.getModelLoader(), context.getEquipmentModelLoader())); - addPonyFeature(new SkullFeature<>(this, context.getModelLoader(), context.getItemRenderer())); - addPonyFeature(new ElytraFeature<>(this, context.getEquipmentRenderer())); + addPonyFeature(new SkullFeature<>(this, context.getModelLoader(), context.getItemRenderer(), HeadFeatureRenderer.HeadTransformation.DEFAULT, true)); + addPonyFeature(new ElytraFeature(this, context.getEquipmentRenderer())); addPonyFeature(new PassengerFeature<>(this, context)); addPonyFeature(new GearFeature<>(this)); } @@ -83,7 +84,7 @@ public class PlayerPonyRenderer public Vec3d getPositionOffset(PlayerEntityRenderState state) { Vec3d offset = super.getPositionOffset(state); - return offset.add(state.baseScale * ((PlayerPonyRenderState)state).yOffset).multiply(((PonyRenderState)state).getScaleFactor()); + return offset.add(state.baseScale * ((PlayerPonyRenderState)state).yOffset).multiply(((PonyRenderState)state).size.scaleFactor()); } @Override @@ -112,7 +113,7 @@ public class PlayerPonyRenderer @Override public void render(PlayerEntityRenderState state, MatrixStack stack, VertexConsumerProvider vertices, int light) { // EntityModelFeatures: We have to force it to use our models otherwise EMF overrides it and breaks pony rendering - shadowRadius = ((PlayerPonyRenderState)state).getShadowSize(); + shadowRadius = ((PlayerPonyRenderState)state).size.shadowSize(); super.render(state, stack, vertices, light); DebugBoundingBoxRenderer.render((PlayerPonyRenderState)state, stack, vertices); diff --git a/src/main/java/com/minelittlepony/client/render/entity/PonyStandRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/PonyStandRenderer.java index 012fce9a..9961bfa7 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/PonyStandRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/PonyStandRenderer.java @@ -7,36 +7,86 @@ import net.minecraft.client.render.entity.model.ArmorStandArmorEntityModel; import net.minecraft.client.render.entity.state.ArmorStandEntityRenderState; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.decoration.ArmorStandEntity; +import net.minecraft.util.Identifier; +import com.minelittlepony.api.model.ModelAttributes.Mode; import com.minelittlepony.api.model.Models; +import com.minelittlepony.api.pony.Pony; +import com.minelittlepony.api.pony.PonyData; +import com.minelittlepony.api.pony.meta.Wearable; import com.minelittlepony.client.model.ModelType; import com.minelittlepony.client.model.armour.PonifiedEquipmentRenderer; import com.minelittlepony.client.model.entity.PonyArmourStandModel; import com.minelittlepony.client.model.entity.race.EarthPonyModel; +import com.minelittlepony.client.render.EquineRenderManager; +import com.minelittlepony.client.render.PonyRenderContext; import com.minelittlepony.client.render.entity.feature.*; import com.minelittlepony.client.render.entity.state.PonyRenderState; -public class PonyStandRenderer extends ArmorStandEntityRenderer { +import java.util.Optional; +import java.util.function.Function; +import java.util.function.Predicate; + +public class PonyStandRenderer extends ArmorStandEntityRenderer implements PonyRenderContext> { + static final Pony PONY = new Pony(Identifier.ofVanilla("null"), () -> Optional.of(PonyData.NULL)); private final PonyArmourStandModel pony = ModelType.ARMOUR_STAND.createModel(); + private final Models> models = ModelType.EARTH_PONY.create(false); + private final ArmorStandArmorEntityModel human; + private final EquineRenderManager> manager; + public PonyStandRenderer(EntityRendererFactory.Context context) { super(context); human = model; + this.manager = new EquineRenderManager<>(this, (state, stack, progress, yaw) -> {}, models); + + Predicate swapPredicate = state -> ((State)state).hasPonyForm; + Function converter = state -> ((State)state).ponyState; for (int i = 0; i < features.size(); i++) { var feature = features.get(i); if (feature instanceof ArmorFeatureRenderer) { - features.set(i, new SwappableFeature<>(this, feature, new Armour(this, context), state -> ((State)state).hasPonyForm)); + features.set(i, new SwappableFeature<>(this, feature, new Armour(context), swapPredicate, converter)); } if (feature instanceof ElytraFeatureRenderer) { - features.set(i, new SwappableFeature<>(this, feature, new ElytraFeature<>(this, context.getEquipmentRenderer()), state -> ((State)state).hasPonyForm)); + features.set(i, new SwappableFeature<>(this, + feature, + new ElytraFeature<>(() -> models.body(), context.getEquipmentRenderer()), swapPredicate, converter)); + } + if (feature instanceof HeadFeatureRenderer) { + features.set(i, new SwappableFeature<>(this, + feature, + new SkullFeature>( + this, + context.getModelLoader(), + context.getItemRenderer(), + HeadFeatureRenderer.HeadTransformation.DEFAULT, + false + ), swapPredicate, converter)); } } - - //addFeature(new HeadFeatureRenderer<>(this, context.getModelLoader(), context.getItemRenderer())); } + + @Override + public Identifier getDefaultTexture(PonyRenderState entity, Wearable wearable) { + return wearable.getDefaultTexture(); + } + + @Override + public Pony getEntityPony(ArmorStandEntity entity) { + return PONY; + } + + @Override + public EquineRenderManager> getInternalRenderer() { + return manager; + } + + @Override + public void setModel(EarthPonyModel model) { } + @Override public ArmorStandEntityRenderState createRenderState() { return new State(); @@ -48,6 +98,8 @@ public class PonyStandRenderer extends ArmorStandEntityRenderer { super.updateRenderState(entity, state, tickDelta); ((State)state).hasPonyForm = ponified; if (ponified) { + BipedEntityRenderer.updateBipedRenderState(entity, ((State)state).ponyState, tickDelta); + manager.updateState(entity, ((State)state).ponyState, Mode.OTHER); state.pitch = 0.017453292F * entity.getHeadRotation().getPitch(); state.yawDegrees = 0.017453292F * entity.getHeadRotation().getYaw(); } @@ -64,20 +116,18 @@ public class PonyStandRenderer extends ArmorStandEntityRenderer { } } - class Armour extends FeatureRenderer { - private final Models> pony = ModelType.EARTH_PONY.create(false); - + class Armour extends FeatureRenderer> { private final PonifiedEquipmentRenderer equipmentRenderer; - public Armour(FeatureRendererContext renderer, EntityRendererFactory.Context context) { - super(renderer); + public Armour(EntityRendererFactory.Context context) { + super(() -> models.body()); equipmentRenderer = new PonifiedEquipmentRenderer(context.getEquipmentModelLoader()); } @Override - public void render(MatrixStack matrices, VertexConsumerProvider vertices, int light, ArmorStandEntityRenderState state, float limbAngle, float limbDistance) { - pony.body().setAngles(((State)state).ponyState); - ArmourFeature.renderArmor(pony, matrices, vertices, light, ((State)state).ponyState, limbDistance, limbAngle, equipmentRenderer); + public void render(MatrixStack matrices, VertexConsumerProvider vertices, int light, PonyRenderState state, float limbAngle, float limbDistance) { + getContextModel().setAngles(state); + ArmourFeature.renderArmor(models, matrices, vertices, light, state, limbDistance, limbAngle, equipmentRenderer); } } diff --git a/src/main/java/com/minelittlepony/client/render/entity/SeaponyRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/SeaponyRenderer.java index 18063e63..33d9ad39 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/SeaponyRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/SeaponyRenderer.java @@ -8,9 +8,9 @@ import com.minelittlepony.client.model.entity.race.SeaponyModel; import com.minelittlepony.client.render.entity.npc.textures.TextureSupplier; import com.minelittlepony.client.render.entity.state.PonyRenderState; -import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.*; import net.minecraft.client.render.entity.EntityRendererFactory; +import net.minecraft.client.render.entity.GuardianEntityRenderer; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; @@ -50,8 +50,8 @@ public class SeaponyRenderer extends PonyRenderer + S extends PonyRenderState, + M extends ClientPonyModel > extends FeatureRenderer { private static final Identifier TEXTURE = Identifier.ofVanilla("textures/entity/elytra.png"); diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/GearFeature.java b/src/main/java/com/minelittlepony/client/render/entity/feature/GearFeature.java index a82aa84c..a4b7298a 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/feature/GearFeature.java +++ b/src/main/java/com/minelittlepony/client/render/entity/feature/GearFeature.java @@ -100,7 +100,7 @@ public class GearFeature< } private void renderGear(M model, S entity, Gear gear, MatrixStack stack, VertexConsumerProvider renderContext, int lightUv, float limbDistance, float limbAngle, float tickDelta) { - gear.pose(model, entity, entity.attributes.isGoingFast, entity.attributes.getEntityId(), limbDistance, limbAngle, entity.getWobbleAmount(), tickDelta); + gear.pose(model, entity, entity.attributes.isGoingFast, entity.attributes.getEntityId(), limbDistance, limbAngle, entity.wobbleAmount * model.getWobbleAmplitude(entity), tickDelta); gear.render(stack, renderContext.getBuffer(gear.getLayer(entity, getContext())), lightUv, OverlayTexture.DEFAULT_UV, Colors.WHITE, entity.attributes.getEntityId()); } diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/SkullFeature.java b/src/main/java/com/minelittlepony/client/render/entity/feature/SkullFeature.java index 3be0c201..55b8990b 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/feature/SkullFeature.java +++ b/src/main/java/com/minelittlepony/client/render/entity/feature/SkullFeature.java @@ -1,7 +1,6 @@ package com.minelittlepony.client.render.entity.feature; import com.minelittlepony.api.model.BodyPart; -import com.minelittlepony.api.model.PonyModel; import com.minelittlepony.client.model.ClientPonyModel; import com.minelittlepony.client.model.armour.ArmourLayer; import com.minelittlepony.client.model.armour.ArmourRendererPlugin; @@ -12,27 +11,31 @@ import com.minelittlepony.client.render.entity.state.PonyRenderState; import net.minecraft.block.AbstractSkullBlock; import net.minecraft.client.render.*; import net.minecraft.client.render.entity.feature.HeadFeatureRenderer; -import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.client.render.entity.model.EntityModelLoader; -import net.minecraft.client.render.entity.state.BipedEntityRenderState; import net.minecraft.client.render.item.ItemRenderer; +import net.minecraft.client.render.model.BakedModel; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.EquippableComponent; import net.minecraft.entity.EquipmentSlot; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.mob.ZombieVillagerEntity; -import net.minecraft.entity.passive.VillagerEntity; import net.minecraft.item.*; public class SkullFeature< - T extends LivingEntity, S extends PonyRenderState, M extends ClientPonyModel > extends AbstractPonyFeature { private final ItemRenderer itemRenderer; - public SkullFeature(PonyRenderContext renderPony, EntityModelLoader entityModelLoader, ItemRenderer itemRenderer) { - super(renderPony); + private final HeadFeatureRenderer.HeadTransformation headTransformation; + + private final boolean scaleForChild; + + public SkullFeature(PonyRenderContext context, EntityModelLoader entityModelLoader, ItemRenderer itemRenderer, + HeadFeatureRenderer.HeadTransformation headTransformation, boolean scaleForChild) { + super(context); this.itemRenderer = itemRenderer; + this.headTransformation = headTransformation; + this.scaleForChild = scaleForChild; } @Override @@ -40,16 +43,20 @@ public class SkullFeature< ArmourRendererPlugin plugin = ArmourRendererPlugin.INSTANCE.get(); for (ItemStack stack : plugin.getArmorStacks(state, EquipmentSlot.HEAD, ArmourLayer.OUTER, ArmourRendererPlugin.ArmourType.SKULL)) { - if (stack.isEmpty()) { + + BakedModel headModel = state.equippedHeadItemModel; + + if (stack.isEmpty() || headModel == null) { continue; } M model = getModelWrapper().body(); Item item = stack.getItem(); + EquippableComponent equipable = stack.get(DataComponentTypes.EQUIPPABLE); matrices.push(); - if (state.baby && !(state instanceof VillagerEntity)) { + if (state.baby && scaleForChild) { matrices.translate(0, 0.03125F, 0); matrices.scale(0.7F, 0.7F, 0.7F); matrices.translate(0, 1, 0); @@ -58,8 +65,6 @@ public class SkullFeature< model.transform(state, BodyPart.HEAD, matrices); model.getHead().rotate(matrices); - boolean isVillager = state instanceof VillagerEntity || state instanceof ZombieVillagerEntity; - float f = 1.1F; matrices.scale(f, f, f); @@ -69,10 +74,10 @@ public class SkullFeature< matrices.translate(0, -0.1F, 0.1F); matrices.translate(-0.5, 0, -0.5); PonySkullRenderer.INSTANCE.renderSkull(matrices, provider, stack, state, state.age, light, true); - } else if (!(item instanceof ArmorItem a) || a.getSlotType() != EquipmentSlot.HEAD) { + } else if (equipable != null && equipable.slot() != EquipmentSlot.HEAD) { matrices.translate(0, 0.1F, -0.1F); - HeadFeatureRenderer.translate(matrices, isVillager); - itemRenderer.renderItem(state, stack, ModelTransformationMode.HEAD, false, matrices, provider, entity.getWorld(), light, OverlayTexture.DEFAULT_UV, entity.getId() + ModelTransformationMode.HEAD.ordinal()); + HeadFeatureRenderer.translate(matrices, headTransformation); + itemRenderer.renderItem(stack, ModelTransformationMode.HEAD, false, matrices, provider, light, OverlayTexture.DEFAULT_UV, headModel); } matrices.pop(); diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/SwappableFeature.java b/src/main/java/com/minelittlepony/client/render/entity/feature/SwappableFeature.java index a729e1ca..7ad99210 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/feature/SwappableFeature.java +++ b/src/main/java/com/minelittlepony/client/render/entity/feature/SwappableFeature.java @@ -7,29 +7,42 @@ import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.client.render.entity.state.EntityRenderState; import net.minecraft.client.util.math.MatrixStack; +import java.util.function.Function; import java.util.function.Predicate; -public final class SwappableFeature> extends FeatureRenderer { +public final class SwappableFeature< + S extends EntityRenderState, + M extends EntityModel, + P extends EntityRenderState, + N extends EntityModel + > extends FeatureRenderer { private final FeatureRenderer normal; - private final FeatureRenderer swapped; + private final FeatureRenderer swapped; private final Predicate swapCondition; + private final Function stateConverter; public SwappableFeature( FeatureRendererContext context, FeatureRenderer normal, - FeatureRenderer swapped, - Predicate swapCondition + FeatureRenderer swapped, + Predicate swapCondition, + Function stateConverter ) { super(context); this.normal = normal; this.swapped = swapped; this.swapCondition = swapCondition; + this.stateConverter = stateConverter; } @Override public void render(MatrixStack matrices, VertexConsumerProvider vertices, int light, S state, float limbAngle, float limbDistance) { - (swapCondition.test(state) ? swapped : normal).render(matrices, vertices, light, state, limbAngle, limbDistance); + if (swapCondition.test(state)) { + swapped.render(matrices, vertices, light, stateConverter.apply(state), limbAngle, limbDistance); + } else { + normal.render(matrices, vertices, light, state, limbAngle, limbDistance); + } } } diff --git a/src/main/java/com/minelittlepony/client/render/entity/state/PonyRenderState.java b/src/main/java/com/minelittlepony/client/render/entity/state/PonyRenderState.java index caf51c28..d557a00e 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/state/PonyRenderState.java +++ b/src/main/java/com/minelittlepony/client/render/entity/state/PonyRenderState.java @@ -24,6 +24,7 @@ public class PonyRenderState extends PlayerEntityRenderState implements PonyMode public float riderOffset; public float nameplateYOffset; public float legOutset; + public float wobbleAmount; public boolean smallArms; public boolean sleepingInBed; public boolean submergedInWater; @@ -31,6 +32,7 @@ public class PonyRenderState extends PlayerEntityRenderState implements PonyMode public boolean isTechnoblade; public Pony pony; + public Size size; public void updateState(LivingEntity entity, PonyModel model, Pony pony, ModelAttributes.Mode mode) { this.pony = pony; @@ -43,6 +45,7 @@ public class PonyRenderState extends PlayerEntityRenderState implements PonyMode isInSneakingPose = attributes.isCrouching && !attributes.isLyingDown; sleepingInBed = entity.getSleepingPosition().isPresent() && entity.getEntityWorld().getBlockState(entity.getSleepingPosition().get()).getBlock() instanceof BedBlock; submergedInWater = entity.isSubmergedInWater(); + wobbleAmount = handSwingProgress <= 0 ? 0 : MathHelper.sin(MathHelper.sqrt(getSwingAmount()) * MathHelper.PI * 2) * 0.04F; if (attributes.isSitting) { pose = EntityPose.SITTING; } @@ -53,18 +56,13 @@ public class PonyRenderState extends PlayerEntityRenderState implements PonyMode || entity instanceof ZombifiedPiglinEntity ) && entity.hasCustomName() && entity.getCustomName().getString().equalsIgnoreCase("technoblade") ); + size = baby ? SizePreset.FOAL : PonyConfig.getEffectiveSize(attributes.metadata.size()); PonyPosture.of(attributes).updateState(entity, this); PonyModelPrepareCallback.EVENT.invoker().onPonyModelPrepared(attributes, model, ModelAttributes.Mode.OTHER); } - /** - * Gets the active scaling profile used to lay out this model's parts. - */ - public Size getSize() { - return baby ? SizePreset.FOAL : PonyConfig.getEffectiveSize(attributes.metadata.size()); - } - + @Override public Race getRace() { return PonyConfig.getEffectiveRace(attributes.metadata.race()); } @@ -73,14 +71,6 @@ public class PonyRenderState extends PlayerEntityRenderState implements PonyMode return getRace().hasHorn() && attributes.metadata.glowColor() != 0; } - public final float getScaleFactor() { - return getSize().scaleFactor(); - } - - public final float getShadowSize() { - return getSize().shadowSize(); - } - /** * Gets the current leg swing amount. */ @@ -88,17 +78,6 @@ public class PonyRenderState extends PlayerEntityRenderState implements PonyMode return this.handSwingProgress; } - /** - * Gets the step wobble used for various hair bits and animations. - */ - public float getWobbleAmount() { - if (getSwingAmount() <= 0) { - return 0; - } - - return MathHelper.sin(MathHelper.sqrt(getSwingAmount()) * MathHelper.PI * 2) * 0.04F; - } - protected float getLegOutset() { float outset = attributes.isLyingDown ? 3.6F : attributes.isCrouching ? 1 : 5; @@ -112,13 +91,10 @@ public class PonyRenderState extends PlayerEntityRenderState implements PonyMode * Gets the y-offset applied to entities riding this one. */ protected float getRiderYOffset() { - switch ((SizePreset)getSize()) { - case NORMAL: return 0.4F; - case FOAL: - case TALL: - case BULKY: - default: return 0.25F; - } + return switch ((SizePreset)size) { + case NORMAL -> 0.4F; + default -> 0.25F; + }; } /** @@ -141,7 +117,7 @@ public class PonyRenderState extends PlayerEntityRenderState implements PonyMode float y = -(height + 0.5F); // Then we add our own offsets. - y += attributes.visualHeight * getScaleFactor() + 0.25F; + y += attributes.visualHeight * size.scaleFactor() + 0.25F; y += vehicleOffset; if (isInSneakingPose) { diff --git a/src/main/resources/minelp.aw b/src/main/resources/minelp.aw index 1f422828..d8b91d61 100644 --- a/src/main/resources/minelp.aw +++ b/src/main/resources/minelp.aw @@ -1,4 +1,7 @@ accessWidener v1 named accessible class net/minecraft/client/render/VertexConsumers$Union -extendable method net/minecraft/client/model/Model render (Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumer;III)V +accessible method net/minecraft/client/render/entity/GuardianEntityRenderer renderBeam (Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumer;Lnet/minecraft/util/math/Vec3d;FFF)V +accessible method net/minecraft/client/render/entity/GuardianEntityRenderer getBeamTarget (Lnet/minecraft/entity/mob/GuardianEntity;)Lnet/minecraft/entity/Entity; + +extendable method net/minecraft/client/model/Model render (Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumer;III)V