Feat/14 movement overhaul #20
@@ -324,21 +324,17 @@ func _apply_animation_by_code(anim_name: String, time: float) -> void:
|
|||||||
if _bone_idxs.is_empty():
|
if _bone_idxs.is_empty():
|
||||||
_cache_bone_indices()
|
_cache_bone_indices()
|
||||||
|
|
||||||
# Loop all bones and reset to rest, then apply animation offset
|
# Only override bones that we have animation data for
|
||||||
var bone_count: int = skeleton.get_bone_count()
|
for bone_name in _bone_idxs:
|
||||||
for i in range(bone_count):
|
var bone_idx: int = _bone_idxs[bone_name]
|
||||||
var rest: Transform3D = skeleton.get_bone_rest(i)
|
var offset: Vector3 = _get_bone_anim_offset(anim_name, bone_idx, time)
|
||||||
var new_transform := Transform3D(rest.basis, rest.origin)
|
if offset == Vector3.ZERO:
|
||||||
|
continue
|
||||||
|
|
||||||
# Apply animation-specific rotation offset
|
var rest: Transform3D = skeleton.get_bone_rest(bone_idx)
|
||||||
var offset := _get_bone_anim_offset(anim_name, i, time)
|
var offset_basis: Basis = Basis(Quaternion.from_euler(offset))
|
||||||
if offset != Vector3.ZERO:
|
var new_basis: Basis = offset_basis * rest.basis
|
||||||
var offset_basis := Basis(Quaternion.from_euler(offset))
|
skeleton.set_bone_global_pose_override(bone_idx, Transform3D(new_basis, rest.origin), 1.0, true)
|
||||||
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)
|
|
||||||
|
|
||||||
|
|
||||||
func _cache_bone_indices() -> void:
|
func _cache_bone_indices() -> void:
|
||||||
|
|||||||
Reference in New Issue
Block a user