void FAnimationRuntime::FillWithRefPose(TArray<FTransform> & OutAtoms, const FBoneContainer& RequiredBones) { // Copy Target Asset's ref pose. OutAtoms = RequiredBones.GetRefPoseArray(); // If retargeting is disabled, copy ref pose from Skeleton, rather than mesh. // this is only used in editor and for debugging. if( RequiredBones.GetDisableRetargeting() ) { checkSlow( RequiredBones.IsValid() ); // Only do this if we have a mesh. otherwise we're not retargeting animations. if( RequiredBones.GetSkeletalMeshAsset() ) { TArray<int32> const & PoseToSkeletonBoneIndexArray = RequiredBones.GetPoseToSkeletonBoneIndexArray(); TArray<FBoneIndexType> const & RequireBonesIndexArray = RequiredBones.GetBoneIndicesArray(); TArray<FTransform> const & SkeletonRefPose = RequiredBones.GetSkeletonAsset()->GetRefLocalPoses(); for (int32 ArrayIndex = 0; ArrayIndex<RequireBonesIndexArray.Num(); ArrayIndex++) { int32 const & PoseBoneIndex = RequireBonesIndexArray[ArrayIndex]; int32 const & SkeletonBoneIndex = PoseToSkeletonBoneIndexArray[PoseBoneIndex]; // Pose bone index should always exist in Skeleton checkSlow(SkeletonBoneIndex != INDEX_NONE); OutAtoms[PoseBoneIndex] = SkeletonRefPose[SkeletonBoneIndex]; } } } }
void FAnimNode_RotationMultiplier::EvaluateBoneTransforms(USkeletalMeshComponent* SkelComp, const FBoneContainer & RequiredBones, FA2CSPose& MeshBases, TArray<FBoneTransform>& OutBoneTransforms) { check(OutBoneTransforms.Num() == 0); if ( Multiplier != 0.f ) { // Reference bone const TArray<FTransform> & LocalRefPose = RequiredBones.GetRefPoseArray(); const FQuat RefQuat = LocalRefPose[TargetBone.BoneIndex].GetRotation(); FQuat NewQuat; MultiplyQuatBasedOnSourceIndex(LocalRefPose, MeshBases, RotationAxisToRefer, SourceBone.BoneIndex, Multiplier, RefQuat, NewQuat); FTransform NewLocalTransform = MeshBases.GetLocalSpaceTransform(TargetBone.BoneIndex); NewLocalTransform.SetRotation(NewQuat); const int32 ParentIndex = RequiredBones.GetParentBoneIndex(TargetBone.BoneIndex); if( ParentIndex != INDEX_NONE ) { const FTransform ParentTM = MeshBases.GetComponentSpaceTransform(ParentIndex); FTransform NewTransform = NewLocalTransform * ParentTM; OutBoneTransforms.Add( FBoneTransform(TargetBone.BoneIndex, NewTransform) ); } else { OutBoneTransforms.Add( FBoneTransform(TargetBone.BoneIndex, NewLocalTransform) ); } } }