OLS/Source/OLSAnimation/Public/Data/OLSAnimationData.h
2025-08-01 12:43:20 +07:00

403 lines
11 KiB
C++

// © 2024 Long Ly. All rights reserved. Any unauthorized use, reproduction, or distribution of this trademark is strictly prohibited and may result in legal action.
#pragma once
#include "CoreMinimal.h"
#include "GameplayTagContainer.h"
#include "OLSEnumLibrary.h"
#include "OLSLocomotionData.h"
#include "UObject/Object.h"
#include "OLSAnimationData.generated.h"
USTRUCT(BlueprintType)
struct FOLSFeetPositionSettings
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, BlueprintReadOnly)
FName RightFootName = NAME_None;
UPROPERTY(EditAnywhere, BlueprintReadOnly)
FName LeftFootName = NAME_None;
};
USTRUCT(BlueprintType)
struct FOLSFeetPositionData
{
GENERATED_BODY()
public:
void DetermineIfRightFootIsFront();
bool IsRightFootIsFront() const;
public:
UPROPERTY(BlueprintReadWrite)
FTransform RootTransform = FTransform::Identity;
UPROPERTY(BlueprintReadWrite)
FVector RightFootLocation = FVector::ZeroVector;
UPROPERTY(BlueprintReadWrite)
FVector LeftFootLocation = FVector::ZeroVector;
protected:
UPROPERTY(BlueprintReadWrite)
uint8 bIsRightFootFront : 1 = false;
};
#pragma region Idle and Turn In-Place AnimSets
USTRUCT(BlueprintType)
struct FOLSTurnInPlaceAnimSet
{
GENERATED_BODY()
public:
FORCEINLINE class UAnimSequence* GetTurnInPlaceAnimationByDirection(const float direction) const;
public:
UPROPERTY(EditAnywhere, BlueprintReadOnly)
TObjectPtr<class UAnimSequence> TurnInPlace_90_L = nullptr;
UPROPERTY(EditAnywhere, BlueprintReadOnly)
TObjectPtr<class UAnimSequence> TurnInPlace_90_R = nullptr;
UPROPERTY(EditAnywhere, BlueprintReadOnly)
TObjectPtr<class UAnimSequence> TurnInPlace_180_L = nullptr;
UPROPERTY(EditAnywhere, BlueprintReadOnly)
TObjectPtr<class UAnimSequence> TurnInPlace_180_R = nullptr;
};
USTRUCT(BlueprintType)
struct FOLSIdleAnimSet
{
GENERATED_BODY()
public:
FORCEINLINE bool HasAnyIdleBreaks() const;
FORCEINLINE class UAnimSequence* GetIdleAnimation() const;
FORCEINLINE class UAnimSequence* GetRandomIdleBreakAnimation() const;
public:
UPROPERTY(EditAnywhere, BlueprintReadOnly)
TArray<class UAnimSequence*> IdleBreaks;
UPROPERTY(EditAnywhere, BlueprintReadOnly)
TObjectPtr<class UAnimSequence> Idle = nullptr;
UPROPERTY(EditAnywhere, BlueprintReadOnly)
TObjectPtr<class UAnimSequence> IdleExit = nullptr;
};
USTRUCT(BlueprintType)
struct FOLSIdleAndTurnInPlaceAnimSet
{
GENERATED_BODY()
public:
FORCEINLINE class UAnimSequence* GetIdleExitAnimation() const;
FORCEINLINE class UAnimSequence* GetIdleAnimation() const;
FORCEINLINE class UAnimSequence* GetRandomIdleBreakAnimation() const;
FORCEINLINE class UAnimSequence* GetTurnInPlaceAnimation(const float direction) const;
FORCEINLINE bool CanPlayIdleBreakAnimation() const;
public:
UPROPERTY(EditAnywhere, BlueprintReadOnly)
FOLSIdleAnimSet IdleAnimSet;
UPROPERTY(EditAnywhere, BlueprintReadOnly)
FOLSTurnInPlaceAnimSet TurnInPlaceAnimSet;
};
#pragma endregion
USTRUCT(BlueprintType)
struct FOLSMovementAnimSet_FeetPosition
{
GENERATED_BODY()
public:
class UAnimSequence* GetForwardLeftOrRightFoot(const bool isRightFootFarFromTarget) const;
public:
UPROPERTY(EditAnywhere, BlueprintReadOnly)
TObjectPtr<class UAnimSequence> LeftFoot = nullptr;
UPROPERTY(EditAnywhere, BlueprintReadOnly)
TObjectPtr<class UAnimSequence> RightFoot = nullptr;
};
#pragma region Forward Facing Anim Sets
USTRUCT(BlueprintType)
struct FOLSMovementAnimSet_ForwardFacing_StartCycle
{
GENERATED_BODY()
public:
class UAnimSequence* GetForwardLeftOrRightFoot(const bool isRightFootFarFromTarget) const;
class UAnimSequence* GetForward180LeftOrRightByAngle(const float angle) const;
class UAnimSequence* GetMovementAnimationByAngle(const EOLSCardinalDirection direction,
const float angle,
const bool isRightFootFarFromTarget) const;
public:
UPROPERTY(EditAnywhere, BlueprintReadOnly, meta = (DisplayName = "Start Forward Left or Right Foot"))
FOLSMovementAnimSet_FeetPosition Forward;
UPROPERTY(EditAnywhere, BlueprintReadOnly, meta = (DisplayName = "Start Forward Turn 180 Left"))
TObjectPtr<class UAnimSequence> Forward180L = nullptr;
UPROPERTY(EditAnywhere, BlueprintReadOnly, meta = (DisplayName = "Start Forward Turn 180 Right"))
TObjectPtr<class UAnimSequence> Forward180R = nullptr;
UPROPERTY(EditAnywhere, BlueprintReadOnly, meta = (DisplayName = "Start Forward Turn 90 Left"))
TObjectPtr<class UAnimSequence> Forward90L = nullptr;
UPROPERTY(EditAnywhere, BlueprintReadOnly, meta = (DisplayName = "Start Forward Turn 90 Right"))
TObjectPtr<class UAnimSequence> Forward90R = nullptr;
};
USTRUCT(BlueprintType)
struct FOLSMovementAnimSet_ForwardFacing_Pivot
{
GENERATED_BODY()
public:
class UAnimSequence* GetLeftOrRightByAngle(const float angle,
const bool isRightFootFarFromTarget) const;
public:
UPROPERTY(EditAnywhere, BlueprintReadOnly, meta = (DisplayName = "Pivot Turn 180 Left"))
FOLSMovementAnimSet_FeetPosition Pivot180L;
UPROPERTY(EditAnywhere, BlueprintReadOnly, meta = (DisplayName = "Pivot Turn 180 Right"))
FOLSMovementAnimSet_FeetPosition Pivot180R;
};
USTRUCT(BlueprintType)
struct FOLSMovementAnimSet_ForwardFacing_StopCycle
{
GENERATED_BODY()
public:
class UAnimSequence* GetLeftOrRightAnim(const bool isRightFootPlanted) const;
public:
UPROPERTY(EditAnywhere, BlueprintReadOnly, meta = (DisplayName = "Stop Left or Right Foot"))
FOLSMovementAnimSet_FeetPosition Stop;
};
#pragma endregion
USTRUCT(BlueprintType)
struct FOLSMovementAnimSet_CameraFacing_Directional
{
GENERATED_BODY()
protected:
void GetMovementAnimSetByCardinalDirection(const EOLSCardinalDirection& direction, FOLSMovementAnimSet_FeetPosition& outAnimSet) const;
public:
class UAnimSequence* GetMovementAnimByCardinalDirection(const EOLSCardinalDirection& direction, const bool isRightFootFarFromTarget) const;
public:
UPROPERTY(EditAnywhere, BlueprintReadOnly)
FOLSMovementAnimSet_FeetPosition Forward;
UPROPERTY(EditAnywhere, BlueprintReadOnly)
FOLSMovementAnimSet_FeetPosition Backward;
UPROPERTY(EditAnywhere, BlueprintReadOnly)
FOLSMovementAnimSet_FeetPosition Right;
UPROPERTY(EditAnywhere, BlueprintReadOnly)
FOLSMovementAnimSet_FeetPosition Left;
};
USTRUCT(BlueprintType)
struct FOLSGaitAnimSet
{
GENERATED_BODY()
public:
FOLSGaitAnimSet()
{
PlayRate_Start = FVector2D(.6f, 5.f);
PlayRate_Pivot = FVector2D(.6f, 5.f);
PlayRate_Cycle = FVector2D(.8f, 1.2f);
};
public:
void GetPlayRateByLocomotionState(const EOLSLocomotionStatePlayRate& state, FVector2D& outPlayRate) const;
public:
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Stance Anim Sets")
FVector2D PlayRate_Start = FVector2D::ZeroVector;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Stance Anim Sets")
FVector2D PlayRate_Pivot = FVector2D::ZeroVector;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Stance Anim Sets")
FVector2D PlayRate_Cycle = FVector2D::ZeroVector;
};
USTRUCT(BlueprintType)
struct FOLSGaitAnimSet_ForwardFacing : public FOLSGaitAnimSet
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Gait Anim Set")
FOLSMovementAnimSet_ForwardFacing_StartCycle StartCycle;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Gait Anim Set")
TObjectPtr<class UAnimSequence> Cycle = nullptr;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Gait Anim Set")
FOLSMovementAnimSet_ForwardFacing_Pivot Pivot;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Gait Anim Set")
FOLSMovementAnimSet_ForwardFacing_StopCycle StopCycle;
};
USTRUCT(BlueprintType)
struct FOLSGaitAnimSet_CameraFacing : public FOLSGaitAnimSet
{
GENERATED_BODY()
public:
const FOLSMovementAnimSet_CameraFacing_Directional& GetStartCycleFromHipDirection(const EOLSHipDirection hipDirection) const;
const FOLSMovementAnimSet_CameraFacing_Directional& GetCycleFromHipDirection(const EOLSHipDirection hipDirection) const;
const FOLSMovementAnimSet_CameraFacing_Directional& GetPivotFromHipDirection(const EOLSHipDirection hipDirection) const;
const FOLSMovementAnimSet_CameraFacing_Directional& GetStopCycleFromHipDirection(const EOLSHipDirection hipDirection) const;
public:
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Gait Anim Set | Hip Forward")
FOLSMovementAnimSet_CameraFacing_Directional StartCycle_HipForward;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Gait Anim Set | Hip Forward")
FOLSMovementAnimSet_CameraFacing_Directional Cycle_HipForward;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Gait Anim Set | Hip Forward")
FOLSMovementAnimSet_CameraFacing_Directional Pivot_HipForward;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Gait Anim Set | Hip Forward")
FOLSMovementAnimSet_CameraFacing_Directional StopCycle_HipForward;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Gait Anim Set | Hip Backward")
FOLSMovementAnimSet_CameraFacing_Directional StartCycle_HipBackward;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Gait Anim Set | Hip Backward")
FOLSMovementAnimSet_CameraFacing_Directional Cycle_HipBackward;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Gait Anim Set | Hip Backward")
FOLSMovementAnimSet_CameraFacing_Directional Pivot_HipBackward;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Gait Anim Set | Hip Backward")
FOLSMovementAnimSet_CameraFacing_Directional StopCycle_HipBackward;
};
USTRUCT(BlueprintType)
struct FOLSGaitAnimSets
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Gait Anim Sets")
FOLSGaitAnimSet_ForwardFacing GaitAnimSet_ForwardFacing;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Gait Anim Sets")
FOLSGaitAnimSet_CameraFacing GaitAnimSet_CameraFacing;
public:
static FOLSGaitAnimSets EmptyAnimSet;
};
USTRUCT(BlueprintType)
struct FOLSStanceAnimSets
{
GENERATED_BODY()
public:
FOLSStanceAnimSets() = default;
FOLSStanceAnimSets(const FOLSStanceAnimSets&) = default;
FOLSStanceAnimSets(FOLSStanceAnimSets&&) = default;
FOLSStanceAnimSets& operator=(const FOLSStanceAnimSets&) = default;
FOLSStanceAnimSets& operator=(FOLSStanceAnimSets&&) = default;
virtual ~FOLSStanceAnimSets() = default;
public:
class UAnimSequence* GetIdleAnimation() const;
class UAnimSequence* GetIdleExitAnimation() const;
class UAnimSequence* GetRandomIdleBreakAnimation() const;
class UAnimSequence* GetTurnInPlaceAnimation(const float direction) const;
virtual bool CanPlayIdleBreakAnimation() const;
public:
virtual const FOLSGaitAnimSets& GetGaitAnimSetByGait(const EOLSGait& gait) const;
public:
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Stance Anim Sets")
FOLSIdleAndTurnInPlaceAnimSet IdleAndTurnInPlaceAnimSet;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Stance Anim Sets")
FOLSGaitAnimSets WalkAnimSets;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Stance Anim Sets")
uint8 bUseFeetPosition : 1 = false;
};
USTRUCT(BlueprintType)
struct FOLSStanceAnimSets_Standing : public FOLSStanceAnimSets
{
GENERATED_BODY()
public:
virtual const FOLSGaitAnimSets& GetGaitAnimSetByGait(const EOLSGait& gait) const override;
public:
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Stance Anim Sets")
FOLSGaitAnimSets JogAnimSets;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Stance Anim Sets")
FOLSGaitAnimSets SprintAnimSets;
};