From 9ae58dfdb3327918106a0d97b7fec2dcffe859f2 Mon Sep 17 00:00:00 2001 From: George Paton Date: Tue, 8 Oct 2024 19:07:57 +1100 Subject: [PATCH 1/2] Support for ALL Blender fcurve functionality!! --- ntm-animator.blend | Bin 1100788 -> 1108248 bytes .../com/hbm/render/anim/AnimationLoader.java | 72 ++- .../hbm/render/anim/BusAnimationKeyframe.java | 547 +++++++++++++++++- .../hbm/render/anim/BusAnimationSequence.java | 22 +- 4 files changed, 598 insertions(+), 43 deletions(-) diff --git a/ntm-animator.blend b/ntm-animator.blend index 252086d2796f63c88c44c762fb86322434eec3e6..6b88f25a523016862059b0cf10a74ec71fb1b7f1 100644 GIT binary patch delta 149021 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 offsets = new HashMap(); - for (Map.Entry root : json.getAsJsonObject("offset").entrySet()) { + for(Map.Entry root : json.getAsJsonObject("offset").entrySet()) { double[] offset = new double[3]; - for (int i = 0; i < 3; i++) { + for(int i = 0; i < 3; i++) { offset[i] = root.getValue().getAsJsonArray().get(i).getAsDouble(); } @@ -61,12 +63,12 @@ public class AnimationLoader { // Top level parsing, this is for the animation name as set in Blender - for (Map.Entry root : json.getAsJsonObject("anim").entrySet()) { + for(Map.Entry root : json.getAsJsonObject("anim").entrySet()) { BusAnimation animation = new BusAnimation(); // Loading the buses for this animation JsonObject entryObject = root.getValue().getAsJsonObject(); - for (Map.Entry model : entryObject.entrySet()) { + for(Map.Entry model : entryObject.entrySet()) { String modelName = model.getKey(); double[] offset = new double[3]; if (offsets.containsKey(modelName)) offset = offsets.get(modelName); @@ -83,46 +85,46 @@ public class AnimationLoader { BusAnimationSequence sequence = new BusAnimationSequence(); // Location fcurves - if (json.has("location")) { + if(json.has("location")) { JsonObject location = json.getAsJsonObject("location"); - if (location.has("x")) { + if(location.has("x")) { addToSequence(sequence, Dimension.TX, location.getAsJsonArray("x")); } - if (location.has("y")) { + if(location.has("y")) { addToSequence(sequence, Dimension.TY, location.getAsJsonArray("y")); } - if (location.has("z")) { + if(location.has("z")) { addToSequence(sequence, Dimension.TZ, location.getAsJsonArray("z")); } } // Rotation fcurves, only euler at the moment - if (json.has("rotation_euler")) { + if(json.has("rotation_euler")) { JsonObject rotation = json.getAsJsonObject("rotation_euler"); - if (rotation.has("x")) { + if(rotation.has("x")) { addToSequence(sequence, Dimension.RX, rotation.getAsJsonArray("x")); } - if (rotation.has("y")) { + if(rotation.has("y")) { addToSequence(sequence, Dimension.RY, rotation.getAsJsonArray("y")); } - if (rotation.has("z")) { + if(rotation.has("z")) { addToSequence(sequence, Dimension.RZ, rotation.getAsJsonArray("z")); } } // Scale fcurves - if (json.has("scale")) { + if(json.has("scale")) { JsonObject scale = json.getAsJsonObject("scale"); - if (scale.has("x")) { + if(scale.has("x")) { addToSequence(sequence, Dimension.SX, scale.getAsJsonArray("x")); } - if (scale.has("y")) { + if(scale.has("y")) { addToSequence(sequence, Dimension.SY, scale.getAsJsonArray("y")); } - if (scale.has("z")) { + if(scale.has("z")) { addToSequence(sequence, Dimension.SZ, scale.getAsJsonArray("z")); } } @@ -133,19 +135,49 @@ public class AnimationLoader { } private static void addToSequence(BusAnimationSequence sequence, Dimension dimension, JsonArray array) { - for (JsonElement element : array) { - sequence.addKeyframe(dimension, loadKeyframe(element)); + IType prevInterp = null; + for(JsonElement element : array) { + BusAnimationKeyframe keyframe = loadKeyframe(element, prevInterp); + prevInterp = keyframe.interpolationType; + sequence.addKeyframe(dimension, keyframe); } } - private static BusAnimationKeyframe loadKeyframe(JsonElement element) { + private static BusAnimationKeyframe loadKeyframe(JsonElement element, IType prevInterp) { JsonArray array = element.getAsJsonArray(); double value = array.get(0).getAsDouble(); int duration = array.get(1).getAsInt(); IType interpolation = array.size() >= 3 ? IType.valueOf(array.get(2).getAsString()) : IType.LINEAR; + EType easing = array.size() >= 4 ? EType.valueOf(array.get(3).getAsString()) : EType.AUTO; - return new BusAnimationKeyframe(value, duration, interpolation); + BusAnimationKeyframe keyframe = new BusAnimationKeyframe(value, duration, interpolation, easing); + + int i = 4; + + if(prevInterp == IType.BEZIER) { + keyframe.leftX = array.get(i++).getAsDouble(); + keyframe.leftY = array.get(i++).getAsDouble(); + keyframe.leftType = HType.valueOf(array.get(i++).getAsString()); + } + + if(interpolation == IType.LINEAR || interpolation == IType.CONSTANT) + return keyframe; + + if(interpolation == IType.BEZIER) { + keyframe.rightX = array.get(i++).getAsDouble(); + keyframe.rightY = array.get(i++).getAsDouble(); + keyframe.rightType = HType.valueOf(array.get(i++).getAsString()); + } + + if(interpolation == IType.ELASTIC) { + keyframe.amplitude = array.get(i++).getAsDouble(); + keyframe.period = array.get(i++).getAsDouble(); + } else if(interpolation == IType.BACK) { + keyframe.back = array.get(i++).getAsDouble(); + } + + return keyframe; } } diff --git a/src/main/java/com/hbm/render/anim/BusAnimationKeyframe.java b/src/main/java/com/hbm/render/anim/BusAnimationKeyframe.java index 8762d0d42..9c24d1299 100644 --- a/src/main/java/com/hbm/render/anim/BusAnimationKeyframe.java +++ b/src/main/java/com/hbm/render/anim/BusAnimationKeyframe.java @@ -2,10 +2,10 @@ package com.hbm.render.anim; //"pieces" that make up a bus public class BusAnimationKeyframe { - - //whether the next frame "snaps" to the intended value or has interpolation - //it's an enum so stuff like accelerated animations between just - //two frames could be implemented + + // whether the next frame "snaps" to the intended value or has interpolation + // it's an enum so stuff like accelerated animations between just + // two frames could be implemented public static enum IType { /** Teleport */ CONSTANT, @@ -17,17 +17,68 @@ public class BusAnimationKeyframe { SIN_DOWN, /** "Sine wave", first half of a sine peak, accelerating up and then decelerating, makes for smooth movement */ SIN_FULL, + + // blender magic curves + BEZIER, + + // blender inertial + SINE, + QUAD, + CUBIC, + QUART, + QUINT, + EXPO, + CIRC, + + // blendor dynamic + BOUNCE, + ELASTIC, + BACK, + } + + // Easing + public static enum EType { + AUTO, + EASE_IN, + EASE_OUT, + EASE_IN_OUT, + } + + // Handle type + public static enum HType { + FREE, + ALIGNED, + VECTOR, + AUTO, + AUTO_CLAMPED, } public double value; public IType interpolationType; + public EType easingType; public int duration; - - //this one can be used for "reset" type keyframes + + // bezier handles + public double leftX; + public double leftY; + public HType leftType; + public double rightX; + public double rightY; + public HType rightType; + + // elastics + public double amplitude; + public double period; + + // back (overshoot) + public double back; + + // this one can be used for "reset" type keyframes public BusAnimationKeyframe() { this.value = 0; this.duration = 1; this.interpolationType = IType.LINEAR; + this.easingType = EType.AUTO; } public BusAnimationKeyframe(double value, int duration) { @@ -41,4 +92,488 @@ public class BusAnimationKeyframe { this.interpolationType = interpolation; } + public BusAnimationKeyframe(double value, int duration, IType interpolation, EType easing) { + this(value, duration, interpolation); + this.easingType = easing; + } + + public double interpolate(double startTime, double currentTime, BusAnimationKeyframe previous) { + if(previous == null) + previous = new BusAnimationKeyframe(); + + double a = value; + double b = previous.value; + double t = time(startTime, currentTime, duration); + + double begin = previous.value; + double change = value - previous.value; + double time = currentTime - startTime; + + if(previous.interpolationType == IType.BEZIER) { + double v1x = startTime; + double v1y = previous.value; + double v2x = previous.rightX; + double v2y = previous.rightY; + + double v3x = leftX; + double v3y = leftY; + double v4x = startTime + duration; + double v4y = value; + + double curveT = findZero(currentTime, v1x, v2x, v3x, v4x); + return cubicBezier(v1y, v2y, v3y, v4y, curveT); + } else if(previous.interpolationType == IType.BACK) { + switch (previous.easingType) { + case EASE_IN: return BLI_easing_back_ease_in(time, begin, change, duration, previous.back); + case EASE_IN_OUT: return BLI_easing_back_ease_in_out(time, begin, change, duration, previous.back); + default: return BLI_easing_back_ease_out(time, begin, change, duration, previous.back); + } + } else if(previous.interpolationType == IType.BOUNCE) { + switch (previous.easingType) { + case EASE_IN: return BLI_easing_bounce_ease_in(time, begin, change, duration); + case EASE_IN_OUT: return BLI_easing_bounce_ease_in_out(time, begin, change, duration); + default: return BLI_easing_bounce_ease_out(time, begin, change, duration); + } + } else if(previous.interpolationType == IType.CIRC) { + switch (previous.easingType) { + case EASE_OUT: return BLI_easing_circ_ease_out(time, begin, change, duration); + case EASE_IN_OUT: return BLI_easing_circ_ease_in_out(time, begin, change, duration); + default: return BLI_easing_circ_ease_in(time, begin, change, duration); + } + } else if(previous.interpolationType == IType.CUBIC) { + switch (previous.easingType) { + case EASE_OUT: return BLI_easing_cubic_ease_out(time, begin, change, duration); + case EASE_IN_OUT: return BLI_easing_cubic_ease_in_out(time, begin, change, duration); + default: return BLI_easing_cubic_ease_in(time, begin, change, duration); + } + } else if(previous.interpolationType == IType.ELASTIC) { + switch (previous.easingType) { + case EASE_IN: return BLI_easing_elastic_ease_in(time, begin, change, duration, previous.amplitude, previous.period); + case EASE_IN_OUT: return BLI_easing_elastic_ease_in_out(time, begin, change, duration, previous.amplitude, previous.period); + default: return BLI_easing_elastic_ease_out(time, begin, change, duration, previous.amplitude, previous.period); + } + } else if(previous.interpolationType == IType.EXPO) { + switch (previous.easingType) { + case EASE_OUT: return BLI_easing_expo_ease_out(time, begin, change, duration); + case EASE_IN_OUT: return BLI_easing_expo_ease_in_out(time, begin, change, duration); + default: return BLI_easing_expo_ease_in(time, begin, change, duration); + } + } else if(previous.interpolationType == IType.QUAD) { + switch (previous.easingType) { + case EASE_OUT: return BLI_easing_quad_ease_out(time, begin, change, duration); + case EASE_IN_OUT: return BLI_easing_quad_ease_in_out(time, begin, change, duration); + default: return BLI_easing_quad_ease_in(time, begin, change, duration); + } + } else if(previous.interpolationType == IType.QUART) { + switch (previous.easingType) { + case EASE_OUT: return BLI_easing_quart_ease_out(time, begin, change, duration); + case EASE_IN_OUT: return BLI_easing_quart_ease_in_out(time, begin, change, duration); + default: return BLI_easing_quart_ease_in(time, begin, change, duration); + } + } else if(previous.interpolationType == IType.QUINT) { + switch (previous.easingType) { + case EASE_OUT: return BLI_easing_quint_ease_out(time, begin, change, duration); + case EASE_IN_OUT: return BLI_easing_quint_ease_in_out(time, begin, change, duration); + default: return BLI_easing_quint_ease_in(time, begin, change, duration); + } + } else if(previous.interpolationType == IType.SINE) { + switch (previous.easingType) { + case EASE_OUT: return BLI_easing_sine_ease_out(time, begin, change, duration); + case EASE_IN_OUT: return BLI_easing_sine_ease_in_out(time, begin, change, duration); + default: return BLI_easing_sine_ease_in(time, begin, change, duration); + } + } + + return (a - b) * t + b; + } + + private double sqrt3(double d) { + return Math.exp(Math.log(d) / 3.0); + } + + private double time(double start, double end, double duration) { + if(interpolationType == IType.SIN_UP) return -Math.sin(((end - start) / duration * Math.PI + Math.PI) / 2) + 1; + if(interpolationType == IType.SIN_DOWN) return Math.sin((end - start) / duration * Math.PI / 2); + if(interpolationType == IType.SIN_FULL) return (-Math.cos((end - start) / duration * Math.PI) + 1) / 2D; + return (end - start) / duration; + } + + // Blender bezier solvers, but rewritten (pain) + private double solveCubic(double c0, double c1, double c2, double c3) { + if(c3 != 0) { + double a = c2 / c3; + double b = c1 / c3; + double c = c0 / c3; + a = a / 3; + + double p = b / 3 - a * a; + double q = (2 * a * a * a - a * b + c) / 2; + double d = q * q + p * p * p; + + if(d > 0) { + double t = Math.sqrt(d); + return sqrt3(-q + t) + sqrt3(-q - t) - a; + } + + if(d == 0) { + double t = sqrt3(-q); + double result = 2 * t - a; + if(result < 0.000001 || result > 1.000001) { + result = -t - a; + } + return result; + } + + double phi = Math.acos(-q / Math.sqrt(-(p * p * p))); + double t = Math.sqrt(-p); + p = Math.cos(phi / 3); + q = Math.sqrt(3 - 3 * p * p); + double result = 2 * t * p - a; + if(result < 0.000001 || result > 1.000001) { + result = -t * (p + q) - a; + } + if(result < 0.000001 || result > 1.000001) { + result = -t * (p - q) - a; + } + return result; + } + + double a = c2; + double b = c1; + double c = c0; + + if(a != 0) { + double p = b * b - 4 * a * c; + + if(p > 0) { + p = Math.sqrt(p); + double result = (-b - p) / (2 * a); + if(result < 0.000001 || result > 1.000001) { + result = (-b + p) / (2 * a); + } + return result; + } + + if(p == 0) { + return -b / (2 * a); + } + } + + if(b != 0) { + return -c / b; + } + + if(c == 0) { + return 0; + } + + return 0; + } + + private double findZero(double t, double x1, double x2, double x3, double x4) { + double c0 = x1 - t; + double c1 = 3.0f * (x2 - x1); + double c2 = 3.0f * (x1 - 2.0f * x2 + x3); + double c3 = x4 - x1 + 3.0f * (x2 - x3); + + return solveCubic(c0, c1, c2, c3); + } + + private double cubicBezier(double y1, double y2, double y3, double y4, double t) { + double c0 = y1; + double c1 = 3.0f * (y2 - y1); + double c2 = 3.0f * (y1 - 2.0f * y2 + y3); + double c3 = y4 - y1 + 3.0f * (y2 - y3); + + return c0 + t * c1 + t * t * c2 + t * t * t * c3; + } + + /** + * EASING FUNCTIONS, taken directly from Blender `easing.c` + */ + + double BLI_easing_back_ease_in(double time, double begin, double change, double duration, double overshoot) { + time /= duration; + return change * time * time * ((overshoot + 1) * time - overshoot) + begin; + } + + double BLI_easing_back_ease_out(double time, double begin, double change, double duration, double overshoot) { + time = time / duration - 1; + return change * (time * time * ((overshoot + 1) * time + overshoot) + 1) + begin; + } + + double BLI_easing_back_ease_in_out(double time, double begin, double change, double duration, double overshoot) { + overshoot *= 1.525f; + if((time /= duration / 2) < 1.0f) { + return change / 2 * (time * time * ((overshoot + 1) * time - overshoot)) + begin; + } + time -= 2.0f; + return change / 2 * (time * time * ((overshoot + 1) * time + overshoot) + 2) + begin; + } + + double BLI_easing_bounce_ease_out(double time, double begin, double change, double duration) { + time /= duration; + if(time < (1 / 2.75f)) { + return change * (7.5625f * time * time) + begin; + } + if(time < (2 / 2.75f)) { + time -= (1.5f / 2.75f); + return change * ((7.5625f * time) * time + 0.75f) + begin; + } + if(time < (2.5f / 2.75f)) { + time -= (2.25f / 2.75f); + return change * ((7.5625f * time) * time + 0.9375f) + begin; + } + time -= (2.625f / 2.75f); + return change * ((7.5625f * time) * time + 0.984375f) + begin; + } + + double BLI_easing_bounce_ease_in(double time, double begin, double change, double duration) { + return change - BLI_easing_bounce_ease_out(duration - time, 0, change, duration) + begin; + } + + double BLI_easing_bounce_ease_in_out(double time, double begin, double change, double duration) { + if(time < duration / 2) { + return BLI_easing_bounce_ease_in(time * 2, 0, change, duration) * 0.5f + begin; + } + return BLI_easing_bounce_ease_out(time * 2 - duration, 0, change, duration) * 0.5f + change * 0.5f + begin; + } + + double BLI_easing_circ_ease_in(double time, double begin, double change, double duration) { + time /= duration; + return -change * (Math.sqrt(1 - time * time) - 1) + begin; + } + + double BLI_easing_circ_ease_out(double time, double begin, double change, double duration) { + time = time / duration - 1; + return change * Math.sqrt(1 - time * time) + begin; + } + + double BLI_easing_circ_ease_in_out(double time, double begin, double change, double duration) { + if((time /= duration / 2) < 1.0f) { + return -change / 2 * (Math.sqrt(1 - time * time) - 1) + begin; + } + time -= 2.0f; + return change / 2 * (Math.sqrt(1 - time * time) + 1) + begin; + } + + double BLI_easing_cubic_ease_in(double time, double begin, double change, double duration) { + time /= duration; + return change * time * time * time + begin; + } + + double BLI_easing_cubic_ease_out(double time, double begin, double change, double duration) { + time = time / duration - 1; + return change * (time * time * time + 1) + begin; + } + + double BLI_easing_cubic_ease_in_out(double time, double begin, double change, double duration) { + if((time /= duration / 2) < 1.0f) { + return change / 2 * time * time * time + begin; + } + time -= 2.0f; + return change / 2 * (time * time * time + 2) + begin; + } + + double elastic_blend(double time, double change, double duration, double amplitude, double s, double f) { + if(change != 0) { + /* + * Looks like a magic number, + * but this is a part of the sine curve we need to blend from + */ + double t = Math.abs(s); + if(amplitude != 0) { + f *= amplitude / Math.abs(change); + } else { + f = 0.0f; + } + + if(Math.abs(time * duration) < t) { + double l = Math.abs(time * duration) / t; + f = (f * l) + (1.0f - l); + } + } + + return f; + } + + double BLI_easing_elastic_ease_in(double time, double begin, double change, double duration, double amplitude, double period) { + double s; + double f = 1.0f; + + if(time == 0.0f) { + return begin; + } + + if((time /= duration) == 1.0f) { + return begin + change; + } + time -= 1.0f; + if(period == 0) { + period = duration * 0.3f; + } + if(amplitude == 0 || amplitude < Math.abs(change)) { + s = period / 4; + f = elastic_blend(time, change, duration, amplitude, s, f); + amplitude = change; + } else { + s = period / (2 * (double) Math.PI) * Math.asin(change / amplitude); + } + + return (-f * (amplitude * Math.pow(2, 10 * time) * Math.sin((time * duration - s) * (2 * (double) Math.PI) / period))) + begin; + } + + double BLI_easing_elastic_ease_out(double time, double begin, double change, double duration, double amplitude, double period) { + double s; + double f = 1.0f; + + if(time == 0.0f) { + return begin; + } + if((time /= duration) == 1.0f) { + return begin + change; + } + time = -time; + if(period == 0) { + period = duration * 0.3f; + } + if(amplitude == 0 || amplitude < Math.abs(change)) { + s = period / 4; + f = elastic_blend(time, change, duration, amplitude, s, f); + amplitude = change; + } else { + s = period / (2 * (double) Math.PI) * Math.asin(change / amplitude); + } + + return (f * (amplitude * Math.pow(2, 10 * time) * Math.sin((time * duration - s) * (2 * (double) Math.PI) / period))) + change + begin; + } + + double BLI_easing_elastic_ease_in_out(double time, double begin, double change, double duration, double amplitude, double period) { + double s; + double f = 1.0f; + + if(time == 0.0f) { + return begin; + } + if((time /= duration / 2) == 2.0f) { + return begin + change; + } + time -= 1.0f; + if(period == 0) { + period = duration * (0.3f * 1.5f); + } + if(amplitude == 0 || amplitude < Math.abs(change)) { + s = period / 4; + f = elastic_blend(time, change, duration, amplitude, s, f); + amplitude = change; + } else { + s = period / (2 * (double) Math.PI) * Math.asin(change / amplitude); + } + + if(time < 0.0f) { + f *= -0.5f; + return (f * (amplitude * Math.pow(2, 10 * time) * Math.sin((time * duration - s) * (2 * (double) Math.PI) / period))) + begin; + } + + time = -time; + f *= 0.5f; + return (f * (amplitude * Math.pow(2, 10 * time) * Math.sin((time * duration - s) * (2 * (double) Math.PI) / period))) + change + begin; + } + + static final double pow_min = 0.0009765625f; /* = 2^(-10) */ + static final double pow_scale = 1.0f / (1.0f - 0.0009765625f); + + double BLI_easing_expo_ease_in(double time, double begin, double change, double duration) { + if(time == 0.0) { + return begin; + } + return change * (Math.pow(2, 10 * (time / duration - 1)) - pow_min) * pow_scale + begin; + } + + double BLI_easing_expo_ease_out(double time, double begin, double change, double duration) { + if(time == 0.0) { + return begin; + } + return change * (1 - (Math.pow(2, -10 * time / duration) - pow_min) * pow_scale) + begin; + } + + double BLI_easing_expo_ease_in_out(double time, double begin, double change, double duration) { + double duration_half = duration / 2.0f; + double change_half = change / 2.0f; + if(time <= duration_half) { + return BLI_easing_expo_ease_in(time, begin, change_half, duration_half); + } + return BLI_easing_expo_ease_out(time - duration_half, begin + change_half, change_half, duration_half); + } + + double BLI_easing_linear_ease(double time, double begin, double change, double duration) { + return change * time / duration + begin; + } + + double BLI_easing_quad_ease_in(double time, double begin, double change, double duration) { + time /= duration; + return change * time * time + begin; + } + + double BLI_easing_quad_ease_out(double time, double begin, double change, double duration) { + time /= duration; + return -change * time * (time - 2) + begin; + } + + double BLI_easing_quad_ease_in_out(double time, double begin, double change, double duration) { + if((time /= duration / 2) < 1.0f) { + return change / 2 * time * time + begin; + } + time -= 1.0f; + return -change / 2 * (time * (time - 2) - 1) + begin; + } + + double BLI_easing_quart_ease_in(double time, double begin, double change, double duration) { + time /= duration; + return change * time * time * time * time + begin; + } + + double BLI_easing_quart_ease_out(double time, double begin, double change, double duration) { + time = time / duration - 1; + return -change * (time * time * time * time - 1) + begin; + } + + double BLI_easing_quart_ease_in_out(double time, double begin, double change, double duration) { + if((time /= duration / 2) < 1.0f) { + return change / 2 * time * time * time * time + begin; + } + time -= 2.0f; + return -change / 2 * (time * time * time * time - 2) + begin; + } + + double BLI_easing_quint_ease_in(double time, double begin, double change, double duration) { + time /= duration; + return change * time * time * time * time * time + begin; + } + + double BLI_easing_quint_ease_out(double time, double begin, double change, double duration) { + time = time / duration - 1; + return change * (time * time * time * time * time + 1) + begin; + } + + double BLI_easing_quint_ease_in_out(double time, double begin, double change, double duration) { + if((time /= duration / 2) < 1.0f) { + return change / 2 * time * time * time * time * time + begin; + } + time -= 2.0f; + return change / 2 * (time * time * time * time * time + 2) + begin; + } + + double BLI_easing_sine_ease_in(double time, double begin, double change, double duration) { + return -change * Math.cos(time / duration * (double) Math.PI * 2) + change + begin; + } + + double BLI_easing_sine_ease_out(double time, double begin, double change, double duration) { + return change * Math.sin(time / duration * (double) Math.PI * 2) + begin; + } + + double BLI_easing_sine_ease_in_out(double time, double begin, double change, double duration) { + return -change / 2 * (Math.cos((double) Math.PI * time / duration) - 1) + begin; + } + } diff --git a/src/main/java/com/hbm/render/anim/BusAnimationSequence.java b/src/main/java/com/hbm/render/anim/BusAnimationSequence.java index 0a08dad9d..db89a2974 100644 --- a/src/main/java/com/hbm/render/anim/BusAnimationSequence.java +++ b/src/main/java/com/hbm/render/anim/BusAnimationSequence.java @@ -29,7 +29,7 @@ public class BusAnimationSequence { public BusAnimationSequence() { // Initialise our keyframe storage, since it's multidimensional - for (int i = 0; i < 9; i++) { + for(int i = 0; i < 9; i++) { transformKeyframes.add(new ArrayList()); } } @@ -70,7 +70,7 @@ public class BusAnimationSequence { public double[] getTransformation(int millis) { double[] transform = new double[12]; - for (int i = 0; i < 9; i++) { + for(int i = 0; i < 9; i++) { List keyframes = transformKeyframes.get(i); BusAnimationKeyframe currentFrame = null; @@ -102,11 +102,7 @@ public class BusAnimationSequence { continue; } - double a = currentFrame.value; - double b = previousFrame != null ? previousFrame.value : 0; - double t = interpolate(startTime, millis, currentFrame.duration, currentFrame.interpolationType); - - transform[i] = (a - b) * t + b; + transform[i] = currentFrame.interpolate(startTime, millis, previousFrame); } transform[9] = offset[0]; @@ -116,20 +112,12 @@ public class BusAnimationSequence { return transform; } - public double interpolate(double start, double end, double duration, IType interp) { - if(interp == IType.LINEAR) return (end - start) / duration; - if(interp == IType.SIN_UP) return -Math.sin(((end - start) / duration * Math.PI + Math.PI) / 2) + 1; - if(interp == IType.SIN_DOWN) return Math.sin((end - start) / duration * Math.PI / 2); - if(interp == IType.SIN_FULL) return (-Math.cos((end - start) / duration * Math.PI) + 1) / 2D; - return end - start; - } - public int getTotalTime() { int highestTime = 0; - for (List keyframes: transformKeyframes) { + for(List keyframes : transformKeyframes) { int time = 0; - for (BusAnimationKeyframe frame: keyframes) { + for(BusAnimationKeyframe frame : keyframes) { time += frame.duration; } From 142fec169ef83af604c23d44cff3eaaea0d69b91 Mon Sep 17 00:00:00 2001 From: George Paton Date: Tue, 8 Oct 2024 19:10:17 +1100 Subject: [PATCH 2/2] taces -> spabs --- .../com/hbm/render/anim/AnimationLoader.java | 248 +++++++++--------- 1 file changed, 124 insertions(+), 124 deletions(-) diff --git a/src/main/java/com/hbm/render/anim/AnimationLoader.java b/src/main/java/com/hbm/render/anim/AnimationLoader.java index dfa2ec0eb..1b23e2941 100644 --- a/src/main/java/com/hbm/render/anim/AnimationLoader.java +++ b/src/main/java/com/hbm/render/anim/AnimationLoader.java @@ -21,163 +21,163 @@ import com.hbm.render.anim.BusAnimationSequence.Dimension; public class AnimationLoader { - // The collada loader is great, but is not so backwards compatible and spews keyframes rather than doing interpolation - // Yeah - more animation loading is not so great, but 3mb for a single door opening is maybe overkill on a 50mb mod - // and even though the format supports multiple animations, no fucking animation software will actually export multiple animations, - // (even though blender even has a fucking toggle for it, but it doesn't _do_ anything) - // This instead just loads transformation data from a JSON file, turning it into a set of BusAnimations - // See ntm-animator.blend for a JSON format creation script + // The collada loader is great, but is not so backwards compatible and spews keyframes rather than doing interpolation + // Yeah - more animation loading is not so great, but 3mb for a single door opening is maybe overkill on a 50mb mod + // and even though the format supports multiple animations, no fucking animation software will actually export multiple animations, + // (even though blender even has a fucking toggle for it, but it doesn't _do_ anything) + // This instead just loads transformation data from a JSON file, turning it into a set of BusAnimations + // See ntm-animator.blend for a JSON format creation script - // "How do I make animations?" - // See ntm-animator.blend, it has the Colt/Python already setup and animated as an example, it'll generate JSON data that this can load + // "How do I make animations?" + // See ntm-animator.blend, it has the Colt/Python already setup and animated as an example, it'll generate JSON data that this can load public static final Gson gson = new Gson(); - public static HashMap load(ResourceLocation file) { - HashMap animations = new HashMap(); + public static HashMap load(ResourceLocation file) { + HashMap animations = new HashMap(); - InputStream in; - try { - in = Minecraft.getMinecraft().getResourceManager().getResource(file).getInputStream(); - } catch (IOException ex) { - return null; - } + InputStream in; + try { + in = Minecraft.getMinecraft().getResourceManager().getResource(file).getInputStream(); + } catch (IOException ex) { + return null; + } - InputStreamReader reader = new InputStreamReader(in); - JsonObject json = gson.fromJson(reader, JsonObject.class); + InputStreamReader reader = new InputStreamReader(in); + JsonObject json = gson.fromJson(reader, JsonObject.class); - // Load our model offsets, we'll place these into all the sequences that share the name of the offset - // The offsets are only required when sequences are played for an object, which is why we don't globally offset! The obj rendering handles the non-animated case fine - // Effectively, this removes double translation AND ensures that rotations occur around the individual object origin, rather than the weapon origin - HashMap offsets = new HashMap(); - for(Map.Entry root : json.getAsJsonObject("offset").entrySet()) { - double[] offset = new double[3]; + // Load our model offsets, we'll place these into all the sequences that share the name of the offset + // The offsets are only required when sequences are played for an object, which is why we don't globally offset! The obj rendering handles the non-animated case fine + // Effectively, this removes double translation AND ensures that rotations occur around the individual object origin, rather than the weapon origin + HashMap offsets = new HashMap(); + for(Map.Entry root : json.getAsJsonObject("offset").entrySet()) { + double[] offset = new double[3]; - for(int i = 0; i < 3; i++) { - offset[i] = root.getValue().getAsJsonArray().get(i).getAsDouble(); - } + for(int i = 0; i < 3; i++) { + offset[i] = root.getValue().getAsJsonArray().get(i).getAsDouble(); + } - offsets.put(root.getKey(), offset); - } + offsets.put(root.getKey(), offset); + } - // Top level parsing, this is for the animation name as set in Blender - for(Map.Entry root : json.getAsJsonObject("anim").entrySet()) { - BusAnimation animation = new BusAnimation(); + // Top level parsing, this is for the animation name as set in Blender + for(Map.Entry root : json.getAsJsonObject("anim").entrySet()) { + BusAnimation animation = new BusAnimation(); - // Loading the buses for this animation - JsonObject entryObject = root.getValue().getAsJsonObject(); - for(Map.Entry model : entryObject.entrySet()) { - String modelName = model.getKey(); - double[] offset = new double[3]; - if (offsets.containsKey(modelName)) offset = offsets.get(modelName); - animation.addBus(modelName, loadSequence(model.getValue().getAsJsonObject(), offset)); - } + // Loading the buses for this animation + JsonObject entryObject = root.getValue().getAsJsonObject(); + for(Map.Entry model : entryObject.entrySet()) { + String modelName = model.getKey(); + double[] offset = new double[3]; + if (offsets.containsKey(modelName)) offset = offsets.get(modelName); + animation.addBus(modelName, loadSequence(model.getValue().getAsJsonObject(), offset)); + } - animations.put(root.getKey(), animation); - } + animations.put(root.getKey(), animation); + } - return animations; - } + return animations; + } - private static BusAnimationSequence loadSequence(JsonObject json, double[] offset) { - BusAnimationSequence sequence = new BusAnimationSequence(); + private static BusAnimationSequence loadSequence(JsonObject json, double[] offset) { + BusAnimationSequence sequence = new BusAnimationSequence(); - // Location fcurves - if(json.has("location")) { - JsonObject location = json.getAsJsonObject("location"); + // Location fcurves + if(json.has("location")) { + JsonObject location = json.getAsJsonObject("location"); - if(location.has("x")) { - addToSequence(sequence, Dimension.TX, location.getAsJsonArray("x")); - } - if(location.has("y")) { - addToSequence(sequence, Dimension.TY, location.getAsJsonArray("y")); - } - if(location.has("z")) { - addToSequence(sequence, Dimension.TZ, location.getAsJsonArray("z")); - } - } + if(location.has("x")) { + addToSequence(sequence, Dimension.TX, location.getAsJsonArray("x")); + } + if(location.has("y")) { + addToSequence(sequence, Dimension.TY, location.getAsJsonArray("y")); + } + if(location.has("z")) { + addToSequence(sequence, Dimension.TZ, location.getAsJsonArray("z")); + } + } - // Rotation fcurves, only euler at the moment - if(json.has("rotation_euler")) { - JsonObject rotation = json.getAsJsonObject("rotation_euler"); + // Rotation fcurves, only euler at the moment + if(json.has("rotation_euler")) { + JsonObject rotation = json.getAsJsonObject("rotation_euler"); - if(rotation.has("x")) { - addToSequence(sequence, Dimension.RX, rotation.getAsJsonArray("x")); - } - if(rotation.has("y")) { - addToSequence(sequence, Dimension.RY, rotation.getAsJsonArray("y")); - } - if(rotation.has("z")) { - addToSequence(sequence, Dimension.RZ, rotation.getAsJsonArray("z")); - } - } + if(rotation.has("x")) { + addToSequence(sequence, Dimension.RX, rotation.getAsJsonArray("x")); + } + if(rotation.has("y")) { + addToSequence(sequence, Dimension.RY, rotation.getAsJsonArray("y")); + } + if(rotation.has("z")) { + addToSequence(sequence, Dimension.RZ, rotation.getAsJsonArray("z")); + } + } - // Scale fcurves - if(json.has("scale")) { - JsonObject scale = json.getAsJsonObject("scale"); + // Scale fcurves + if(json.has("scale")) { + JsonObject scale = json.getAsJsonObject("scale"); - if(scale.has("x")) { - addToSequence(sequence, Dimension.SX, scale.getAsJsonArray("x")); - } - if(scale.has("y")) { - addToSequence(sequence, Dimension.SY, scale.getAsJsonArray("y")); - } - if(scale.has("z")) { - addToSequence(sequence, Dimension.SZ, scale.getAsJsonArray("z")); - } - } + if(scale.has("x")) { + addToSequence(sequence, Dimension.SX, scale.getAsJsonArray("x")); + } + if(scale.has("y")) { + addToSequence(sequence, Dimension.SY, scale.getAsJsonArray("y")); + } + if(scale.has("z")) { + addToSequence(sequence, Dimension.SZ, scale.getAsJsonArray("z")); + } + } - sequence.offset = offset; + sequence.offset = offset; - return sequence; - } + return sequence; + } - private static void addToSequence(BusAnimationSequence sequence, Dimension dimension, JsonArray array) { - IType prevInterp = null; - for(JsonElement element : array) { - BusAnimationKeyframe keyframe = loadKeyframe(element, prevInterp); - prevInterp = keyframe.interpolationType; - sequence.addKeyframe(dimension, keyframe); - } - } + private static void addToSequence(BusAnimationSequence sequence, Dimension dimension, JsonArray array) { + IType prevInterp = null; + for(JsonElement element : array) { + BusAnimationKeyframe keyframe = loadKeyframe(element, prevInterp); + prevInterp = keyframe.interpolationType; + sequence.addKeyframe(dimension, keyframe); + } + } - private static BusAnimationKeyframe loadKeyframe(JsonElement element, IType prevInterp) { - JsonArray array = element.getAsJsonArray(); + private static BusAnimationKeyframe loadKeyframe(JsonElement element, IType prevInterp) { + JsonArray array = element.getAsJsonArray(); - double value = array.get(0).getAsDouble(); - int duration = array.get(1).getAsInt(); - IType interpolation = array.size() >= 3 ? IType.valueOf(array.get(2).getAsString()) : IType.LINEAR; - EType easing = array.size() >= 4 ? EType.valueOf(array.get(3).getAsString()) : EType.AUTO; + double value = array.get(0).getAsDouble(); + int duration = array.get(1).getAsInt(); + IType interpolation = array.size() >= 3 ? IType.valueOf(array.get(2).getAsString()) : IType.LINEAR; + EType easing = array.size() >= 4 ? EType.valueOf(array.get(3).getAsString()) : EType.AUTO; - BusAnimationKeyframe keyframe = new BusAnimationKeyframe(value, duration, interpolation, easing); + BusAnimationKeyframe keyframe = new BusAnimationKeyframe(value, duration, interpolation, easing); - int i = 4; + int i = 4; - if(prevInterp == IType.BEZIER) { - keyframe.leftX = array.get(i++).getAsDouble(); - keyframe.leftY = array.get(i++).getAsDouble(); - keyframe.leftType = HType.valueOf(array.get(i++).getAsString()); - } + if(prevInterp == IType.BEZIER) { + keyframe.leftX = array.get(i++).getAsDouble(); + keyframe.leftY = array.get(i++).getAsDouble(); + keyframe.leftType = HType.valueOf(array.get(i++).getAsString()); + } - if(interpolation == IType.LINEAR || interpolation == IType.CONSTANT) - return keyframe; + if(interpolation == IType.LINEAR || interpolation == IType.CONSTANT) + return keyframe; - if(interpolation == IType.BEZIER) { - keyframe.rightX = array.get(i++).getAsDouble(); - keyframe.rightY = array.get(i++).getAsDouble(); - keyframe.rightType = HType.valueOf(array.get(i++).getAsString()); - } + if(interpolation == IType.BEZIER) { + keyframe.rightX = array.get(i++).getAsDouble(); + keyframe.rightY = array.get(i++).getAsDouble(); + keyframe.rightType = HType.valueOf(array.get(i++).getAsString()); + } - if(interpolation == IType.ELASTIC) { - keyframe.amplitude = array.get(i++).getAsDouble(); - keyframe.period = array.get(i++).getAsDouble(); - } else if(interpolation == IType.BACK) { - keyframe.back = array.get(i++).getAsDouble(); - } + if(interpolation == IType.ELASTIC) { + keyframe.amplitude = array.get(i++).getAsDouble(); + keyframe.period = array.get(i++).getAsDouble(); + } else if(interpolation == IType.BACK) { + keyframe.back = array.get(i++).getAsDouble(); + } - return keyframe; - } + return keyframe; + } }