UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
AnimNode_DeadBlending.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
6#include "AnimNode_DeadBlending.generated.h"
7
30USTRUCT(BlueprintInternalUseOnly)
32#if CPP
34#endif
35{
37 friend class UAnimGraphNode_DeadBlending;
38
39 // Input Pose
40 UPROPERTY(EditAnywhere, Category = Links)
41 FPoseLink Source;
42
43#if WITH_EDITORONLY_DATA
44 void SetTag(FName InTag) { Tag = InTag; }
45#endif
46 FName GetTag() { return Tag; }
47
48private:
49
50 // When enabled, the default blend settings will always be used rather than those coming from the inertialization request.
51 UPROPERTY(EditAnywhere, Category = Blending)
52 bool bAlwaysUseDefaultBlendSettings = false;
53
54 // The default blend duration to use when "Always Use Default Blend Settings" is set to true.
55 UPROPERTY(EditAnywhere, Category = Blending)
56 float DefaultBlendDuration = 0.25f;
57
58 // Default blend profile to use when no blend profile is supplied with the inertialization request.
59 UPROPERTY(EditAnywhere, Category = Blending, meta = (UseAsBlendProfile = true))
60 TObjectPtr<UBlendProfile> DefaultBlendProfile = nullptr;
61
62 // Default blend mode to use when no blend mode is supplied with the inertialization request.
63 UPROPERTY(EditAnywhere, Category = Blending, DisplayName = "Default Blend Mode")
64 EAlphaBlendOption DefaultBlendMode = UE::Anim::DefaultBlendOption;
65
66 // Default custom blend curve to use along with the default blend mode.
67 UPROPERTY(EditAnywhere, Category = Blending)
68 TObjectPtr<UCurveFloat> DefaultCustomBlendCurve = nullptr;
69
70 // Multiplier that can be used to scale the overall blend durations coming from inertialization requests.
71 UPROPERTY(EditAnywhere, Category = Blending, meta = (Min = "0.0", UIMin = "0.0"))
72 float BlendTimeMultiplier = 1.0f;
73
79 UPROPERTY(EditAnywhere, Category = Blending)
80 bool bLinearlyInterpolateScales = false;
81
82 // List of curves that should not use inertial blending. These curves will change instantly when the animation switches.
83 UPROPERTY(EditAnywhere, Category = Filter)
84 TArray<FName> FilteredCurves;
85
90 UPROPERTY(EditAnywhere, Category = Filter)
91 TArray<FName> ExtrapolationFilteredCurves;
92
93 // List of bones that should not use inertial blending. These bones will change instantly when the animation switches.
94 UPROPERTY(EditAnywhere, Category = Filter)
95 TArray<FBoneReference> FilteredBones;
96
102 UPROPERTY(EditAnywhere, Category = Extrapolation, meta = (Min = "0.0", UIMin = "0.0"), DisplayName = "Extrapolation Half Life")
103 float ExtrapolationHalfLife = 1.0f;
104
110 UPROPERTY(EditAnywhere, Category = Extrapolation, meta = (Min = "0.0", UIMin = "0.0"), DisplayName = "Minimum Extrapolation Half Life")
111 float ExtrapolationHalfLifeMin = 0.05f;
112
118 UPROPERTY(EditAnywhere, Category = Extrapolation, meta = (Min = "0.0", UIMin = "0.0"), DisplayName = "Maximum Extrapolation Half Life")
119 float ExtrapolationHalfLifeMax = 1.0f;
120
125 UPROPERTY(EditAnywhere, Category = Extrapolation, meta = (Min = "0.0", UIMin = "0.0"))
126 float MaximumTranslationVelocity = 500.0f;
127
132 UPROPERTY(EditAnywhere, Category = Extrapolation, meta = (Min = "0.0", UIMin = "0.0"))
133 float MaximumRotationVelocity = 360.0f;
134
139 UPROPERTY(EditAnywhere, Category = Extrapolation, meta = (Min = "0.0", UIMin = "0.0"))
140 float MaximumScaleVelocity = 4.0f;
141
146 UPROPERTY(EditAnywhere, Category = Extrapolation, meta = (Min = "0.0", UIMin = "0.0"))
147 float MaximumCurveVelocity = 100.0f;
148
152 UPROPERTY(EditAnywhere, Category = Blending)
153 bool bResetOnBecomingRelevant = true;
154
161 UPROPERTY(EditAnywhere, Category = Requests)
162 bool bForwardRequestsThroughSkippedCachedPoseNodes = false;
163
164 /* UAnimGraphNode_Deadblending tag to match at runtime for filtering inertialization requests */
165 UPROPERTY()
167
168#if WITH_EDITORONLY_DATA
169
170 // This setting can be used to show what the extrapolation of the animation looks like.
171 UPROPERTY(EditAnywhere, Category = Debug)
172 bool bShowExtrapolations = false;
173
174#endif // WITH_EDITORONLY_DATA
175
176public: // FAnimNode_DeadBlending
177
179
184 ENGINE_API virtual void RequestInertialization(const FInertializationRequest& Request);
185
186public: // FAnimNode_Base
187
188 ENGINE_API virtual void Initialize_AnyThread(const FAnimationInitializeContext& Context) override;
189 ENGINE_API virtual void CacheBones_AnyThread(const FAnimationCacheBonesContext& Context) override;
190 ENGINE_API virtual void Update_AnyThread(const FAnimationUpdateContext& Context) override;
191 ENGINE_API virtual void Evaluate_AnyThread(FPoseContext& Output) override;
192 ENGINE_API virtual void GatherDebugData(FNodeDebugData& DebugData) override;
193 ENGINE_API virtual bool NeedsDynamicReset() const override;
194
195private:
196
200 void Deactivate();
201
211 void InitFrom(
212 const FCompactPose& InPose,
213 const FBlendedCurve& InCurves,
214 const UE::Anim::FStackAttributeContainer& Attributes,
217
226
227public: // IBoneReferenceSkeletonProvider
228 ENGINE_API class USkeleton* GetSkeleton(bool& bInvalidSkeletonIsError, const IPropertyHandle* PropertyHandle) override;
229
230private:
231
232 // Cached curve filter built from FilteredCurves
233 UE::Anim::FCurveFilter CurveFilter;
234
235 // Cached curve filter built from ExtrapolationFilteredCurves
236 UE::Anim::FCurveFilter ExtrapolatedCurveFilter;
237
238 // Cache compact pose bone index for FilteredBones
240
241 // Snapshots of the actor pose generated as output.
242 FInertializationSparsePose PrevPoseSnapshot;
243 FInertializationSparsePose CurrPoseSnapshot;
244
245 // Pending inertialization requests.
248
249 // Update Counter for detecting being relevant
250 FGraphTraversalCounter UpdateCounter;
251
252private:
253
254 // Recorded pose state at point of transition.
255
256 TArray<int32> BoneIndices;
257
258 TArray<FVector> BoneTranslations;
259 TArray<FQuat> BoneRotations;
260 TArray<FQuat4f> BoneRotationDirections;
261 TArray<FVector> BoneScales;
262
263 TArray<FVector3f> BoneTranslationVelocities;
264 TArray<FVector3f> BoneRotationVelocities;
265 TArray<FVector3f> BoneScaleVelocities;
266
267 TArray<FVector3f> BoneTranslationDecayHalfLives;
268 TArray<FVector3f> BoneRotationDecayHalfLives;
269 TArray<FVector3f> BoneScaleDecayHalfLives;
270
271 FVector3f RootTranslationVelocity;
272 FVector3f RootRotationVelocity;
273 FVector3f RootScaleVelocity;
274
275 // Recorded curve state at the point of transition.
276
277 struct FDeadBlendingCurveElement : public UE::Anim::FCurveElement
278 {
279 float Velocity = 0.0f;
280 float HalfLife = 0.0f;
281
282 FDeadBlendingCurveElement() = default;
283 };
284
285 // Recorded curve state at the point of transition
286 TBaseBlendedCurve<TInlineAllocator<8>, FDeadBlendingCurveElement> CurveData;
287
288 // Temporary storage for curve data of the Destination Pose
290
291private:
292
293 // Variable used to store the elapsed delta time between calls to evaluate.
294 float DeltaTime = 0.0f;
295
296 // Current Inertialization state.
298
299 // Time since the last request for inertialization.
300 float InertializationTime = 0.0f;
301
302 // Current inertialization duration (used for curves).
303 float InertializationDuration = 0.0f;
304
305 // Current inertialization durations for each bone, indexed by skeleton bone index (used for per-bone blending).
306 TCustomBoneIndexArray<float, FSkeletonPoseBoneIndex> InertializationDurationPerBone;
307
308 // Maximum of InertializationDuration and all entries in InertializationDurationPerBone (used for knowing when to shutdown the inertialization).
309 float InertializationMaxDuration = 0.0f;
310
311 // Current blend mode being used for Inertialization.
312 EAlphaBlendOption InertializationBlendMode = EAlphaBlendOption::Linear;
313
314 // Custom blend curve being used by the current blend mode.
316 TObjectPtr<UCurveFloat> InertializationCustomBlendCurve = nullptr;
317
318
319// if ANIM_TRACE_ENABLED - these properties are only used for debugging when ANIM_TRACE_ENABLED == 1
320
321 // Description for the current inertialization request
322 FString InertializationRequestDescription;
323
324 // Node Id for the current inertialization request
325 int32 InertializationRequestNodeId = INDEX_NONE;
326
327 // Anim Instance for the current inertialization request
329 TObjectPtr<UObject> InertializationRequestAnimInstance = nullptr;
330
331// endif ANIM_TRACE_ENABLED
332};
EAlphaBlendOption
Definition AlphaBlend.h:13
EInertializationState
Definition AnimNode_Inertialization.h:53
@ INDEX_NONE
Definition CoreMiscDefines.h:150
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
return true
Definition ExternalRpcRegistry.cpp:601
#define UPROPERTY(...)
UObject definition macros.
Definition ObjectMacros.h:744
#define GENERATED_BODY(...)
Definition ObjectMacros.h:765
#define USTRUCT(...)
Definition ObjectMacros.h:746
Definition NameTypes.h:617
Definition Interface_BoneReferenceSkeletonProvider.h:19
Definition Array.h:670
Definition BlendProfile.h:132
Definition CurveFloat.h:31
Definition CustomBoneIndexArray.h:43
Definition Skeleton.h:295
Definition AdvancedWidgetsModule.cpp:13
@ false
Definition radaudio_common.h:23
Definition AnimNodeBase.h:853
Definition AnimNode_DeadBlending.h:35
FName GetTag()
Definition AnimNode_DeadBlending.h:46
Definition AnimNodeBase.h:337
Definition AnimNodeBase.h:324
Definition AnimNodeBase.h:354
Definition AnimCurveTypes.h:1041
Definition BoneReference.h:14
Definition BonePose.h:347
Definition AnimTypes.h:144
Definition AnimInertializationRequest.h:15
Definition AnimNode_Inertialization.h:154
Definition AnimNodeBase.h:642
Definition AnimNodeBase.h:479
Definition AnimCurveTypes.h:487
Definition ObjectPtr.h:488
Definition AnimCurveTypes.h:418
Definition AnimCurveFilter.h:68
Definition AttributesRuntime.h:40