diff --git a/src/main/java/com/trainguy9512/animationoverhaul/animation/data/AnimationDataContainer.java b/src/main/java/com/trainguy9512/animationoverhaul/animation/data/AnimationDataContainer.java index 471c138..cedf8db 100644 --- a/src/main/java/com/trainguy9512/animationoverhaul/animation/data/AnimationDataContainer.java +++ b/src/main/java/com/trainguy9512/animationoverhaul/animation/data/AnimationDataContainer.java @@ -34,6 +34,7 @@ public static AnimationDataContainer of(JointSkeleton jointSkeleton){ return new AnimationDataContainer(jointSkeleton); } + @Override public JointSkeleton getJointSkeleton(){ return this.jointSkeleton; } diff --git a/src/main/java/com/trainguy9512/animationoverhaul/animation/data/PoseCalculationDataContainer.java b/src/main/java/com/trainguy9512/animationoverhaul/animation/data/PoseCalculationDataContainer.java index 710cc8b..695d87e 100644 --- a/src/main/java/com/trainguy9512/animationoverhaul/animation/data/PoseCalculationDataContainer.java +++ b/src/main/java/com/trainguy9512/animationoverhaul/animation/data/PoseCalculationDataContainer.java @@ -3,6 +3,7 @@ import com.trainguy9512.animationoverhaul.animation.data.driver.Driver; import com.trainguy9512.animationoverhaul.animation.data.key.AnimationDataKey; import com.trainguy9512.animationoverhaul.animation.data.key.AnimationDriverKey; +import com.trainguy9512.animationoverhaul.animation.joint.JointSkeleton; import com.trainguy9512.animationoverhaul.animation.pose.AnimationPose; import com.trainguy9512.animationoverhaul.animation.pose.sampler.PoseSampler; import com.trainguy9512.animationoverhaul.animation.pose.sampler.Sampleable; @@ -36,4 +37,9 @@ public interface PoseCalculationDataContainer { */ public

AnimationPose sample(AnimationDataKey

poseSamplerKey, AnimationPose animationPose, float partialTicks); + /** + * Returns the joint skeleton for the data container. + */ + public JointSkeleton getJointSkeleton(); + } diff --git a/src/main/java/com/trainguy9512/animationoverhaul/animation/pose/function/CachedPoseFunction.java b/src/main/java/com/trainguy9512/animationoverhaul/animation/pose/function/CachedPoseFunction.java new file mode 100644 index 0000000..6bbcc1f --- /dev/null +++ b/src/main/java/com/trainguy9512/animationoverhaul/animation/pose/function/CachedPoseFunction.java @@ -0,0 +1,16 @@ +package com.trainguy9512.animationoverhaul.animation.pose.function; + +import com.trainguy9512.animationoverhaul.animation.pose.AnimationPose; +import org.jetbrains.annotations.NotNull; + +public class CachedPoseFunction implements PoseFunction { + @Override + public @NotNull AnimationPose compute(FunctionInterpolationContext context) { + return null; + } + + @Override + public void tick(FunctionEvaluationState context) { + + } +} diff --git a/src/main/java/com/trainguy9512/animationoverhaul/animation/pose/function/PoseFunction.java b/src/main/java/com/trainguy9512/animationoverhaul/animation/pose/function/PoseFunction.java index a79dcce..a5794e3 100644 --- a/src/main/java/com/trainguy9512/animationoverhaul/animation/pose/function/PoseFunction.java +++ b/src/main/java/com/trainguy9512/animationoverhaul/animation/pose/function/PoseFunction.java @@ -1,14 +1,35 @@ package com.trainguy9512.animationoverhaul.animation.pose.function; +import com.trainguy9512.animationoverhaul.animation.data.OnTickDataContainer; import com.trainguy9512.animationoverhaul.animation.data.PoseCalculationDataContainer; import com.trainguy9512.animationoverhaul.animation.pose.AnimationPose; +import org.jetbrains.annotations.NotNull; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; public interface PoseFunction { - AnimationPose calculate(PoseFunction.FunctionContext functionContext); + @NotNull AnimationPose compute(PoseFunction.FunctionInterpolationContext context); + + void tick(FunctionEvaluationState evaluationState); + + public record FunctionEvaluationState(OnTickDataContainer dataContainer, boolean isRelevant, boolean shouldReset){ + public static FunctionEvaluationState of(OnTickDataContainer dataContainer, boolean isRelevant, boolean shouldReset){ + return new FunctionEvaluationState(dataContainer, isRelevant, shouldReset); + } + + public FunctionEvaluationState modify(boolean isRelevant, boolean shouldReset){ + return FunctionEvaluationState.of(this.dataContainer, isRelevant, shouldReset); + } + } + - public interface FunctionContext { - PoseCalculationDataContainer getDataContainer(); - float getPartialTicks(); + public interface FunctionInterpolationContext { + PoseCalculationDataContainer dataContainer(); + float partialTicks(); } + + } diff --git a/src/main/java/com/trainguy9512/animationoverhaul/animation/pose/function/TickablePoseFunction.java b/src/main/java/com/trainguy9512/animationoverhaul/animation/pose/function/TickablePoseFunction.java deleted file mode 100644 index 0e5f6e6..0000000 --- a/src/main/java/com/trainguy9512/animationoverhaul/animation/pose/function/TickablePoseFunction.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.trainguy9512.animationoverhaul.animation.pose.function; - -import com.trainguy9512.animationoverhaul.animation.data.OnTickDataContainer; - -public interface TickablePoseFunction extends PoseFunction { - void tick(OnTickDataContainer dataContainer); -} diff --git a/src/main/java/com/trainguy9512/animationoverhaul/animation/pose/function/TimeBasedPoseFunction.java b/src/main/java/com/trainguy9512/animationoverhaul/animation/pose/function/TimeBasedPoseFunction.java new file mode 100644 index 0000000..dade782 --- /dev/null +++ b/src/main/java/com/trainguy9512/animationoverhaul/animation/pose/function/TimeBasedPoseFunction.java @@ -0,0 +1,46 @@ +package com.trainguy9512.animationoverhaul.animation.pose.function; + +import com.trainguy9512.animationoverhaul.animation.pose.AnimationPose; +import org.jetbrains.annotations.NotNull; + +import java.util.function.Function; + +public class TimeBasedPoseFunction implements PoseFunction { + + Function playRateFunction; + Function isPlayingFunction; + + protected float timeTicksElapsed; + protected float playRate; + protected boolean isPlaying; + + private TimeBasedPoseFunction(){ + this.playRateFunction = (interpolationContext) -> 1f; + this.isPlayingFunction = (interpolationContext) -> true; + this.timeTicksElapsed = 0; + } + + @Override + public @NotNull AnimationPose compute(FunctionInterpolationContext context) { + return AnimationPose.of(context.dataContainer().getJointSkeleton()); + } + + @Override + public void tick(FunctionEvaluationState evaluationState) { + if(evaluationState.isRelevant()){ + this.playRate = playRateFunction.apply(evaluationState); + this.isPlaying = isPlayingFunction.apply(evaluationState); + + if(evaluationState.shouldReset()){ + this.timeTicksElapsed = 0; + } + if(this.isPlaying){ + this.timeTicksElapsed += this.playRate; + } + } + } + + protected float getInterpolatedTimeElapsed(FunctionInterpolationContext context){ + return this.timeTicksElapsed - (1 - context.partialTicks()) * this.playRate; + } +}