From 99ace36b326fd760945ca28925047589ad6c1b14 Mon Sep 17 00:00:00 2001 From: ZigyTheBird <105124180+ZigyTheBird@users.noreply.github.com> Date: Mon, 29 Dec 2025 20:13:41 +0330 Subject: [PATCH] Default bones can now be parents too --- .../animation/AnimationController.java | 17 +++++++++++++---- .../playeranimcore/util/MatrixUtil.java | 6 +++++- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/com/zigythebird/playeranimcore/animation/AnimationController.java b/core/src/main/java/com/zigythebird/playeranimcore/animation/AnimationController.java index 9f3caa3..5f79f2b 100644 --- a/core/src/main/java/com/zigythebird/playeranimcore/animation/AnimationController.java +++ b/core/src/main/java/com/zigythebird/playeranimcore/animation/AnimationController.java @@ -24,6 +24,7 @@ package com.zigythebird.playeranimcore.animation; +import com.zigythebird.playeranimcore.PlayerAnimLib; import com.zigythebird.playeranimcore.animation.keyframe.*; import com.zigythebird.playeranimcore.animation.keyframe.event.CustomKeyFrameEvents; import com.zigythebird.playeranimcore.animation.keyframe.event.data.CustomInstructionKeyframeData; @@ -639,19 +640,27 @@ protected void applyCustomPivotPoints() { bones1.add(pivotBone); } + List processedBones = new ArrayList<>(); + for (PlayerAnimBone bone : bones1) { if (parentsMap.containsKey(bone.getName())) { this.activeBones.put(bone.getName(), bone); - List parents = new ArrayList<>(); - PivotBone currentParent = this.pivotBones.get(parentsMap.get(bone.getName())); - parents.add(currentParent); + List parents = new ArrayList<>(); + PlayerAnimBone currentParent = bone; while (parentsMap.containsKey(currentParent.getName())) { - currentParent = this.pivotBones.get(parentsMap.get(currentParent.getName())); + String parentName = parentsMap.get(currentParent.getName()); + currentParent = this.pivotBones.containsKey(parentName) ? this.pivotBones.get(parentName) : this.bones.getOrDefault(parentName, null); + if (currentParent == null) { + PlayerAnimLib.LOGGER.error("Failed to find parent bone called {}", parentName); + break; + } parents.addFirst(currentParent); + if (processedBones.contains(currentParent.getName())) break; } MatrixUtil.applyParentsToChild(bone, parents, this::getBonePosition); + processedBones.add(bone.getName()); } } } diff --git a/core/src/main/java/com/zigythebird/playeranimcore/util/MatrixUtil.java b/core/src/main/java/com/zigythebird/playeranimcore/util/MatrixUtil.java index 52f4184..ad4b6d3 100644 --- a/core/src/main/java/com/zigythebird/playeranimcore/util/MatrixUtil.java +++ b/core/src/main/java/com/zigythebird/playeranimcore/util/MatrixUtil.java @@ -12,6 +12,10 @@ * Used for applying custom pivot bones to player bones */ public class MatrixUtil { + public static void translateMatrixForBone(ModMatrix4f matrix, PlayerAnimBone bone) { + matrix.translate(-bone.getPosX(), bone.getPosY(), -bone.getPosZ()); + } + public static void rotateMatrixAroundBone(ModMatrix4f matrix, PlayerAnimBone bone) { if (bone.getRotZ() != 0 || bone.getRotY() != 0 || bone.getRotX() != 0) matrix.rotateZ(bone.getRotZ()).rotateY(bone.getRotY()).rotateX(bone.getRotX()); @@ -31,6 +35,7 @@ public static void translateAwayFromPivotPoint(ModMatrix4f matrix, Vec3f pivot) public static void prepMatrixForBone(ModMatrix4f matrix, PlayerAnimBone bone, Vec3f pivot) { translateToPivotPoint(matrix, pivot); + translateMatrixForBone(matrix, bone); rotateMatrixAroundBone(matrix, bone); scaleMatrixForBone(matrix, bone); translateAwayFromPivotPoint(matrix, pivot); @@ -42,7 +47,6 @@ public static void applyParentsToChild(PlayerAnimBone child, Iterable