fix: only override animated bones, not all bones

This commit is contained in:
2026-06-25 16:39:09 -04:00
parent d6df49844e
commit 8415ceb926
+10 -14
View File
@@ -324,21 +324,17 @@ func _apply_animation_by_code(anim_name: String, time: float) -> void:
if _bone_idxs.is_empty():
_cache_bone_indices()
# Loop all bones and reset to rest, then apply animation offset
var bone_count: int = skeleton.get_bone_count()
for i in range(bone_count):
var rest: Transform3D = skeleton.get_bone_rest(i)
var new_transform := Transform3D(rest.basis, rest.origin)
# Only override bones that we have animation data for
for bone_name in _bone_idxs:
var bone_idx: int = _bone_idxs[bone_name]
var offset: Vector3 = _get_bone_anim_offset(anim_name, bone_idx, time)
if offset == Vector3.ZERO:
continue
# Apply animation-specific rotation offset
var offset := _get_bone_anim_offset(anim_name, i, time)
if offset != Vector3.ZERO:
var offset_basis := Basis(Quaternion.from_euler(offset))
new_transform.basis = offset_basis * rest.basis
# Recalculate global position with the rotated bone
new_transform.origin = rest.origin
skeleton.set_bone_global_pose_override(i, new_transform, 1.0, true)
var rest: Transform3D = skeleton.get_bone_rest(bone_idx)
var offset_basis: Basis = Basis(Quaternion.from_euler(offset))
var new_basis: Basis = offset_basis * rest.basis
skeleton.set_bone_global_pose_override(bone_idx, Transform3D(new_basis, rest.origin), 1.0, true)
func _cache_bone_indices() -> void: