void FAnimNode_StateMachine::EvaluateTransitionStandardBlend(FPoseContext& Output,FAnimationActiveTransitionEntry& Transition, bool bIntermediatePoseIsValid) { FPoseContext PreviouseStateResult(Output); FPoseContext NextStateResult(Output); if (bIntermediatePoseIsValid) { Output.AnimInstance->CopyPose(Output.Pose, PreviouseStateResult.Pose); } else { EvaluateState(Transition.PreviousState, PreviouseStateResult); } // evaluate the next state EvaluateState(Transition.NextState, NextStateResult); // Blend it in const ScalarRegister VPreviousWeight(1.0f - Transition.Alpha); const ScalarRegister VWeight(Transition.Alpha); for (FCompactPoseBoneIndex BoneIndex : Output.Pose.ForEachBoneIndex()) { Output.Pose[BoneIndex] = PreviouseStateResult.Pose[BoneIndex] * VPreviousWeight; Output.Pose[BoneIndex].AccumulateWithShortestRotation(NextStateResult.Pose[BoneIndex], VWeight); } }
void FAnimNode_StateMachine::EvaluateTransitionStandardBlend(FPoseContext& Output,FAnimationActiveTransitionEntry& Transition, bool bIntermediatePoseIsValid) { FPoseContext PreviouseStateResult(Output); FPoseContext NextStateResult(Output); if (bIntermediatePoseIsValid) { Output.AnimInstance->CopyPose(Output.Pose, PreviouseStateResult.Pose); } else { EvaluateState(Transition.PreviousState, PreviouseStateResult); } // evaluate the next state EvaluateState(Transition.NextState, NextStateResult); // Blend it in const ScalarRegister VPreviousWeight(1.0f - Transition.Alpha); const ScalarRegister VWeight(Transition.Alpha); const TArray<FBoneIndexType> & RequiredBoneIndices = Output.AnimInstance->RequiredBones.GetBoneIndicesArray(); for (int32 j = 0; j < RequiredBoneIndices.Num(); ++j) { const int32 BoneIndex = RequiredBoneIndices[j]; Output.Pose.Bones[BoneIndex] = PreviouseStateResult.Pose.Bones[BoneIndex] * VPreviousWeight; Output.Pose.Bones[BoneIndex].AccumulateWithShortestRotation(NextStateResult.Pose.Bones[BoneIndex], VWeight); } }