void FAnimationRuntime::LerpBoneTransforms(TArray<FTransform> & A, const TArray<FTransform> & B, float Alpha, const TArray<FBoneIndexType> & RequiredBonesArray) { if( Alpha >= (1.f - ZERO_ANIMWEIGHT_THRESH) ) { A = B; } else if( Alpha > ZERO_ANIMWEIGHT_THRESH ) { FTransform* ATransformData = A.GetData(); const FTransform* BTransformData = B.GetData(); const ScalarRegister VAlpha(Alpha); const ScalarRegister VOneMinusAlpha(1.f - Alpha); for (int32 Index=0; Index<RequiredBonesArray.Num(); Index++) { const int32& BoneIndex = RequiredBonesArray[Index]; FTransform* TA = ATransformData + BoneIndex; const FTransform* TB = BTransformData + BoneIndex; *TA *= VOneMinusAlpha; TA->AccumulateWithShortestRotation(*TB, VAlpha); TA->NormalizeRotation(); // TA->BlendWith(*TB, Alpha); } } }
void BlendTransform<ETransformBlendMode::Accumulate>(const FTransform& Source, FTransform& Dest, const float BlendWeight) { const ScalarRegister VBlendWeight(BlendWeight); Dest.AccumulateWithShortestRotation(Source, VBlendWeight); }