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..f60e849 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())) @@ -317,10 +320,15 @@ private static List addArgsForKeyframes(List frames) { ))); } else if (frame.easingType() == EasingType.BEZIER) { + List leftValue = frame.easingArgs().getFirst(); List rightValue = frame.easingArgs().get(2); List rightTime = frame.easingArgs().get(3); - frame.easingArgs().remove(2); - frame.easingArgs().remove(2); + if (type == TransformType.ROTATION) { + rightValue = toRadiansForBezier(rightValue); + leftValue = toRadiansForBezier(leftValue); + } + 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) { @@ -335,6 +343,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;