463 lines
12 KiB
C++
463 lines
12 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"
|
|
|
|
UENUM(BlueprintType)
|
|
enum class EOLSMovementDirection : uint8
|
|
{
|
|
EForward UMETA(DisplayName = "F"),
|
|
EBackward UMETA(DisplayName = "B"),
|
|
ELeftLeft UMETA(DisplayName = "LL"),
|
|
ELeftRight UMETA(DisplayName = "LR"),
|
|
ERightLeft UMETA(DisplayName = "RL"),
|
|
ERightRight UMETA(DisplayName = "RR")
|
|
};
|
|
|
|
UENUM(BlueprintType)
|
|
enum class EOLSMovementDirectionBias : uint8
|
|
{
|
|
ELeftFoot_F UMETA(DisplayName = "Left Foot Forward"),
|
|
ERightFoot_F UMETA(DisplayName = "Right Foot Forward"),
|
|
};
|
|
|
|
USTRUCT(BlueprintType)
|
|
struct FOLSMovementDirectionThresholds
|
|
{
|
|
GENERATED_BODY()
|
|
|
|
public:
|
|
|
|
static void UpdateThresholds(const float fl,
|
|
const float fr,
|
|
const float bl,
|
|
const float br,
|
|
FOLSMovementDirectionThresholds& outMovementThresholds);
|
|
|
|
public:
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
|
float FL = -60.f;
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
|
float FR = 60.f;
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
|
float BL = -120.f;
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
|
float BR = 120.f;
|
|
};
|
|
|
|
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 IsRightFootFront() 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 isRightFootFront) const;
|
|
class UAnimSequence* GetForward90LeftOrRightByAngle(const float angle) const;
|
|
class UAnimSequence* GetForward180LeftOrRightByAngle(const float angle) const;
|
|
class UAnimSequence* GetMovementAnimationByAngle(const float angle,
|
|
const bool isRightFootFront) 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_Cycle
|
|
{
|
|
GENERATED_BODY()
|
|
|
|
public:
|
|
|
|
class UAnimSequence* GetMovementAnimByCardinalDirection(const EOLSMovementDirection& direction) const;
|
|
|
|
public:
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, meta = (DisplayName = "F"))
|
|
TObjectPtr<class UAnimSequence> Forward;
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, meta = (DisplayName = "B"))
|
|
TObjectPtr<class UAnimSequence> Backward;
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, meta = (DisplayName = "LL"))
|
|
TObjectPtr<class UAnimSequence> LeftLeft;
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, meta = (DisplayName = "LR"))
|
|
TObjectPtr<class UAnimSequence> LeftRight;
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, meta = (DisplayName = "RL"))
|
|
TObjectPtr<class UAnimSequence> RightLeft;
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, meta = (DisplayName = "RR"))
|
|
TObjectPtr<class UAnimSequence> RightRight;
|
|
};
|
|
|
|
USTRUCT(BlueprintType)
|
|
struct FOLSMovementAnimSet_CameraFacing_Directional
|
|
{
|
|
GENERATED_BODY()
|
|
|
|
protected:
|
|
|
|
void GetMovementAnimSetByCardinalDirection(const EOLSMovementDirection& direction, FOLSMovementAnimSet_FeetPosition& outAnimSet) const;
|
|
|
|
public:
|
|
|
|
class UAnimSequence* GetMovementAnimByCardinalDirection(const EOLSMovementDirection& direction, const bool isRightFootFarFromTarget) const;
|
|
|
|
public:
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, meta = (DisplayName = "F"))
|
|
FOLSMovementAnimSet_FeetPosition Forward;
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, meta = (DisplayName = "B"))
|
|
FOLSMovementAnimSet_FeetPosition Backward;
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, meta = (DisplayName = "LL"))
|
|
FOLSMovementAnimSet_FeetPosition LeftLeft;
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, meta = (DisplayName = "LR"))
|
|
FOLSMovementAnimSet_FeetPosition LeftRight;
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, meta = (DisplayName = "RL"))
|
|
FOLSMovementAnimSet_FeetPosition RightLeft;
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, meta = (DisplayName = "RR"))
|
|
FOLSMovementAnimSet_FeetPosition RightRight;
|
|
};
|
|
|
|
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:
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Gait Anim Set")
|
|
FOLSMovementAnimSet_CameraFacing_Directional StartCycle;
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Gait Anim Set")
|
|
FOLSMovementAnimSet_CameraFacing_Directional_Cycle Cycle;
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Gait Anim Set")
|
|
FOLSMovementAnimSet_CameraFacing_Directional Pivot;
|
|
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Gait Anim Set")
|
|
FOLSMovementAnimSet_CameraFacing_Directional StopCycle;
|
|
};
|
|
|
|
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;
|
|
};
|
|
|
|
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;
|
|
}; |