ArticyXImporter
ArticyXImporter for Unreal Engine
Loading...
Searching...
No Matches
ArticyDatabase.h
1//
2// Copyright (c) 2023 articy Software GmbH & Co. KG. All rights reserved.
3//
4
5#pragma once
6
7#include "Engine/DataAsset.h"
8#include "ArticyBaseObject.h"
9#include "ShadowStateManager.h"
10#include "ArticyObject.h"
11#include "ArticyPackage.h"
12#include "AssetRegistry/AssetData.h"
13#include "ArticyDatabase.generated.h"
14
16struct FArticyId;
19
23USTRUCT(BlueprintType)
25{
26 GENERATED_BODY()
27
28
37 FArticyObjectShadow(uint32 ShadowLevel, UArticyObject* Object, int32 CloneId, UObject* Outer = nullptr)
38 : ShadowLevel(ShadowLevel), Object(Object), Outer(Outer), CloneId(CloneId) {}
39
40public:
41 UPROPERTY()
42 uint32 ShadowLevel = 0;
52 int32 GetCloneId() const { return CloneId; }
53private:
54 UPROPERTY()
55 UArticyObject* Object = nullptr;
56
57 TWeakObjectPtr<UObject> Outer;
58
59 int32 CloneId;
60};
61
65USTRUCT(BlueprintType)
66struct ARTICYRUNTIME_API FArticyShadowableObject
67{
68 GENERATED_BODY()
69
70public:
79 explicit FArticyShadowableObject(UArticyObject* Object, int32 CloneId, UObject* Outer = nullptr);
80
87 UArticyObject* Get(const IShadowStateManager* ShadowManager, bool ForceUnshadowed = false) const;
88
89private:
90
96 UPROPERTY(VisibleAnywhere, Category = "Articy")
97 mutable TArray<FArticyObjectShadow> ShadowCopies;
98};
99
103UCLASS(BlueprintType)
104class ARTICYRUNTIME_API UArticyCloneableObject : public UObject
105{
106 GENERATED_BODY()
107
108public:
113 void Init(UArticyObject* InitialClone) { AddClone(InitialClone, 0); }
114
115 //========================================//
116
125 UArticyObject* Get(const IShadowStateManager* ShadowManager, int32 CloneId = 0, bool bForceUnshadowed = false) const;
135 UArticyObject* Clone(const IShadowStateManager* ShadowManager, int32 CloneId, bool bFailIfExists = true);
136
137private:
138
143 UPROPERTY(VisibleAnywhere, Category = "Articy")
144 TMap<int32, FArticyShadowableObject> Clones;
145
151 void AddClone(UArticyObject* Clone, int32 CloneId);
152};
153
157USTRUCT(BlueprintType)
158struct ARTICYRUNTIME_API FArticyDatabaseObjectArray
159{
160 GENERATED_BODY()
161
162public:
163 UPROPERTY()
165};
166
170UCLASS(Config = Game)
171class ARTICYRUNTIME_API UArticyDatabase : public UDataAsset, public IShadowStateManager
172{
173 GENERATED_BODY()
174
175public:
176
177 UArticyDatabase();
178
183 virtual FPrimaryAssetId GetPrimaryAssetId() const override { return FPrimaryAssetId(FName(TEXT("ArticyDatabase")), GetFName()); }
184
186 void Init();
187
192 UFUNCTION(BlueprintCallable, Category = "Articy|Lifecycle")
193 static void Initialize(const UObject* WorldContext);
194
199 UFUNCTION(BlueprintCallable, Category = "Articy|Lifecycle")
200 static void Deinitialize(const UObject* WorldContext);
201
207 static UArticyDatabase* Get(const UObject* WorldContext);
208
213 virtual UArticyGlobalVariables* GetGVs() const;
219 virtual UArticyGlobalVariables* GetRuntimeGVs(UArticyAlternativeGlobalVariables* Asset) const;
220
222 UFUNCTION(BlueprintCallable, Category = "Articy")
223 void UnloadDatabase();
224
230 UFUNCTION(BlueprintCallable, Category = "Script Methods")
231 void SetDefaultUserMethodsProvider(UObject* MethodProvider);
232
239 UFUNCTION(BlueprintPure, meta = (DisplayName = "Is in shadow state?"), Category = "Script Methods")
240 bool IsInShadowState() const { return GetShadowLevel() > 0; }
241
246 UFUNCTION(BlueprintPure, meta = (DisplayName = "Get imported package names"), Category = "Articy")
247 TArray<FString> GetImportedPackageNames() const;
248
254 UFUNCTION(BlueprintPure, meta = (DisplayName = "Is package default package?"), Category = "Articy")
255 bool IsPackageDefaultPackage(FString PackageName);
256
257 //---------------------------------------------------------------------------//
258
263 static void LoadAllObjects();
264
269 virtual void SetLoadedPackages(const TArray<UArticyPackage*> Packages);
270
272 virtual void LoadDefaultPackages();
273
275 virtual void LoadAllPackages(bool bDefaultOnly = false);
276
281 UFUNCTION(BlueprintCallable, Category = "Articy")
282 virtual void LoadPackage(FString PackageName);
283
290 UFUNCTION(BlueprintCallable, Category = "Articy")
291 virtual bool UnloadPackage(const FString PackageName, const bool bQuickUnload);
292
293 //---------------------------------------------------------------------------//
294
304 UFUNCTION(BlueprintCallable, Category = "Articy", meta = (DeterminesOutputType = "CastTo", AdvancedDisplay = "CloneId"))
305 UArticyObject* GetObject(FArticyId Id, int32 CloneId = 0, TSubclassOf<class UArticyObject> CastTo = NULL) const;
306 template<typename T>
307 T* GetObject(FArticyId Id, int32 CloneId = 0) const { return Cast<T>(GetObject(Id, CloneId)); }
308
317 UArticyObject* GetObjectUnshadowed(FArticyId Id, int32 CloneId = 0) const;
318
329 UFUNCTION(BlueprintCallable, Category = "Articy", meta = (DeterminesOutputType = "CastTo", AdvancedDisplay = "CloneId"))
330 UArticyObject* GetObjectByName(FName TechnicalName, int32 CloneId = 0, TSubclassOf<class UArticyObject> CastTo = NULL) const;
331 template<typename T>
332 T* GetObjectByName(FName TechnicalName, int32 CloneId = 0) const { return Cast<T>(GetObjectByName(TechnicalName, CloneId)); }
333
334 /****
335 * Get an object by its Articy String Representation.
336 * Use this method to get an Articy Id from a Global Variable String typed
337 * that contains the result of an Expresso GetObj(---) method.
338 * @param StringID_CloneID The string representation of the object's ID and clone ID.
339 * @param CastTo The class to cast the object to.
340 * @return A pointer to the Articy object, or nullptr if not found.
341 *****/
342 UFUNCTION(BlueprintCallable, Category = "Articy", meta = (DeterminesOutputType = "CastTo", AdvancedDisplay = "CloneId"))
343 UArticyObject* GetObjectFromStringRepresentation(FString StringID_CloneID, TSubclassOf<class UArticyObject> CastTo = NULL) const;
344 template<typename T>
345 T* GetObjectFromStringRepresentation(FString StringID_CloneID) const { return Cast<T>(GetObjectFromStringRepresentation(StringID_CloneID)); }
346
357 template<typename T>
358 TArray<T*> GetObjects(FName TechnicalName, int32 CloneId = 0) const;
368 UFUNCTION(BlueprintCallable, Category = "Articy", meta = (DeterminesOutputType = "CastTo", AdvancedDisplay = "CloneId"))
369 TArray<UArticyObject*> GetObjects(FName TechnicalName, int32 CloneId = 0, TSubclassOf<class UArticyObject> CastTo = NULL) const;
370
378 template<typename T>
379 TArray<T*> GetObjectsOfClass(int32 CloneId = 0) const;
380
389 UFUNCTION(BlueprintCallable, Category = "Articy", meta = (DeterminesOutputType = "Class", AdvancedDisplay = "CloneId"))
390 TArray<UArticyObject*> GetObjectsOfClass(TSubclassOf<class UArticyObject> Class, int32 CloneId = 0) const;
391
396 UFUNCTION(BlueprintCallable, Category = "Articy")
397 TArray<UArticyObject*> GetAllObjects() const;
398
407 template<typename T = UArticyObject>
408 void GetObjects(TArray<T*>& Array, FName TechnicalName, int32 CloneId = 0) const;
409
410 //---------------------------------------------------------------------------//
411
421 UFUNCTION(BlueprintCallable, Category = "Articy", meta = (DeterminesOutputType = "CastTo"))
422 UArticyObject* CloneFrom(FArticyId Id, int32 NewCloneId = -1, TSubclassOf<class UArticyObject> CastTo = NULL);
423 template<typename T>
424 T* CloneFrom(FArticyId Id, int32 NewCloneId = -1) { return Cast<T>(CloneFrom(Id, NewCloneId)); }
425
435 UFUNCTION(BlueprintCallable, Category = "Articy", meta = (DeterminesOutputType = "CastTo"))
436 UArticyObject* CloneFromByName(FName TechnicalName, int32 NewCloneId = -1, TSubclassOf<class UArticyObject> CastTo = NULL);
437 template<typename T>
438 T* CloneFrom(FName TechnicalName, int32 NewCloneId = -1) { return Cast<T>(CloneFromByName(TechnicalName, NewCloneId)); }
439
446 UFUNCTION(BlueprintCallable, Category = "Articy", meta = (DeterminesOutputType = "CastTo"))
447 UArticyObject* GetOrClone(FArticyId Id, int32 NewCloneId);
448 template<typename T>
449 T* GetOrClone(FArticyId Id, int32 NewCloneId) { return Cast<T>(GetOrClone(Id, NewCloneId)); }
450
457 UFUNCTION(BlueprintCallable, Category = "Articy", meta = (DeterminesOutputType = "CastTo"))
458 UArticyObject* GetOrCloneByName(const FName& TechnicalName, int32 NewCloneId);
459 template<typename T>
460 T* GetOrClone(const FName& TechnicalName, int32 NewCloneId) { return Cast<T>(GetOrCloneByName(TechnicalName, NewCloneId)); }
461
462 //---------------------------------------------------------------------------//
463
469 UArticyExpressoScripts* GetExpressoInstance() const;
470
474 static TWeakObjectPtr<UArticyDatabase> GetMutableOriginal();
475
481 void ChangePackageDefault(FName PackageName, bool bIsDefaultPackage);
482
483 UFUNCTION(BlueprintCallable, Category = "Articy")
484 void SetExpressoScriptsClass(TSubclassOf<UArticyExpressoScripts> NewClass);
485
486protected:
487
489 UPROPERTY(VisibleAnywhere, Category = "Articy")
491
492 UPROPERTY(VisibleAnywhere, transient, Category = "Articy")
493 TArray<FString> LoadedPackages;
494
495 UPROPERTY()
496 TMap<FArticyId, UArticyCloneableObject*> LoadedObjectsById;
497 UPROPERTY()
498 TMap<FName, FArticyDatabaseObjectArray> LoadedObjectsByName;
499
500 UPROPERTY(Transient)
501 bool bIsInitialized = false;
502
503 void UnloadAllPackages();
504
505private:
506
507 static TMap<TWeakObjectPtr<UWorld>, TWeakObjectPtr<UArticyDatabase>> Clones;
508 static TWeakObjectPtr<UArticyDatabase> PersistentClone;
509
510 UPROPERTY()
511 mutable UArticyExpressoScripts* CachedExpressoScripts;
512
514 UPROPERTY(Config, VisibleAnywhere, Category = "Articy")
515 TSubclassOf<UArticyExpressoScripts> ExpressoScriptsClass;
516
517 UArticyObject* GetObjectInternal(FArticyId Id, int32 CloneId = 0, bool bForceUnshadowed = false) const;
518
523 static const UArticyDatabase* GetOriginal(bool bLoadDefaultPackages = false);
524
529 struct FAssetId
530 {
531 FName technicalName;
532 FString s_uniqueID;
533 uint64 uniqueID;
534 };
535
537 static FAssetId ResolveIDs(const FString& articyAssetFileName);
538};
539
540template<typename T>
541TArray<T*> UArticyDatabase::GetObjects(FName TechnicalName, int32 CloneId) const
542{
543 static TArray<T*> Array;
544 Array.Reset();
545
546 GetObjects(Array, TechnicalName, CloneId);
547
548 return Array;
549}
550
551template<typename T>
552TArray<T*> UArticyDatabase::GetObjectsOfClass(int32 CloneId) const
553{
554 TArray<T*> arr;
555
556 TArray<UArticyCloneableObject*> ArticyObjects;
557 LoadedObjectsById.GenerateValueArray(ArticyObjects);
558
559 for (auto obj : ArticyObjects)
560 {
561 /*if (obj->GetCloneId() == CloneId && Cast<T>(obj))
562 {
563 arr.Add(obj);
564 }*/
565
566 UArticyObject* Object = obj->Get(this, CloneId, false);
567 if (Object)
568 {
569 T* TypedObject = Cast<T>(Object);
570 if (TypedObject)
571 {
572 arr.Add(TypedObject);
573 }
574 }
575 }
576 return arr;
577}
578
579template<typename T>
580void UArticyDatabase::GetObjects(TArray<T*>& Array, FName TechnicalName, int32 CloneId) const
581{
582 //find all objects with this name
583 auto arr = LoadedObjectsByName.Find(TechnicalName);
584 if (arr)
585 {
586 for (auto obj : arr->Objects)
587 {
588 auto clone = Cast<T>(obj->Clone(this, CloneId));
589 if (clone)
590 Array.Add(clone);
591 }
592 }
593}
Definition ShadowStateManager.h:24
A data asset class for managing alternative global variables in the Articy runtime.
Definition ArticyAlternativeGlobalVariables.h:19
Definition ArticyDatabase.h:105
void Init(UArticyObject *InitialClone)
Definition ArticyDatabase.h:113
Definition ArticyDatabase.h:172
bool IsInShadowState() const
Definition ArticyDatabase.h:240
TArray< T * > GetObjectsOfClass(int32 CloneId=0) const
Definition ArticyDatabase.h:552
TArray< T * > GetObjects(FName TechnicalName, int32 CloneId=0) const
Definition ArticyDatabase.h:541
void UnloadAllPackages()
Definition ArticyDatabase.cpp:532
virtual FPrimaryAssetId GetPrimaryAssetId() const override
Definition ArticyDatabase.h:183
TMap< FString, UArticyPackage * > ImportedPackages
Definition ArticyDatabase.h:490
The UArticyExpressoScripts class manages script conditions and instructions.
Definition ArticyExpressoScripts.h:819
Definition ArticyGlobalVariables.h:479
Definition ArticyObject.h:19
Definition ArticyPackage.h:15
Definition ArticyDatabase.h:159
TArray< UArticyCloneableObject * > Objects
Definition ArticyDatabase.h:164
Definition ArticyBaseTypes.h:18
Definition ArticyDatabase.h:25
FArticyObjectShadow()
Definition ArticyDatabase.h:29
uint32 ShadowLevel
Definition ArticyDatabase.h:42
int32 GetCloneId() const
Definition ArticyDatabase.h:52
FArticyObjectShadow(uint32 ShadowLevel, UArticyObject *Object, int32 CloneId, UObject *Outer=nullptr)
Definition ArticyDatabase.h:37
UArticyObject * GetObject()
Definition ArticyDatabase.cpp:17
Definition ArticyDatabase.h:67
UArticyObject * Get(const IShadowStateManager *ShadowManager, bool ForceUnshadowed=false) const
Definition ArticyDatabase.cpp:40
FArticyShadowableObject()=default