Files
UnrealEngine/Engine/Source/Runtime/AnimGraphRuntime/Public/AnimNodes/AnimNode_PoseHandler.h
2025-05-18 13:04:45 +08:00

73 lines
2.7 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "UObject/ObjectMacros.h"
#include "Animation/AnimationAsset.h"
#include "Animation/PoseAsset.h"
#include "Animation/AnimNode_AssetPlayerBase.h"
#include "AnimNode_PoseHandler.generated.h"
// Evaluates a point in an anim sequence, using a specific time input rather than advancing time internally.
// Typically the playback position of the animation for this node will represent something other than time, like jump height.
// This node will not trigger any notifies present in the associated sequence.
USTRUCT(BlueprintInternalUseOnly)
struct FAnimNode_PoseHandler : public FAnimNode_AssetPlayerBase
{
GENERATED_USTRUCT_BODY()
public:
// The animation sequence asset to evaluate
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Settings, meta = (PinHiddenByDefault))
TObjectPtr<UPoseAsset> PoseAsset;
public:
FAnimNode_PoseHandler()
:PoseAsset(nullptr)
{
}
// FAnimNode_AssetPlayerBase interface
virtual float GetCurrentAssetTime() const { return 0.f; }
virtual float GetCurrentAssetLength() const { return 0.f; }
// End of FAnimNode_AssetPlayerBase interface
// FAnimNode_Base interface
ANIMGRAPHRUNTIME_API virtual void Initialize_AnyThread(const FAnimationInitializeContext& Context) override;
ANIMGRAPHRUNTIME_API virtual void CacheBones_AnyThread(const FAnimationCacheBonesContext& Context) override;
ANIMGRAPHRUNTIME_API virtual void UpdateAssetPlayer(const FAnimationUpdateContext& Context) override;
ANIMGRAPHRUNTIME_API virtual void GatherDebugData(FNodeDebugData& DebugData) override;
// End of FAnimNode_Base interface
// FAnimNode_AssetPlayerBase Interface
virtual float GetAccumulatedTime() const {return 0.f;}
virtual void SetAccumulatedTime(float NewTime) {}
virtual UAnimationAsset* GetAnimAsset() const {return PoseAsset;}
// End of FAnimNode_AssetPlayerBase Interface
#if WITH_EDITORONLY_DATA
// Set the pose asset to use for this node
ANIMGRAPHRUNTIME_API void SetPoseAsset(UPoseAsset* InPoseAsset);
#endif
protected:
/** Called after CurrentPoseAsset is changed. */
virtual void OnPoseAssetChange() {}
TWeakObjectPtr<UPoseAsset> CurrentPoseAsset;
FAnimExtractContext PoseExtractContext;
// weight to blend pose per joint - has to be cached whenever cache bones for LOD
// note this is for mesh bone
TArray<float> BoneBlendWeights;
/* Rebuild pose list */
ANIMGRAPHRUNTIME_API virtual void RebuildPoseList(const FBoneContainer& InBoneContainer, const UPoseAsset* InPoseAsset);
/** Cache bone blend weights - called when pose asset changes */
ANIMGRAPHRUNTIME_API void CacheBoneBlendWeights(FAnimInstanceProxy* InstanceProxy);
private:
ANIMGRAPHRUNTIME_API void UpdatePoseAssetProperty(struct FAnimInstanceProxy* InstanceProxy);
};