From 6f6d7e4ae5c8a624b787a2a30d34ec288b197409 Mon Sep 17 00:00:00 2001 From: ZigyTheBird <105124180+ZigyTheBird@users.noreply.github.com> Date: Fri, 2 Jan 2026 15:25:49 +0330 Subject: [PATCH 1/2] Bezier fixes --- .../playeranimcore/easing/BezierEasing.java | 11 ++++++----- .../loading/AnimationLoader.java | 19 +++++++++++++++++-- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/com/zigythebird/playeranimcore/easing/BezierEasing.java b/core/src/main/java/com/zigythebird/playeranimcore/easing/BezierEasing.java index 4ccdb5d..5cc6c9c 100644 --- a/core/src/main/java/com/zigythebird/playeranimcore/easing/BezierEasing.java +++ b/core/src/main/java/com/zigythebird/playeranimcore/easing/BezierEasing.java @@ -25,8 +25,8 @@ public float apply(MochaEngine env, AnimationPoint animationPoint, @Nullable if (easingArgs.isEmpty()) return MochaMath.lerp(animationPoint.animationStartValue(), animationPoint.animationEndValue(), buildTransformer(easingValue).apply(lerpValue)); - float rightValue = isEasingBefore() ? 0 : env.eval(easingArgs.getFirst()); - float rightTime = isEasingBefore() ? 0.1f : env.eval(easingArgs.get(1)); + float rightValue; + float rightTime; float leftValue = isEasingBefore() ? env.eval(easingArgs.getFirst()) : 0; float leftTime = isEasingBefore() ? env.eval(easingArgs.get(1)) : -0.1f; @@ -34,9 +34,10 @@ public float apply(MochaEngine env, AnimationPoint animationPoint, @Nullable rightValue = env.eval(easingArgs.get(2)); rightTime = env.eval(easingArgs.get(3)); } - - leftValue = (float) Math.toRadians(leftValue); - rightValue = (float) Math.toRadians(rightValue); + else { + rightValue = isEasingBefore() ? 0 : env.eval(easingArgs.getFirst()); + rightTime = isEasingBefore() ? 0.1f : env.eval(easingArgs.get(1)); + } float gapTime = animationPoint.transitionLength()/20; diff --git a/core/src/main/java/com/zigythebird/playeranimcore/loading/AnimationLoader.java b/core/src/main/java/com/zigythebird/playeranimcore/loading/AnimationLoader.java index cdaa0c6..621cf40 100644 --- a/core/src/main/java/com/zigythebird/playeranimcore/loading/AnimationLoader.java +++ b/core/src/main/java/com/zigythebird/playeranimcore/loading/AnimationLoader.java @@ -43,6 +43,7 @@ import team.unnamed.mocha.parser.ast.Expression; import team.unnamed.mocha.parser.ast.FloatExpression; import team.unnamed.mocha.parser.ast.IdentifierExpression; +import team.unnamed.mocha.runtime.IsConstantExpression; import java.lang.reflect.Type; import java.util.Collections; @@ -50,6 +51,8 @@ import java.util.List; import java.util.Map; +import static com.zigythebird.playeranimcore.molang.MolangLoader.MOCHA_ENGINE; + public class AnimationLoader implements JsonDeserializer { @Override public Animation deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { @@ -274,7 +277,7 @@ private static KeyframeStack buildKeyframeStack(List> getEasingArgsForAxis(JsonObject entryObj, easingArg; } - private static List addArgsForKeyframes(List frames) { + private static List addArgsForKeyframes(List frames, TransformType type) { if (frames.getFirst().startValue().getFirst() instanceof AccessExpression accessExpression && "disabled".equals(accessExpression.property()) && accessExpression.object() instanceof IdentifierExpression identifierExpression && "pal".equals(identifierExpression.name())) @@ -319,6 +322,10 @@ private static List addArgsForKeyframes(List frames) { else if (frame.easingType() == EasingType.BEZIER) { List rightValue = frame.easingArgs().get(2); List rightTime = frame.easingArgs().get(3); + if (type == TransformType.ROTATION) { + rightValue = toRadiansForBezier(rightValue); + frame.easingArgs().set(0, toRadiansForBezier(frame.easingArgs().getFirst())); + } frame.easingArgs().remove(2); frame.easingArgs().remove(2); if (frames.size() > i + 1) { @@ -335,6 +342,14 @@ else if (frame.easingType() == EasingType.BEZIER) { return frames; } + private static List toRadiansForBezier(List expressions) { + if (expressions.size() == 1 && IsConstantExpression.test(expressions.getFirst())) { + return Collections.singletonList(FloatExpression.of(Math.toRadians(MOCHA_ENGINE.eval(expressions)))); + } + PlayerAnimLib.LOGGER.warn("Invalid easing arguments for bezier: {}\nFor rotations bezier args can only be floats.", expressions); + return expressions; + } + public static float calculateAnimationLength(Map boneAnimations) { float length = 0; From 37599c6823e25d7ced12d1a850363a476a756792 Mon Sep 17 00:00:00 2001 From: ZigyTheBird <105124180+ZigyTheBird@users.noreply.github.com> Date: Thu, 8 Jan 2026 20:14:13 +0330 Subject: [PATCH 2/2] Update AnimationLoader.java --- .../playeranimcore/loading/AnimationLoader.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/com/zigythebird/playeranimcore/loading/AnimationLoader.java b/core/src/main/java/com/zigythebird/playeranimcore/loading/AnimationLoader.java index 621cf40..f60e849 100644 --- a/core/src/main/java/com/zigythebird/playeranimcore/loading/AnimationLoader.java +++ b/core/src/main/java/com/zigythebird/playeranimcore/loading/AnimationLoader.java @@ -320,14 +320,15 @@ private static List addArgsForKeyframes(List frames, Transfo ))); } else if (frame.easingType() == EasingType.BEZIER) { + List leftValue = frame.easingArgs().getFirst(); List rightValue = frame.easingArgs().get(2); List rightTime = frame.easingArgs().get(3); if (type == TransformType.ROTATION) { rightValue = toRadiansForBezier(rightValue); - frame.easingArgs().set(0, toRadiansForBezier(frame.easingArgs().getFirst())); + leftValue = toRadiansForBezier(leftValue); } - frame.easingArgs().remove(2); - frame.easingArgs().remove(2); + frames.set(i, new Keyframe(frame.length(), frame.startValue(), frame.endValue(), frame.easingType(), + List.of(leftValue, frame.easingArgs().get(1)))); if (frames.size() > i + 1) { Keyframe nextKeyframe = frames.get(i + 1); if (nextKeyframe.easingType() == EasingType.BEZIER) {