How to get a bone location for the first frame of an AnimMontage?

Hey, Emidee code no longer compiles, it is ported to 4.26:

FTransform UGGUtilitiesFunctionLibrary::GetBoneTransformFromMontage(const USkeletalMeshComponent* MeshComponent, const UAnimMontage* anim_montage, FName target_bone_name, float Time)
{
	UAnimSequence* AnimSequence = Cast<UAnimSequence>(anim_montage->SlotAnimTracks[0].AnimTrack.AnimSegments[0].AnimReference);
	FTransform Transform = GetBoneTransformFromSequence(MeshComponent, AnimSequence, target_bone_name, Time);

	return Transform;
}

FTransform UGGUtilitiesFunctionLibrary::GetBoneTransformFromSequence(const USkeletalMeshComponent* MeshComponent, const UAnimSequence* anim_sequence, FName target_bone_name, float Time)
{
	if (!anim_sequence || !MeshComponent || !MeshComponent->SkeletalMesh)
		return FTransform::Identity;
	
	FName bone_name = target_bone_name;
	FTransform global_transform = FTransform::Identity;

	do
	{
		const int bone_index = MeshComponent->GetBoneIndex(bone_name);
		int32 BoneTrackIndex = MeshComponent->SkeletalMesh->Skeleton->GetRawAnimationTrackIndex(bone_index, anim_sequence);
		
		FTransform bone_transform;
		anim_sequence->GetBoneTransform(bone_transform, BoneTrackIndex, Time, true);
		
		global_transform *= bone_transform;
		bone_name = MeshComponent->GetParentBone(bone_name);
		
	} while (bone_name != NAME_None);

	global_transform *= MeshComponent->GetComponentTransform();

	return global_transform;
}
2 Likes