From 955bb83d88469b0c1c63660f2ca0e60ee3c168a4 Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 28 Aug 2023 06:08:39 -0400 Subject: [PATCH] Merge some features from https://github.com/FiguraMC/Figura/pull/41 (Note, currently missing documentation) --- .../figuramc/figura/animation/Animation.java | 30 ++++++++- .../figuramc/figura/animation/Keyframe.java | 67 ++++++++++++++----- .../avatar/local/LocalAvatarFetcher.java | 2 +- .../figuramc/figura/lua/FiguraAPIManager.java | 4 ++ .../figura/lua/docs/FiguraDocsManager.java | 5 +- 5 files changed, 90 insertions(+), 18 deletions(-) diff --git a/common/src/main/java/org/figuramc/figura/animation/Animation.java b/common/src/main/java/org/figuramc/figura/animation/Animation.java index 0b3ec0267..0a86726e0 100644 --- a/common/src/main/java/org/figuramc/figura/animation/Animation.java +++ b/common/src/main/java/org/figuramc/figura/animation/Animation.java @@ -9,6 +9,7 @@ import org.figuramc.figura.lua.docs.LuaTypeDoc; import org.figuramc.figura.model.FiguraModelPart; import org.luaj.vm2.LuaError; +import org.luaj.vm2.LuaTable; import org.luaj.vm2.LuaValue; import java.util.*; @@ -18,6 +19,7 @@ name = "Animation", value = "animation" ) +// Stole lua AnimationChannel and keyframe stuff from https://github.com/FiguraMC/Figura/pull/41 public class Animation { private final Avatar owner; @@ -606,6 +608,32 @@ public enum LoopMode { ONCE, HOLD } + @LuaWhitelist + @LuaMethodDoc("animation.getChannels") + public LuaTable getChannels() { + LuaTable ret = new LuaTable(); + for (Map.Entry> entry : animationParts) { + List value = new ArrayList<>(entry.getValue()); + ret.set((LuaValue) owner.luaRuntime.typeManager.javaToLua(entry.getKey()), (LuaValue) owner.luaRuntime.typeManager.javaToLua(value)); + } + return ret; + } + @LuaWhitelist + @LuaTypeDoc( + name = "AnimationChannel", + value = "animation_channel" + ) + public record AnimationChannel(TransformType type, Keyframe... keyframes) { - public record AnimationChannel(TransformType type, Keyframe... keyframes) {} + @LuaWhitelist + @LuaMethodDoc("animation.get_keyframes") + public List getKeyframes() { + return List.of(keyframes); + } + @LuaWhitelist + @LuaMethodDoc("animation.get_type") + public String getType() { + return type.toString(); + } + } } diff --git a/common/src/main/java/org/figuramc/figura/animation/Keyframe.java b/common/src/main/java/org/figuramc/figura/animation/Keyframe.java index 845d3f25f..1646a815a 100644 --- a/common/src/main/java/org/figuramc/figura/animation/Keyframe.java +++ b/common/src/main/java/org/figuramc/figura/animation/Keyframe.java @@ -3,22 +3,28 @@ import com.mojang.datafixers.util.Pair; import org.figuramc.figura.FiguraMod; import org.figuramc.figura.avatar.Avatar; +import org.figuramc.figura.lua.LuaWhitelist; +import org.figuramc.figura.lua.docs.LuaMethodDoc; +import org.figuramc.figura.lua.docs.LuaTypeDoc; import org.figuramc.figura.math.vector.FiguraVec3; +import org.figuramc.figura.utils.LuaUtils; import org.luaj.vm2.LuaError; import org.luaj.vm2.LuaValue; import org.luaj.vm2.Varargs; +@LuaWhitelist +@LuaTypeDoc(name = "Keyframe",value = "keyframe") public class Keyframe implements Comparable { private final Avatar owner; private final Animation animation; - private final float time; - private final Interpolation interpolation; - private final FiguraVec3 targetA, targetB; - private final String[] aCode, bCode; + private float time; + private Interpolation interpolation; + private FiguraVec3 targetA, targetB; + private String[] aCode, bCode; private final String chunkName; - private final FiguraVec3 bezierLeft, bezierRight; - private final FiguraVec3 bezierLeftTime, bezierRightTime; + private FiguraVec3 bezierLeft, bezierRight; + private FiguraVec3 bezierLeftTime, bezierRightTime; public Keyframe(Avatar owner, Animation animation, float time, Interpolation interpolation, Pair a, Pair b, FiguraVec3 bezierLeft, FiguraVec3 bezierRight, FiguraVec3 bezierLeftTime, FiguraVec3 bezierRightTime) { this.owner = owner; @@ -35,15 +41,28 @@ public Keyframe(Avatar owner, Animation animation, float time, Interpolation int this.bezierLeftTime = bezierLeftTime; this.bezierRightTime = bezierRightTime; } - + @LuaWhitelist + @LuaMethodDoc("keyframe.get_target_a") public FiguraVec3 getTargetA(float delta) { return targetA != null ? targetA.copy() : FiguraVec3.of(parseStringData(aCode[0], delta), parseStringData(aCode[1], delta), parseStringData(aCode[2], delta)); } - + @LuaWhitelist + @LuaMethodDoc("keyframe.get_target_b") public FiguraVec3 getTargetB(float delta) { return targetB != null ? targetB.copy() : FiguraVec3.of(parseStringData(bCode[0], delta), parseStringData(bCode[1], delta), parseStringData(bCode[2], delta)); } - + @LuaWhitelist + @LuaMethodDoc("keyframe.set_target_a") + public Keyframe setTargetA(float delta,Object x, Double y, Double z) { + targetA = LuaUtils.parseVec3("keyframe.setTargetA",x,y,z); + return this; + } + @LuaWhitelist + @LuaMethodDoc("keyframe.set_target_b") + public Keyframe setTargetB(float delta,Object x, Double y, Double z) { + targetB = LuaUtils.parseVec3("keyframe.setTargetB",x,y,z); + return this; + } private float parseStringData(String data, float delta) { FiguraMod.pushProfiler(data); try { @@ -82,27 +101,45 @@ private float parseStringData(String data, float delta) { return FiguraMod.popReturnProfiler(0f); } - + @LuaWhitelist + @LuaMethodDoc("keyframe.get_time") public float getTime() { return time; } - + @LuaWhitelist + @LuaMethodDoc("keyframe.set_time") + public Keyframe setTime(Float newTime) { + time = newTime; + return this; + } + @LuaWhitelist + @LuaMethodDoc("keyframe.get_interpolation") public Interpolation getInterpolation() { return interpolation; } - + @LuaWhitelist + @LuaMethodDoc("keyframe.set_interpolation") + public Keyframe setInterpolation(String interp) { + interpolation = Interpolation.valueOf(interp); + return this; + } + @LuaWhitelist + @LuaMethodDoc("keyframe.get_bezier_left") public FiguraVec3 getBezierLeft() { return bezierLeft.copy(); } - + @LuaWhitelist + @LuaMethodDoc("keyframe.get_bezier_right") public FiguraVec3 getBezierRight() { return bezierRight.copy(); } - + @LuaWhitelist + @LuaMethodDoc("keyframe.get_bezier_left_time") public FiguraVec3 getBezierLeftTime() { return bezierLeftTime.copy(); } - + @LuaWhitelist + @LuaMethodDoc("keyframe.get_bezier_right_time") public FiguraVec3 getBezierRightTime() { return bezierRightTime.copy(); } diff --git a/common/src/main/java/org/figuramc/figura/avatar/local/LocalAvatarFetcher.java b/common/src/main/java/org/figuramc/figura/avatar/local/LocalAvatarFetcher.java index 22874e645..e20053409 100644 --- a/common/src/main/java/org/figuramc/figura/avatar/local/LocalAvatarFetcher.java +++ b/common/src/main/java/org/figuramc/figura/avatar/local/LocalAvatarFetcher.java @@ -245,7 +245,7 @@ public AvatarPath(Path path, Path folder, Path theActualPathForThis) { else{ CompoundTag nbt = NbtIo.readCompressed(Files.newInputStream(path)); CompoundTag metadata = nbt.getCompound("metadata"); - if(metadata.contains("name")) name = metadata.getString("name") + " (" + filename + ")"; + if(metadata.contains("name")) name = metadata.getString("name") + " (" + Files.getLastModifiedTime(path) + ")"; cachedNames.put(path.toString().toLowerCase(),name); } }catch(Exception ignored){} diff --git a/common/src/main/java/org/figuramc/figura/lua/FiguraAPIManager.java b/common/src/main/java/org/figuramc/figura/lua/FiguraAPIManager.java index 1ec580138..c6575b0ba 100644 --- a/common/src/main/java/org/figuramc/figura/lua/FiguraAPIManager.java +++ b/common/src/main/java/org/figuramc/figura/lua/FiguraAPIManager.java @@ -48,6 +48,8 @@ import java.util.Map; import java.util.Set; import java.util.function.Function; +import org.figuramc.figura.animation.Keyframe; +import org.figuramc.figura.parsers.BlockbenchModel; /** * A set of Globals of which there is only one in the MC instance. @@ -124,6 +126,8 @@ public class FiguraAPIManager { add(AnimationAPI.class); add(Animation.class); + add(Animation.AnimationChannel.class); + add(Keyframe.class); add(HostAPI.class); diff --git a/common/src/main/java/org/figuramc/figura/lua/docs/FiguraDocsManager.java b/common/src/main/java/org/figuramc/figura/lua/docs/FiguraDocsManager.java index d476df34d..62d00aeff 100644 --- a/common/src/main/java/org/figuramc/figura/lua/docs/FiguraDocsManager.java +++ b/common/src/main/java/org/figuramc/figura/lua/docs/FiguraDocsManager.java @@ -10,6 +10,7 @@ import net.minecraft.network.chat.*; import org.figuramc.figura.FiguraMod; import org.figuramc.figura.animation.Animation; +import org.figuramc.figura.animation.Keyframe; import org.figuramc.figura.entries.FiguraAPI; import org.figuramc.figura.lua.api.*; import org.figuramc.figura.lua.api.action_wheel.Action; @@ -119,7 +120,9 @@ public class FiguraDocsManager { put("animations", List.of( AnimationAPI.class, - Animation.class + Animation.class, + Animation.AnimationChannel.class, + Keyframe.class )); put("nameplate", List.of(