void FAnimNode_SkeletalControlBase::EvaluateComponentSpace(FComponentSpacePoseContext& Output) { // Evaluate the input ComponentPose.EvaluateComponentSpace(Output); // Apply the skeletal control if it's valid if (FAnimWeight::IsRelevant(ActualAlpha) && IsValidToEvaluate(Output.AnimInstanceProxy->GetSkeleton(), Output.AnimInstanceProxy->GetRequiredBones())) { EvaluateComponentSpaceInternal(Output); #if WITH_EDITORONLY_DATA // save current pose before applying skeletal control to compute the exact gizmo location in AnimGraphNode ForwardedPose.CopyPose(Output.Pose); #endif // #if WITH_EDITORONLY_DATA USkeletalMeshComponent* Component = Output.AnimInstanceProxy->GetSkelMeshComponent(); BoneTransforms.Reset(BoneTransforms.Num()); EvaluateBoneTransforms(Component, Output.Pose, BoneTransforms); checkSlow(!ContainsNaN(BoneTransforms)); if (BoneTransforms.Num() > 0) { const float BlendWeight = FMath::Clamp<float>(ActualAlpha, 0.f, 1.f); Output.Pose.LocalBlendCSBoneTransforms(BoneTransforms, BlendWeight); } } }
void FAnimNode_SkeletalControlBase::EvaluateComponentSpace(FComponentSpacePoseContext& Output) { // Evaluate the input ComponentPose.EvaluateComponentSpace(Output); // Apply the skeletal control if it's valid const float ActualAlpha = AlphaScaleBias.ApplyTo(Alpha); if ((ActualAlpha >= ZERO_ANIMWEIGHT_THRESH) && IsValidToEvaluate(Output.AnimInstance->CurrentSkeleton, Output.AnimInstance->RequiredBones)) { USkeletalMeshComponent* Component = Output.AnimInstance->GetSkelMeshComponent(); #if WITH_EDITORONLY_DATA // save current pose before applying skeletal control to compute the exact gizmo location in AnimGraphNode ForwardedPose = Output.Pose; #endif // #if WITH_EDITORONLY_DATA TArray<FBoneTransform> BoneTransforms; EvaluateBoneTransforms(Component, Output.AnimInstance->RequiredBones, Output.Pose, BoneTransforms); checkSlow(!ContainsNaN(BoneTransforms)); if (BoneTransforms.Num() > 0) { const float BlendWeight = FMath::Clamp<float>(ActualAlpha, 0.f, 1.f); Output.Pose.LocalBlendCSBoneTransforms(BoneTransforms, BlendWeight); } } }
void FAnimNode_SkeletalControlBase::EvaluateComponentSpace(FComponentSpacePoseContext& Output) { // Evaluate the input ComponentPose.EvaluateComponentSpace(Output); // Apply the skeletal control if it's valid const float ActualAlpha = AlphaScaleBias.ApplyTo(Alpha); if ((ActualAlpha >= ZERO_ANIMWEIGHT_THRESH) && IsValidToEvaluate(Output.AnimInstance->CurrentSkeleton, Output.AnimInstance->RequiredBones)) { USkeletalMeshComponent* Component = Output.AnimInstance->GetSkelMeshComponent(); TArray<FBoneTransform> BoneTransforms; EvaluateBoneTransforms(Component, Output.AnimInstance->RequiredBones, Output.Pose, BoneTransforms); checkSlow(!ContainsNaN(BoneTransforms)); if (BoneTransforms.Num() > 0) { const float BlendWeight = FMath::Clamp<float>(ActualAlpha, 0.f, 1.f); Output.Pose.LocalBlendCSBoneTransforms(BoneTransforms, BlendWeight); } } }