ArticyXImporter
ArticyXImporter for Unreal Engine
Loading...
Searching...
No Matches
ArticyFlowPlayer.h
1//
2// Copyright (c) 2023 articy Software GmbH & Co. KG. All rights reserved.
3//
4
5#pragma once
6
7#include "ArticyBranch.h"
8#include "ArticyBranchSorters.h"
9#include "ArticyRuntimeModule.h"
10#include "ArticyDatabase.h"
11#include "ArticyGlobalVariables.h"
12#include "ArticyPausableType.h"
13#include "ArticyRef.h"
14#include "Components/BillboardComponent.h"
15#include "Containers/Queue.h"
16#include "ArticyFlowPlayer.generated.h"
17
18struct FArticyBranch;
19class IArticyNode;
21
27UCLASS(BlueprintType, ClassGroup = "Articy", meta = (BlueprintSpawnableComponent))
28class ARTICYRUNTIME_API UArticyFlowPlayer : public UActorComponent
29{
30 GENERATED_BODY()
31
32public:
33
34 void BeginPlay() override;
35 void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
36
37 //---------------------------------------------------------------------------//
38
39 //EArticyPausableType
40 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Setup", meta = (Bitmask, BitmaskEnum = "/Script/ArticyRuntime.EArticyPausableType"))
41 uint8 PauseOn = 1 << uint8(EArticyPausableType::DialogueFragment)
42 | 1 << uint8(EArticyPausableType::Dialogue)
43 | 1 << uint8(EArticyPausableType::FlowFragment);
44
49 template<typename Lambda>
50 void ShadowedOperation(Lambda Operation) const;
51
52 uint32 GetShadowLevel() const { return ShadowLevel; }
53
54 //---------------------------------------------------------------------------//
55
57 UFUNCTION(BlueprintCallable, meta = (DisplayName = "Set Start Node (ArticyRef)"), Category = "Setup")
58 void SetStartNode(FArticyRef NewId);
59
60 UFUNCTION(BlueprintCallable, meta = (DisplayName = "Set Start Node (ArticyID)"), Category = "Setup")
61 void SetStartNodeById(FArticyId NewId);
62
64 UFUNCTION(BlueprintCallable, meta = (DisplayName = "Set Start Node (FlowObject)"), Category = "Setup")
65 void SetStartNodeWithFlowObject(TScriptInterface<IArticyFlowObject> Node);
66
68 UFUNCTION(BlueprintCallable, meta = (DisplayName = "Get Start Node"), Category = "Setup")
69 FArticyRef GetStartNode() { return StartOn; }
70
72 UFUNCTION(BlueprintCallable, meta = (DisplayName = "Set Ignore Invalid Branches"), Category = "Setup")
73 void SetIgnoreInvalidBranches(bool bNewIgnoreInvalidBranches) { bIgnoreInvalidBranches = bNewIgnoreInvalidBranches; }
74
76 UFUNCTION(BlueprintCallable, Category = "Flow")
77 void SetCursorTo(TScriptInterface<IArticyFlowObject> Node);
78
80 UFUNCTION(BlueprintCallable, Category = "Flow")
81 const TScriptInterface<IArticyFlowObject> GetCursor() const { return Cursor; }
82
84 UFUNCTION(BlueprintCallable, Category = "Flow")
85 void Play(int Index = 0);
86
88 UFUNCTION(BlueprintCallable, Category = "Flow")
89 void FinishCurrentPausedObject(int PinIndex = 0);
90
95 UFUNCTION(BlueprintCallable, Category = "Flow")
96 void PlayBranch(const FArticyBranch& Branch);
97
98 //---------------------------------------------------------------------------//
99
105 TArray<FArticyBranch> Explore(IArticyFlowObject* Node, bool bShadowed, int32 Depth, bool IncludeCurrent = true);
106
107 void SetPauseOn(EArticyPausableType Types);
109 bool ShouldPauseOn(IArticyFlowObject* Node) const;
110
111 UFUNCTION(BlueprintCallable, Category = "Flow")
112 bool ShouldPauseOn(TScriptInterface<IArticyFlowObject> Node) const;
113
117 UFUNCTION(BlueprintCallable, Category = "Setup")
118 UArticyGlobalVariables* GetGVs() const;
119
123 UFUNCTION(BlueprintPure, Category = "Setup")
124 UObject* GetMethodsProvider();
125
126 //---------------------------------------------------------------------------//
127
129 UFUNCTION(BlueprintCallable, Category = "Flow")
130 void UpdateAvailableBranches();
131
133 UFUNCTION(BlueprintCallable, Category = "Flow")
134 const TArray<FArticyBranch>& GetAvailableBranches() const { return AvailableBranches; }
135
136 //---------------------------------------------------------------------------//
137
139 UFUNCTION(BlueprintCallable, Category = "Setup")
141
142 bool OnTick(float DeltaTime);
143
144 DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnPushState);
145 DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnPopState);
146 DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnPlayerPaused, TScriptInterface<IArticyFlowObject>, PausedOn);
147 DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnBranchesUpdated, const TArray<FArticyBranch>&, AvailableBranches);
148
149
151 UPROPERTY(BlueprintAssignable, Category = "Flow")
152 FOnPushState OnShadowOpStart;
153
155 UPROPERTY(BlueprintAssignable, Category = "Flow")
156 FOnPopState OnShadowOpEnd;
157
162 UPROPERTY(BlueprintAssignable, Category = "Flow")
163 FOnPlayerPaused OnPlayerPaused;
164
168 UPROPERTY(BlueprintAssignable, Category = "Flow")
169 FOnBranchesUpdated OnBranchesUpdated;
170
171protected:
172
173 //========================================//
174
178 // [Alewinn] : no valid reference in code, limit most probably set at Articy side.
179 //UPROPERTY(EditAnywhere, Category = "Setup", meta=(ClampMin=0))
180 //int32 BranchLimit = 32;
181
185 UPROPERTY(EditAnywhere, Category = "Setup", meta = (ClampMin = 0))
186 int32 ExploreLimit = 128;
187
192 UPROPERTY(EditAnywhere, Category = "Setup")
194
198 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Setup")
200
201 UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Setup", meta = (ArticyClassRestriction = "ArticyNode"))
202 FArticyRef StartOn;
203
205 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Flow")
207
211 TFunction<bool(const FArticyBranch&, const FArticyBranch&)> SortBranches = ArticyBranchSorters::FArticyBranchPositionSorter();
212
213 //---------------------------------------------------------------------------//
214
222 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Setup")
224
232 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Setup")
233 mutable UObject* UserMethodsProvider;
234
235private:
237 UPROPERTY(Transient, VisibleAnywhere, Category = "Debug")
238 mutable uint32 ShadowLevel = 0;
239
240 TQueue<FArticyBranch> BranchQueue;
241 FTSTicker::FDelegateHandle TickerHandle;
242
243 UArticyExpressoScripts* CachedExpressoInstance = nullptr;
244
245private:
252 void UpdateAvailableBranchesInternal(bool Startup);
253
255 UPROPERTY(Transient)
256 TScriptInterface<IArticyFlowObject> Cursor = nullptr;
257
259 void SetCursorToStartNode();
260
265 bool FastForwardToPause();
266
268 IArticyFlowObject* GetUnshadowedNode(IArticyFlowObject* Node);
269
270 UArticyDatabase* GetDB() const;
271};
272
273//---------------------------------------------------------------------------//
274// TEMPLATED METHODS
275//---------------------------------------------------------------------------//
276
283template<typename Lambda>
284void UArticyFlowPlayer::ShadowedOperation(Lambda Operation) const
285{
286 if (std::is_null_pointer<Lambda>::value)
287 return;
288 if (!ensure(GetGVs()))
289 {
290 UE_LOG(LogArticyRuntime, Warning, TEXT("FlowPlayer cannot get GVs!"));
291 return;
292 }
293 if (!ensure(ShadowLevel < ShadowLevelLimit))
294 {
295 UE_LOG(LogArticyRuntime, Warning, TEXT("More than 100 nested ShadowedOperations, probably there's an infinite loop in the Flow!"));
296 return;
297 }
298
299 //push shadow state
300 ++ShadowLevel;
301
302 //notify on push
303 GetGVs()->PushState(ShadowLevel);
304 GetGVs()->PushSeen();
305 UArticyDatabase::Get(this)->PushState(ShadowLevel);
306 OnShadowOpStart.Broadcast();
307
308 //execute the operation
309 Operation();
310
311 //notify on pop
312 OnShadowOpEnd.Broadcast();
313 UArticyDatabase::Get(this)->PopState(ShadowLevel);
314 GetGVs()->PopSeen();
315 GetGVs()->PopState(ShadowLevel);
316
317 //pop shadow state
318 if (ensure(ShadowLevel > 0))
319 --ShadowLevel;
320}
321
325UCLASS(BlueprintType, HideCategories = (Replication, Physics, Rendering, Input, Collision, Actor, LOD, Cooking))
326class AArticyFlowDebugger : public AActor
327{
328 GENERATED_BODY()
329
330public:
332public:
333 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Articy")
334 UArticyFlowPlayer* FlowPlayer = nullptr;
335private:
336
337 UPROPERTY()
338 UBillboardComponent* ArticyImporterIcon = nullptr;
339};
AArticyFlowDebugger()
Definition ArticyFlowPlayer.cpp:644
Definition ArticyFlowObject.h:23
virtual void Explore(UArticyFlowPlayer *Player, TArray< FArticyBranch > &OutBranches, const uint32 &Depth)=0
A data asset class for managing alternative global variables in the Articy runtime.
Definition ArticyAlternativeGlobalVariables.h:19
Definition ArticyDatabase.h:172
static UArticyDatabase * Get(const UObject *WorldContext)
Definition ArticyDatabase.cpp:217
The UArticyExpressoScripts class manages script conditions and instructions.
Definition ArticyExpressoScripts.h:819
Definition ArticyFlowPlayer.h:29
UArticyGlobalVariables * GetGVs() const
Definition ArticyFlowPlayer.cpp:204
FOnPlayerPaused OnPlayerPaused
Definition ArticyFlowPlayer.h:163
TArray< FArticyBranch > AvailableBranches
Definition ArticyFlowPlayer.h:206
uint8 ShadowLevelLimit
Definition ArticyFlowPlayer.h:193
UFUNCTION(BlueprintCallable, meta=(DisplayName="Set Start Node (ArticyRef)"), Category="Setup") void SetStartNode(FArticyRef NewId)
const TScriptInterface< IArticyFlowObject > GetCursor() const
Definition ArticyFlowPlayer.h:81
int32 ExploreLimit
Definition ArticyFlowPlayer.h:186
TFunction< bool(const FArticyBranch &, const FArticyBranch &)> SortBranches
Definition ArticyFlowPlayer.h:211
bool bIgnoreInvalidBranches
Definition ArticyFlowPlayer.h:199
void SetIgnoreInvalidBranches(bool bNewIgnoreInvalidBranches)
Definition ArticyFlowPlayer.h:73
void BeginPlay() override
Definition ArticyFlowPlayer.cpp:28
void ShadowedOperation(Lambda Operation) const
Definition ArticyFlowPlayer.h:284
bool IgnoresInvalidBranches() const
Definition ArticyFlowPlayer.h:140
UArticyAlternativeGlobalVariables * OverrideGV
Definition ArticyFlowPlayer.h:223
FArticyRef GetStartNode()
Definition ArticyFlowPlayer.h:69
UObject * UserMethodsProvider
Definition ArticyFlowPlayer.h:233
void EndPlay(const EEndPlayReason::Type EndPlayReason) override
Definition ArticyFlowPlayer.cpp:42
FOnPopState OnShadowOpEnd
Definition ArticyFlowPlayer.h:156
FOnBranchesUpdated OnBranchesUpdated
Definition ArticyFlowPlayer.h:169
FOnPushState OnShadowOpStart
Definition ArticyFlowPlayer.h:152
const TArray< FArticyBranch > & GetAvailableBranches() const
Definition ArticyFlowPlayer.h:134
Definition ArticyGlobalVariables.h:479
Definition ArticyBranch.h:16
Definition ArticyBaseTypes.h:18
Definition ArticyRef.h:13