// © 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 TurnInPlace_90_L = nullptr; UPROPERTY(EditAnywhere, BlueprintReadOnly) TObjectPtr TurnInPlace_90_R = nullptr; UPROPERTY(EditAnywhere, BlueprintReadOnly) TObjectPtr TurnInPlace_180_L = nullptr; UPROPERTY(EditAnywhere, BlueprintReadOnly) TObjectPtr 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 IdleBreaks; UPROPERTY(EditAnywhere, BlueprintReadOnly) TObjectPtr Idle = nullptr; UPROPERTY(EditAnywhere, BlueprintReadOnly) TObjectPtr 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 LeftFoot = nullptr; UPROPERTY(EditAnywhere, BlueprintReadOnly) TObjectPtr 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 Forward180L = nullptr; UPROPERTY(EditAnywhere, BlueprintReadOnly, meta = (DisplayName = "Start Forward Turn 180 Right")) TObjectPtr Forward180R = nullptr; UPROPERTY(EditAnywhere, BlueprintReadOnly, meta = (DisplayName = "Start Forward Turn 90 Left")) TObjectPtr Forward90L = nullptr; UPROPERTY(EditAnywhere, BlueprintReadOnly, meta = (DisplayName = "Start Forward Turn 90 Right")) TObjectPtr 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 Forward; UPROPERTY(EditAnywhere, BlueprintReadOnly, meta = (DisplayName = "B")) TObjectPtr Backward; UPROPERTY(EditAnywhere, BlueprintReadOnly, meta = (DisplayName = "LL")) TObjectPtr LeftLeft; UPROPERTY(EditAnywhere, BlueprintReadOnly, meta = (DisplayName = "LR")) TObjectPtr LeftRight; UPROPERTY(EditAnywhere, BlueprintReadOnly, meta = (DisplayName = "RL")) TObjectPtr RightLeft; UPROPERTY(EditAnywhere, BlueprintReadOnly, meta = (DisplayName = "RR")) TObjectPtr 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 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; };