Agrarsense
TickManager.h
Go to the documentation of this file.
1// Copyright (c) 2023 FrostBit Software Lab at the Lapland University of Applied Sciences
2//
3// This work is licensed under the terms of the MIT license.
4// For a copy, see <https://opensource.org/licenses/MIT>.
5
6#pragma once
7
8#include "CoreMinimal.h"
9#include "GameFramework/Actor.h"
10#include "UObject/Object.h"
11#include "Delegates/IDelegateInstance.h"
12#include "Async/TaskGraphInterfaces.h"
13#include "GenericPlatform/GenericPlatformMisc.h"
14#include "Engine/World.h"
15
16#include <functional>
17#include <algorithm>
18#include <vector>
19
20#include "TickManager.generated.h"
21
22UENUM(BlueprintType)
23enum class ETickType : uint8
24{
29 FullFrameTaskParallel UMETA(DisplayName = "FullFrameTaskParallel"),
30
35 LateTickParallel UMETA(DisplayName = "LateTickParallel"),
36
40 NONE UMETA(DisplayName = "NONE")
41};
42
43USTRUCT()
45{
46 GENERATED_BODY()
47
48 UPROPERTY()
49 UObject* Owner;
50
51 std::function<void(float)> Tick;
52
53 ETickType TickType = ETickType::NONE;
54
55 FTickEntry() : Owner(nullptr) {}
56
57 FTickEntry(UObject* InOwner, std::function<void(float)> InTickFunction, ETickType InType)
58 : Owner(InOwner), Tick(InTickFunction), TickType(InType) {}
59
60 bool operator==(const FTickEntry& Other) const
61 {
62 return Owner == Other.Owner && TickType == Other.TickType;
63 }
64};
65
87UCLASS()
88class AGRARSENSE_API ATickManager : public AActor
89{
90 GENERATED_BODY()
91
92public:
93
102 static FTickEntry AddTick(UObject* Object, std::function<void(float)> Function, ETickType Type);
103
113 static void RemoveTick(FTickEntry TickEntry);
114
115private:
116
117 virtual void BeginPlay() override;
118 virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
119
120 FDelegateHandle OnPreTickDelegate;
121 void PreTick(UWorld* World, ELevelTick TickType, float DeltaSeconds);
122
123 FDelegateHandle OnPostTickDelegate;
124 void PostTick(UWorld* World, ELevelTick TickType, float DeltaSeconds);
125
126 void FrameCleanup();
127
128 inline void TickFunctionsParallel(std::vector<FTickEntry>& functions, const float DeltaTime);
129
130 FGraphEventRef FullFrameTask;
131
133 static std::vector<FTickEntry> FullFrameTaskFunctions;
134 static std::vector<FTickEntry> LateTickFunctions;
135 static std::vector<FTickEntry> TicksToRemove;
136
137 inline static void AddTickInternal(std::vector<FTickEntry>& to, const FTickEntry& newTickEntry)
138 {
139 bool found = std::find_if(to.begin(), to.end(), [&](const FTickEntry& entry) {
140 return (entry.Owner == newTickEntry.Owner && entry.TickType == newTickEntry.TickType);
141 }) != to.end();
142
143 if (!found)
144 {
145 to.emplace_back(newTickEntry);
146 }
147#if WITH_EDITOR
148 else
149 {
150 UE_LOG(LogTemp, Warning, TEXT("TickManager.h: This entry already exists. Returning."));
151 }
152#endif
153 }
154
155 inline static void RemoveTickInternal(std::vector<FTickEntry>& from, FTickEntry tickEntry)
156 {
157 from.erase(std::remove(from.begin(), from.end(), tickEntry), from.end());
158 }
159};
160
161template <typename ObjectType, typename FunctionType>
162static auto BindTick(ObjectType* Object, FunctionType Function)
163{
164 return [Object, Function](float DeltaTime)
165 {
166 (Object->*Function)(DeltaTime);
167 };
168}
static auto BindTick(ObjectType *Object, FunctionType Function)
Definition: TickManager.h:162
ETickType
Definition: TickManager.h:24
FDelegateHandle OnPreTickDelegate
Definition: TickManager.h:120
static std::vector< FTickEntry > LateTickFunctions
Definition: TickManager.h:134
static std::vector< FTickEntry > TicksToRemove
Definition: TickManager.h:135
static void AddTickInternal(std::vector< FTickEntry > &to, const FTickEntry &newTickEntry)
Definition: TickManager.h:137
FGraphEventRef FullFrameTask
Definition: TickManager.h:130
FDelegateHandle OnPostTickDelegate
Definition: TickManager.h:123
static ATickManager * Instance
Definition: TickManager.h:132
static std::vector< FTickEntry > FullFrameTaskFunctions
Definition: TickManager.h:133
static void RemoveTickInternal(std::vector< FTickEntry > &from, FTickEntry tickEntry)
Definition: TickManager.h:155
bool operator==(const FTickEntry &Other) const
Definition: TickManager.h:60
UObject * Owner
Definition: TickManager.h:49
FTickEntry(UObject *InOwner, std::function< void(float)> InTickFunction, ETickType InType)
Definition: TickManager.h:57
ETickType TickType
Definition: TickManager.h:53