// © 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 FOLSRotationMatchingData { GENERATED_BODY() public: UPROPERTY(BlueprintReadWrite, Category = "RotationMatchingData") float TargetAngle = 0.0f; UPROPERTY(BlueprintReadWrite, Category = "RotationMatchingData") float CurrentAccelDir = 0.0f; UPROPERTY(BlueprintReadWrite, Category = "RotationMatchingData") float EntryAccelDir = 0.0f; UPROPERTY(BlueprintReadWrite, Category = "RotationMatchingData") float EntryRotYaw = 0.0f; UPROPERTY(BlueprintReadWrite, Category = "RotationMatchingData") float DesiredYaw = 0.0f; UPROPERTY(BlueprintReadWrite, Category = "RotationMatchingData") uint8 AnimHasRotationLeft : 1 = true; }; USTRUCT(BlueprintType) struct FOLSTurnInPlaceAnimSet { GENERATED_BODY() public: FORCEINLINE class UAnimSequence* GetTurnInPlaceAnimationByDirection(const float direction) const; public: UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "TurnInPlace Anim Set") TObjectPtr TurnInPlace_90_L = nullptr; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "TurnInPlace Anim Set") TObjectPtr TurnInPlace_90_R = nullptr; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "TurnInPlace Anim Set") TObjectPtr TurnInPlace_180_L = nullptr; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "TurnInPlace Anim Set") TObjectPtr TurnInPlace_180_R = nullptr; }; USTRUCT(BlueprintType) struct FOLSAimAnimSet { GENERATED_BODY() public: UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Aim Anim Set") TObjectPtr AimPose = nullptr; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Aim Anim Set") TObjectPtr IdleAimOffset = nullptr; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Aim Anim Set") TObjectPtr RelaxedAimOffset = 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, Category = "Idle Anim Set") TArray IdleBreaks; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Idle Anim Set") TObjectPtr Idle = nullptr; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Idle Anim Set") 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, Category = "Idle and Turn In Place Anim Set") FOLSIdleAnimSet IdleAnimSet; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Idle and Turn In Place Anim Set") FOLSTurnInPlaceAnimSet TurnInPlaceAnimSet; }; USTRUCT(BlueprintType) struct FOLSMovementAnimSet { GENERATED_BODY() public: class UAnimSequence* GetMovementAnimationByCardinalDirection(const EOLSCardinalDirection& direction) const; public: UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Movement Cycle Anim Set") TObjectPtr Forward = nullptr; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Movement Cycle Anim Set") TObjectPtr Backward = nullptr; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Movement Cycle Anim Set") TObjectPtr Right = nullptr; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Movement Cycle Anim Set") TObjectPtr Left = nullptr; }; USTRUCT(BlueprintType) struct FOLSMovementAnimSet_ForwardFacing_StartCycle { GENERATED_BODY() public: class UAnimSequence* GetForwardLeftOrRightFoot(const float feetPositionValue) const; class UAnimSequence* GetForward180LeftOrRight(const float angle) const; class UAnimSequence* GetMovementAnimationByAngle(const EOLSCardinalDirection direction, const float angle, const float feetPositionValue) const; public: UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Movement Start Cycle Anim Set") TObjectPtr Forward_L = nullptr; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Movement Start Cycle Anim Set") TObjectPtr Forward_R = nullptr; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Movement Start Cycle Anim Set") TObjectPtr Forward180_L = nullptr; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Movement Start Cycle Anim Set") TObjectPtr Forward180_R = nullptr; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Movement Start Cycle Anim Set") TObjectPtr Right = nullptr; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Movement Start Cycle Anim Set") TObjectPtr Left = nullptr; }; USTRUCT(BlueprintType) struct FOLSMovementAnimSet_ForwardFacing_Stop { GENERATED_BODY() public: class UAnimSequence* GetLeftOrRightStopAnim(const float feetPosition) const; public: UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Movement Stop Anim Set") TObjectPtr StopL = nullptr; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Movement Stop Anim Set") TObjectPtr StopR = nullptr; }; USTRUCT(BlueprintType) struct FOLSMovementAnimSet_ForwardFacing_Pivot { GENERATED_BODY() public: UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Movement Pivot Anim Set") TObjectPtr Pivot180L = nullptr; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Movement Pivot Anim Set") TObjectPtr Pivot180R = nullptr; }; USTRUCT(BlueprintType) struct FOLSMovementAnimSets_ForwardFacing_Pivot { GENERATED_BODY() protected: void GetLeftOrRightAnimSet(const bool isLeftFootPlanted, const bool isRightFootPlanted, FOLSMovementAnimSet_ForwardFacing_Pivot& outAnimSet) const; void GetLeftOrRightAnimSet(float feetPosition, FOLSMovementAnimSet_ForwardFacing_Pivot& outAnimSet) const; public: class UAnimSequence* GetLeftOrRightAnim(const float angle, const bool isLeftFootPlanted, const bool isRightFootPlanted, float& outPivotTime) const; class UAnimSequence* GetLeftOrRightAnim(const float angle, const float feetPosition, float& outPivotTime) const; public: UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Movement Pivot Anim Set") FOLSMovementAnimSet_ForwardFacing_Pivot Pivot_LeftFoot; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Movement Pivot Anim Set") FOLSMovementAnimSet_ForwardFacing_Pivot Pivot_RightFoot; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Movement Pivot Anim Set") float PivotTime = 0.0f; }; 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 = "Gait Anim Sets") FVector2D PlayRate_Start = FVector2D::ZeroVector; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Gait Anim Sets") FVector2D PlayRate_Pivot = FVector2D::ZeroVector; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Gait 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") FOLSMovementAnimSets_ForwardFacing_Pivot Pivot; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Gait Anim Set") FOLSMovementAnimSet_ForwardFacing_Stop Stop; }; USTRUCT(BlueprintType) struct FOLSGaitAnimSet_CameraFacing : public FOLSGaitAnimSet { GENERATED_BODY() public: const FOLSMovementAnimSet& GetStartCycleFromHipDirection(const EOLSHipDirection hipDirection) const; const FOLSMovementAnimSet& GetCycleFromHipDirection(const EOLSHipDirection hipDirection) const; const FOLSMovementAnimSet& GetPivotFromHipDirection(const EOLSHipDirection hipDirection) const; const FOLSMovementAnimSet& GetStopCycleFromHipDirection(const EOLSHipDirection hipDirection) const; public: UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Gait Anim Set | Hip Forward") FOLSMovementAnimSet StartCycle_HipForward; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Gait Anim Set | Hip Forward") FOLSMovementAnimSet Cycle_HipForward; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Gait Anim Set | Hip Forward") FOLSMovementAnimSet Pivot_HipForward; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Gait Anim Set | Hip Forward") FOLSMovementAnimSet StopCycle_HipForward; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Gait Anim Set | Hip Backward") FOLSMovementAnimSet StartCycle_HipBackward; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Gait Anim Set | Hip Backward") FOLSMovementAnimSet Cycle_HipBackward; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Gait Anim Set | Hip Backward") FOLSMovementAnimSet Pivot_HipBackward; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Gait Anim Set | Hip Backward") FOLSMovementAnimSet 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; }; 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; };