QuickTween 1.4.1
Loading...
Searching...
No Matches
QuickTweenSequence.h
1// Copyright 2025 Juan Pablo Hernandez Mosti. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
6#include "CommonValues.h"
7#include "QuickTweenable.h"
8#include "UObject/Object.h"
9#include "../Utils/LoopType.h"
10#include "QuickTweenSequence.generated.h"
11
12class UQuickTweenBase;
14
15DEFINE_LOG_CATEGORY_STATIC(LogQuickTweenSequence, Log, All);
16
17DECLARE_MULTICAST_DELEGATE_OneParam(FNativeDelegateTweenSequence, UQuickTweenSequence*);
18DECLARE_DYNAMIC_DELEGATE_OneParam(FDynamicDelegateTweenSequence, UQuickTweenSequence*, TweenSequence);
19
20
24USTRUCT()
26{
27 GENERATED_BODY()
28
29
30 UPROPERTY()
32
34 float StartTime = 0.0f;
35
37 float Duration = 0.0f;
38};
39
47UCLASS(BlueprintType)
48class QUICKTWEEN_API UQuickTweenSequence : public UQuickTweenable
49{
50 GENERATED_BODY()
51
52private:
53 UQuickTweenSequence() = default;
54
58 void SetUp(
59 const UObject* worldContextObject,
60 int32 loops = 1,
61 ELoopType loopType = ELoopType::Restart,
62 const FString& id = FString(),
63 bool bShouldAutoKill = true,
64 bool bShouldPlayWhilePaused = false);
65
66public:
67 virtual ~UQuickTweenSequence() override;
68
69#pragma region Sequence Creation
70
82 static UQuickTweenSequence* CreateSequence(
83 UObject* worldContextObject,
84 int32 loops = 1,
85 ELoopType loopType = ELoopType::Restart,
86 const FString& id = FString(),
87 bool bShouldAutoKill = true,
88 bool bShouldPlayWhilePaused = false)
89 {
90 UQuickTweenSequence* sequence = NewObject<UQuickTweenSequence>(worldContextObject);
91 sequence->SetUp(
92 worldContextObject,
93 loops,
94 loopType,
95 id,
96 bShouldAutoKill,
97 bShouldPlayWhilePaused);
98 return sequence;
99 }
100
106 UFUNCTION(BlueprintCallable, meta = (Keywords = "Sequence"), Category = "Sequence|Creation")
108
114 UFUNCTION(BlueprintCallable, meta = (Keywords = "Sequence"), Category = "Sequence|Creation")
116
117 virtual void SetOwner(UQuickTweenable* owner) override { Owner = owner; }
118#pragma endregion
119
120#pragma region Sequence Control
121public:
122
123 virtual void Play() override;
124
125 virtual void Pause() override;
126
127 virtual void Reverse() override;
128
129 virtual void Complete(bool bSnapToEnd = true) override;
130
131 virtual void Restart() override;
132
133 virtual void Kill() override;
134
135 virtual void Update(float deltaTime) override;
136
137 virtual void Evaluate(const FQuickTweenEvaluatePayload& payload, const UQuickTweenable* instigator) override;
138
139 [[nodiscard]] virtual bool GetIsPendingKill() const override { return SequenceState == EQuickTweenState::Kill; }
140#pragma endregion
141
142
143#pragma region Sequence State Queries
144public:
145
146 [[nodiscard]] virtual bool GetIsPlaying() const override { return SequenceState == EQuickTweenState::Play;}
147
148 [[nodiscard]] virtual float GetTimeScale() const override { return 1.0f; }
149
150 [[nodiscard]] virtual bool GetIsReversed() const override { return bIsReversed; }
151
152 [[nodiscard]] virtual EEaseType GetEaseType() const override { return EEaseType::Linear; }
153
154 [[nodiscard]] virtual UCurveFloat* GetEaseCurve() const override { return nullptr; }
155
156 [[nodiscard]] virtual bool GetAutoKill() const override { return bAutoKill; }
157
158 [[nodiscard]] virtual bool GetIsCompleted() const override { return SequenceState == EQuickTweenState::Complete; }
159
160 [[nodiscard]] virtual float GetLoopDuration() const override;
161
162 [[nodiscard]] virtual float GetTotalDuration() const override
163 {
164 if (Loops == INFINITE_LOOPS)
165 {
166 return TNumericLimits<float>::Max();
167 }
168 return GetLoopDuration() * GetLoops() / GetTimeScale();
169 };
170
171 [[nodiscard]] virtual float GetElapsedTime() const override { return ElapsedTime; }
172
173 [[nodiscard]] virtual int32 GetLoops() const override { return Loops; }
174
175 [[nodiscard]] virtual int32 GetCurrentLoop() const override { return CurrentLoop; }
176
177 [[nodiscard]] virtual ELoopType GetLoopType() const override { return LoopType; }
178
179 [[nodiscard]] virtual FString GetTweenTag() const override { return SequenceTweenId; }
180
181 [[nodiscard]] virtual bool GetShouldPlayWhilePaused() const override { return bPlayWhilePaused; }
182
187 UFUNCTION(BlueprintCallable, meta = (Keywords = "Sequence"), Category = "Sequence|State")
188 [[nodiscard]] int32 GetNumTweens() const;
189
195 UFUNCTION(BlueprintCallable, meta = (Keywords = "Sequence"), Category = "Sequence|State")
196 [[nodiscard]] UQuickTweenable* GetTween(int32 index) const;
197
198#pragma endregion
199
200#pragma region Delegates
201public:
202
208 UFUNCTION(BlueprintCallable, meta = (Keywords = "Tween | Event"), Category = "Tween|Info")
209 void AssignOnStartEvent(FDynamicDelegateTweenSequence callback);
210
216 UFUNCTION(BlueprintCallable, meta = (Keywords = "Tween | Event"), Category = "Tween|Info")
217 void AssignOnUpdateEvent(FDynamicDelegateTweenSequence callback);
218
224 UFUNCTION(BlueprintCallable, meta = (Keywords = "Tween | Event"), Category = "Tween|Info")
225 void AssignOnCompleteEvent(FDynamicDelegateTweenSequence callback);
226
232 UFUNCTION(BlueprintCallable, meta = (Keywords = "Tween | Event"), Category = "Tween|Info")
233 void AssignOnKilledEvent(FDynamicDelegateTweenSequence callback);
234
240 UFUNCTION(BlueprintCallable, meta = (Keywords = "Tween | Event"), Category = "Tween|Info")
241 void AssignOnLoopEvent(FDynamicDelegateTweenSequence callback);
242
247 UFUNCTION(BlueprintCallable, meta = (Keywords = "Tween | Event"), Category = "Tween|Info")
248 void RemoveAllOnStartEvent(const UObject* object);
249
254 UFUNCTION(BlueprintCallable, meta = (Keywords = "Tween | Event"), Category = "Tween|Info")
255 void RemoveAllOnUpdateEvent(const UObject* object);
256
261 UFUNCTION(BlueprintCallable, meta = (Keywords = "Tween | Event"), Category = "Tween|Info")
262 void RemoveAllOnCompleteEvent(const UObject* object);
263
268 UFUNCTION(BlueprintCallable, meta = (Keywords = "Tween | Event"), Category = "Tween|Info")
269 void RemoveAllOnKilledEvent(const UObject* object);
270
275 UFUNCTION(BlueprintCallable, meta = (Keywords = "Tween | Event"), Category = "Tween|Info")
276 void RemoveAllOnLoopEvent(const UObject* object);
277
279 FNativeDelegateTweenSequence OnStart;
280
282 FNativeDelegateTweenSequence OnUpdate;
283
285 FNativeDelegateTweenSequence OnComplete;
286
288 FNativeDelegateTweenSequence OnKilled;
289
291 FNativeDelegateTweenSequence OnLoop;
292#pragma endregion
293
294private:
295
296 struct FQuickTweenSequenceStateResult
297 {
298 int32 Loop = 0;
299 float LoopLocalTime = 0.0f;
300 };
301
312 FQuickTweenSequenceStateResult ComputeSequenceState(float time) const;
313
323 void SeekTime(float loopLocalTime);
324
325 bool InstigatorIsOwner(const UQuickTweenable* instigator) const
326 {
327 return instigator == Owner;
328 }
329
330 bool HasOwner() const { return Owner != nullptr; }
331
337 void HandleOnStart();
338
344 void HandleOnComplete();
345
351 void HandleOnKill();
352
360 bool RequestStateTransition(EQuickTweenState newState);
361
363 EQuickTweenState SequenceState = EQuickTweenState::Idle;
364
366 UPROPERTY(Transient)
367 TArray<FQuickTweenSequenceGroup> TweenGroups;
368
370 float ElapsedTime = 0.0f;
371
373 bool bIsReversed = false;
374
376 bool bWasActive = false;
377
379 float PreviousLoopLocalTime = 0.0f;
380
382 bool bSnapToEndOnComplete = true;
383
385 bool bTriggerEvents = true;
386
388 int32 CurrentLoop = 1;
389
391 int32 Loops = -1;
392
394 ELoopType LoopType = ELoopType::Restart;
395
397 FString SequenceTweenId;
398
400 bool bAutoKill = true;
401
403 bool bPlayWhilePaused = false;
404
406 UPROPERTY(Transient)
407 const UObject* WorldContextObject = nullptr;
408
409 UPROPERTY(Transient)
410 UQuickTweenable* Owner = nullptr;
411
412};
Definition QuickTweenBase.h:26
Definition QuickTweenSequence.h:49
virtual bool GetIsPlaying() const override
Definition QuickTweenSequence.h:146
UQuickTweenSequence * Append(UQuickTweenable *tween)
Definition QuickTweenSequence.cpp:83
virtual float GetTimeScale() const override
Definition QuickTweenSequence.h:148
FNativeDelegateTweenSequence OnComplete
Definition QuickTweenSequence.h:285
virtual float GetTotalDuration() const override
Definition QuickTweenSequence.h:162
void AssignOnStartEvent(FDynamicDelegateTweenSequence callback)
Definition QuickTweenSequence.cpp:495
UQuickTweenable * GetTween(int32 index) const
Definition QuickTweenSequence.cpp:366
void AssignOnKilledEvent(FDynamicDelegateTweenSequence callback)
Definition QuickTweenSequence.cpp:510
virtual void Play() override
Definition QuickTweenSequence.cpp:380
virtual void Kill() override
Definition QuickTweenSequence.cpp:436
virtual bool GetShouldPlayWhilePaused() const override
Definition QuickTweenSequence.h:181
UQuickTweenSequence * Join(UQuickTweenable *tween)
Definition QuickTweenSequence.cpp:48
virtual void Complete(bool bSnapToEnd=true) override
Definition QuickTweenSequence.cpp:418
void RemoveAllOnLoopEvent(const UObject *object)
Definition QuickTweenSequence.cpp:540
virtual float GetLoopDuration() const override
Definition QuickTweenSequence.cpp:346
static UQuickTweenSequence * CreateSequence(UObject *worldContextObject, int32 loops=1, ELoopType loopType=ELoopType::Restart, const FString &id=FString(), bool bShouldAutoKill=true, bool bShouldPlayWhilePaused=false)
Definition QuickTweenSequence.h:82
virtual void Pause() override
Definition QuickTweenSequence.cpp:397
void RemoveAllOnCompleteEvent(const UObject *object)
Definition QuickTweenSequence.cpp:530
virtual ELoopType GetLoopType() const override
Definition QuickTweenSequence.h:177
virtual EEaseType GetEaseType() const override
Definition QuickTweenSequence.h:152
virtual bool GetIsReversed() const override
Definition QuickTweenSequence.h:150
void RemoveAllOnKilledEvent(const UObject *object)
Definition QuickTweenSequence.cpp:535
virtual bool GetIsCompleted() const override
Definition QuickTweenSequence.h:158
virtual int32 GetCurrentLoop() const override
Definition QuickTweenSequence.h:175
void AssignOnCompleteEvent(FDynamicDelegateTweenSequence callback)
Definition QuickTweenSequence.cpp:505
void AssignOnLoopEvent(FDynamicDelegateTweenSequence callback)
Definition QuickTweenSequence.cpp:515
FNativeDelegateTweenSequence OnLoop
Definition QuickTweenSequence.h:291
virtual void Update(float deltaTime) override
Definition QuickTweenSequence.cpp:124
virtual int32 GetLoops() const override
Definition QuickTweenSequence.h:173
void AssignOnUpdateEvent(FDynamicDelegateTweenSequence callback)
Definition QuickTweenSequence.cpp:500
FNativeDelegateTweenSequence OnKilled
Definition QuickTweenSequence.h:288
void RemoveAllOnUpdateEvent(const UObject *object)
Definition QuickTweenSequence.cpp:525
virtual void SetOwner(UQuickTweenable *owner) override
Definition QuickTweenSequence.h:117
FNativeDelegateTweenSequence OnStart
Definition QuickTweenSequence.h:279
virtual void Restart() override
Definition QuickTweenSequence.cpp:411
virtual FString GetTweenTag() const override
Definition QuickTweenSequence.h:179
virtual bool GetIsPendingKill() const override
Definition QuickTweenSequence.h:139
FNativeDelegateTweenSequence OnUpdate
Definition QuickTweenSequence.h:282
virtual void Evaluate(const FQuickTweenEvaluatePayload &payload, const UQuickTweenable *instigator) override
Definition QuickTweenSequence.cpp:172
void RemoveAllOnStartEvent(const UObject *object)
Definition QuickTweenSequence.cpp:520
virtual float GetElapsedTime() const override
Definition QuickTweenSequence.h:171
virtual UCurveFloat * GetEaseCurve() const override
Definition QuickTweenSequence.h:154
virtual void Reverse() override
Definition QuickTweenSequence.cpp:404
int32 GetNumTweens() const
Definition QuickTweenSequence.cpp:356
virtual bool GetAutoKill() const override
Definition QuickTweenSequence.h:156
Definition QuickTweenable.h:24
Definition CommonValues.h:52
Definition QuickTweenSequence.h:26
TArray< UQuickTweenable * > Tweens
Definition QuickTweenSequence.h:31
float StartTime
Definition QuickTweenSequence.h:34
float Duration
Definition QuickTweenSequence.h:37