I forgot to put the code I ended with, for those interested:
void ABBHoop::Foo()
{
UAnimMontage
* selected_montage = ...;
const TArray<FAnimSegment>
& segment_table = selected_montage->SlotAnimTracks 0 ].AnimTrack.AnimSegments;
const FName
& section_name = selected_montage->GetSectionName( selected_montage_segment_index );
const UAnimSequence
& anim_sequence = *Cast< UAnimSequence >( segment_table selected_montage_segment_index ].AnimReference );
FVector
position = GetBallBoneFirstFrameMontageLocation( anim_sequence, FName( "XXX" ) );
}
FVector ABBHoop::GetBallBoneFirstFrameMontageLocation(
const UAnimSequence & anim_sequence,
const FName & target_bone_name
) const
{
FName
bone_name = target_bone_name;
FTransform
global_transform;
global_transform.SetIdentity();
do
{
const int
bone_index = MeshComponent->GetBoneIndex( bone_name );
FTransform
bone_transform;
int
track_index;
for ( track_index = 0; track_index < anim_sequence.TrackToSkeletonMapTable.Num(); ++track_index )
{
if ( anim_sequence.TrackToSkeletonMapTable track_index ].BoneTreeIndex == bone_index )
{
break;
}
}
if ( track_index == anim_sequence.TrackToSkeletonMapTable.Num() )
{
break;
}
anim_sequence.GetBoneTransform( bone_transform, track_index, 0.0f, true );
global_transform *= bone_transform;
bone_name = MeshComponent->GetParentBone( bone_name );
} while ( bone_name != NAME_None );
global_transform.SetToRelativeTransform( MeshComponent->GetComponentTransform() );
return global_transform.GetTranslation();
}