Files
UnrealEngineUWP/Engine/Source/Runtime/AnimGraphRuntime/Private/AnimNodes/AnimNode_RotationOffsetBlendSpace.cpp
Ryan Vance 7c51ff94af Merging //UE4/Dev-Main to Dev-VR (//UE4/Dev-VR)
CL 1 of 8
#rb integration

[CL 4748712 by Ryan Vance in Dev-VR branch]
2019-01-17 18:54:05 -05:00

100 lines
3.1 KiB
C++

// Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.
#include "AnimNodes/AnimNode_RotationOffsetBlendSpace.h"
#include "Animation/AnimInstanceProxy.h"
#include "AnimationRuntime.h"
/////////////////////////////////////////////////////
// FAnimNode_RotationOffsetBlendSpace
FAnimNode_RotationOffsetBlendSpace::FAnimNode_RotationOffsetBlendSpace()
: LODThreshold(INDEX_NONE)
, Alpha(1.f)
, AlphaCurveName(NAME_None)
, ActualAlpha(0.0f)
, AlphaInputType(EAnimAlphaInputType::Float)
, bAlphaBoolEnabled(false)
, bIsLODEnabled(false)
{
}
void FAnimNode_RotationOffsetBlendSpace::Initialize_AnyThread(const FAnimationInitializeContext& Context)
{
FAnimNode_BlendSpacePlayer::Initialize_AnyThread(Context);
BasePose.Initialize(Context);
}
void FAnimNode_RotationOffsetBlendSpace::CacheBones_AnyThread(const FAnimationCacheBonesContext& Context)
{
FAnimNode_BlendSpacePlayer::CacheBones_AnyThread(Context);
BasePose.CacheBones(Context);
}
void FAnimNode_RotationOffsetBlendSpace::UpdateAssetPlayer(const FAnimationUpdateContext& Context)
{
ActualAlpha = 0.f;
bIsLODEnabled = IsLODEnabled(Context.AnimInstanceProxy);
if (bIsLODEnabled)
{
GetEvaluateGraphExposedInputs().Execute(Context);
// Determine Actual Alpha.
switch (AlphaInputType)
{
case EAnimAlphaInputType::Float:
ActualAlpha = AlphaScaleBias.ApplyTo(AlphaScaleBiasClamp.ApplyTo(Alpha, Context.GetDeltaTime()));
break;
case EAnimAlphaInputType::Bool:
ActualAlpha = AlphaBoolBlend.ApplyTo(bAlphaBoolEnabled, Context.GetDeltaTime());
break;
case EAnimAlphaInputType::Curve:
if (UAnimInstance* AnimInstance = Cast<UAnimInstance>(Context.AnimInstanceProxy->GetAnimInstanceObject()))
{
ActualAlpha = AlphaScaleBiasClamp.ApplyTo(AnimInstance->GetCurveValue(AlphaCurveName), Context.GetDeltaTime());
}
break;
};
// Make sure Alpha is clamped between 0 and 1.
ActualAlpha = FMath::Clamp<float>(ActualAlpha, 0.f, 1.f);
if (FAnimWeight::IsRelevant(ActualAlpha))
{
UpdateInternal(Context);
}
}
BasePose.Update(Context);
}
void FAnimNode_RotationOffsetBlendSpace::Evaluate_AnyThread(FPoseContext& Context)
{
// Evaluate base pose
BasePose.Evaluate(Context);
if (bIsLODEnabled && FAnimWeight::IsRelevant(ActualAlpha))
{
// Evaluate MeshSpaceRotation additive blendspace
FPoseContext MeshSpaceRotationAdditivePoseContext(Context);
FAnimNode_BlendSpacePlayer::Evaluate_AnyThread(MeshSpaceRotationAdditivePoseContext);
// Accumulate poses together
FAnimationRuntime::AccumulateMeshSpaceRotationAdditiveToLocalPose(Context.Pose, MeshSpaceRotationAdditivePoseContext.Pose, Context.Curve, MeshSpaceRotationAdditivePoseContext.Curve, ActualAlpha);
// Resulting rotations are not normalized, so normalize here.
Context.Pose.NormalizeRotations();
}
}
void FAnimNode_RotationOffsetBlendSpace::GatherDebugData(FNodeDebugData& DebugData)
{
FString DebugLine = DebugData.GetNodeName(this);
DebugLine += FString::Printf(TEXT("Alpha (%.1f%%) PlayTime (%.3f)"), ActualAlpha * 100.f, InternalTimeAccumulator);
DebugData.AddDebugItem(DebugLine);
BasePose.GatherDebugData(DebugData);
}