UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
WorldPartitionActorDesc.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
4#if WITH_EDITOR
5#include "CoreMinimal.h"
6#include "PropertyPairsMap.h"
7#include "UObject/NameTypes.h"
14#include "Misc/Guid.h"
15#include "Misc/TVariant.h"
19
21class UActorComponent;
22
23// Struct used to create actor descriptor
25{
27 : DataSource(TInPlaceType<TArray<uint8>>(), TArray<uint8>())
28 {}
29
32 {}
33
34 UClass* NativeClass;
35 FName PackageName;
36 FSoftObjectPath ActorPath;
37
39 {
40 check(DataSource.IsType<TArray<uint8>>());
41 return DataSource.Get<TArray<uint8>>();
42 }
43
44 const TArray<uint8>& GetSerializedData() const
45 {
46 check(DataSource.IsType<TArray<uint8>>());
47 return DataSource.Get<TArray<uint8>>();
48 }
49
50 FActorDescArchive* GetArchive() const
51 {
52 check(DataSource.IsType<FActorDescArchive*>());
53 return DataSource.Get<FActorDescArchive*>();
54 }
55
56 bool IsUsingArchive() const
57 {
58 return DataSource.IsType<FActorDescArchive*>();
59 }
60
62 FWorldPartitionActorDescInitData& SetPackageName(FName InPackageName) { PackageName = InPackageName; return *this; }
64
65private:
66 // Provide SerializedData or an already initialized Archive
68};
69
71{
73 : bIsValid(false)
74 { }
75
79 , Extents(ForceInit)
80 , bIsValid(false)
81 { }
82
86 , Extents(InExtents)
87 , bIsValid(true)
88 { }
89
92 {
93 if (InBox.IsValid)
94 {
95 InBox.GetCenterAndExtents(Center, Extents);
97 bIsValid = true;
98 }
99 }
100
101 bool Equals(const FWorldPartitionRelativeBounds& Other, double Tolerance = UE_KINDA_SMALL_NUMBER) const
102 {
103 return (!bIsValid && !Other.bIsValid)
104 || ((bIsValid && Other.bIsValid) && Center.Equals(Other.Center, Tolerance) && Rotation.Equals(Other.Rotation, Tolerance) && Extents.Equals(Other.Extents, Tolerance));
105 }
106
107 bool IsValid() const
108 {
109 return bIsValid;
110 }
111
112 FBox ToAABB() const
113 {
115
116 if (bIsValid)
117 {
118 double X = Extents.X;
119 double Y = Extents.Y;
120 double Z = Extents.Z;
121
122 Result += Rotation * FVector(-X, -Y, -Z) + Center;
123 Result += Rotation * FVector( X, -Y, -Z) + Center;
124 Result += Rotation * FVector(-X, Y, -Z) + Center;
125 Result += Rotation * FVector( X, Y, -Z) + Center;
126 Result += Rotation * FVector(-X, -Y, Z) + Center;
127 Result += Rotation * FVector( X, -Y, Z) + Center;
128 Result += Rotation * FVector(-X, Y, Z) + Center;
129 Result += Rotation * FVector( X, Y, Z) + Center;
130 }
131
132 return Result;
133 }
134
135 FString ToString() const
136 {
137 return FString::Printf(TEXT("IsValid=%s, Center=(%s), Rotation=(%s), Extents=(%s)"), bIsValid ? TEXT("true") : TEXT("false"), *Center.ToString(), *Rotation.Euler().ToString(), *Extents.ToString());
138 }
139
141 {
142 return Ar << Bounds.Center << Bounds.Rotation << Bounds.Extents << Bounds.bIsValid;
143 }
144
145 [[nodiscard]] FWorldPartitionRelativeBounds TransformBy(const FTransform& Transform) const
146 {
147 if (!bIsValid)
148 {
150 }
151
153 NewBounds.Center = Transform.TransformPosition(Center);
154 NewBounds.Rotation = Transform.GetRotation() * Rotation;
155 NewBounds.Extents = Extents * Transform.GetScale3D();
156 NewBounds.bIsValid = true;
157
158 return NewBounds;
159 }
160
161 [[nodiscard]] FWorldPartitionRelativeBounds InverseTransformBy(const FTransform& Transform) const
162 {
163 if (!bIsValid)
164 {
166 }
167
169 NewBounds.Center = Transform.InverseTransformPosition(Center);
170 NewBounds.Rotation = Transform.GetRotation().Inverse() * Rotation;
171 NewBounds.Extents = Extents * FTransform::GetSafeScaleReciprocal(Transform.GetScale3D());
172 NewBounds.bIsValid = true;
173
174 return NewBounds;
175 }
176
177private:
180 FVector Extents;
181 bool bIsValid;
182};
183
185{
187 virtual bool DoPatch(FString& InOutString) = 0;
188 virtual bool DoPatch(FName& InOutName) = 0;
189 virtual bool DoPatch(FSoftObjectPath& InOutSoft) = 0;
190 virtual bool DoPatch(FTopLevelAssetPath& InOutPath) = 0;
191};
192
193class AActor;
194class UWorldPartition;
200
201enum class EContainerClusterMode : uint8
202{
203 Partitioned, // Per Actor Partitioning
204};
205
206template <typename T, class F>
207inline bool CompareUnsortedArrays(const TArray<T>& Array1, const TArray<T>& Array2, F Func)
208{
209 if (Array1.Num() == Array2.Num())
210 {
213 SortedArray1.Sort(Func);
214 SortedArray2.Sort(Func);
215 return SortedArray1 == SortedArray2;
216 }
217 return false;
218}
219
220template <typename T>
221inline bool CompareUnsortedArrays(const TArray<T>& Array1, const TArray<T>& Array2)
222{
223 return CompareUnsortedArrays(Array1, Array2, [](const T& A, const T& B) { return A < B; });
224}
225
226template <>
228{
229 return CompareUnsortedArrays(Array1, Array2, [](const FName& A, const FName& B) { return A.LexicalLess(B); });
230}
231#endif // WITH_EDITOR
232
237{
238#if WITH_EDITOR
240 FName Name;
241
243 {
244 return Ar << ComponentDescInitData.Type << ComponentDescInitData.Name;
245 }
246#endif // WITH_EDITOR
247};
248
250{
251#if WITH_EDITOR
252 friend class FActorDescArchive;
253 friend class FWorldPartitionActorDesc;
254
255public:
257
258 virtual uint32 GetSizeOf() const = 0;
259 ENGINE_API virtual void Init(const UActorComponent* InComponent);
260 ENGINE_API virtual void Serialize(FArchive& Ar);
261
262 inline FTopLevelAssetPath GetBaseClass() const { return BaseClass; }
263 inline FTopLevelAssetPath GetNativeClass() const { return NativeClass; }
264 inline UClass* GetComponentNativeClass() const { return ComponentNativeClass; }
265
266 inline FString ToString() const
267 {
268 return FString::Printf(TEXT("BaseClass=%s, NativeClass=%s, ComponentName=%s"), *BaseClass.ToString(), *NativeClass.ToString(), *ComponentName.ToString());
269 }
270
271protected:
273
274 FTopLevelAssetPath BaseClass;
275 FTopLevelAssetPath NativeClass;
277 FName ComponentName;
278#endif // WITH_EDITOR
279};
280
282{
283#if WITH_EDITOR
284 friend class AActor;
285 friend class UWorldPartition;
286 friend struct FWorldPartitionHandleImpl;
287 friend struct FWorldPartitionReferenceImpl;
288 friend struct FWorldPartitionActorDescUtils;
290 friend class FAssetHeaderPatcherInner;
291 friend class FActorDescArchive;
294 friend class FPropertyOverrideUtils;
295 template<class U> friend class TActorDescContainerCollection;
296
297public:
298 struct FContainerInstance
299 {
304
305 UE_DEPRECATED(5.4, "Use FLoadedContainerInstance instead")
306 ULevel* LoadedLevel = nullptr;
307
308 UE_DEPRECATED(5.4, "Use FLoadedContainerInstance instead")
310
311 UE_DEPRECATED(5.4, "Use ContainerInstance instead")
312 const UActorDescContainer* Container = nullptr;
313 };
314
315 virtual ~FWorldPartitionActorDesc() {}
316
317 inline const FGuid& GetGuid() const { return Guid; }
318
319 inline FTopLevelAssetPath GetBaseClass() const { return BaseClass; }
320 inline FTopLevelAssetPath GetNativeClass() const { return NativeClass; }
321 inline UClass* GetActorNativeClass() const { return ActorNativeClass; }
322
323 inline FName GetRuntimeGrid() const { return RuntimeGrid; }
324 inline bool GetIsSpatiallyLoaded() const { return RuntimeBounds.IsValid ? bIsSpatiallyLoaded : false; }
325 inline bool GetIsSpatiallyLoadedRaw() const { return bIsSpatiallyLoaded; }
326 inline bool GetActorIsEditorOnly() const { return bActorIsEditorOnly; }
328 inline bool GetActorIsRuntimeOnly() const { return bActorIsRuntimeOnly; }
329
330 inline bool GetActorIsHLODRelevant() const { return bActorIsHLODRelevant; }
331 inline FSoftObjectPath GetHLODLayer() const { return HLODLayer; }
332 ENGINE_API TArray<FName> GetDataLayers(bool bIncludeExternalDataLayer = true) const;
333 ENGINE_API FName GetExternalDataLayer() const;
334 inline const FSoftObjectPath& GetExternalDataLayerAsset() const { return ExternalDataLayerAsset; }
335
336 inline const TArray<FName>& GetTags() const { return Tags; }
337
338 inline FName GetActorPackage() const { return ActorPackage; }
339 inline FSoftObjectPath GetActorSoftPath() const { return ActorPath; }
340 inline FName GetActorLabel() const { return ActorLabel; }
341 inline FName GetFolderPath() const { return FolderPath; }
342 inline const FGuid& GetFolderGuid() const { return FolderGuid; }
343 inline const FTransform& GetActorTransform() const { return ActorTransform; }
344
347
348 inline const FGuid& GetParentActor() const { return ParentActor; }
349 inline bool IsUsingDataLayerAsset() const { return bIsUsingDataLayerAsset; }
350 inline void AddProperty(FName PropertyName, FName PropertyValue = NAME_None) { Properties.AddProperty(PropertyName, PropertyValue); }
351 inline bool GetProperty(FName PropertyName, FName* PropertyValue) const { return Properties.GetProperty(PropertyName, PropertyValue); }
352 inline bool HasProperty(FName PropertyName) const { return Properties.HasProperty(PropertyName); }
354
355 ENGINE_API FName GetActorName() const;
358
359 // Faster accessors for names as strings
360 ENGINE_API const FString& GetActorNameString() const;
361 ENGINE_API const FString& GetActorLabelString() const;
362 ENGINE_API const FString& GetDisplayClassNameString() const;
363
364 inline bool IsDefaultActorDesc() const { return bIsDefaultActorDesc; }
365
366 virtual bool IsChildContainerInstance() const { return false; }
367 virtual FName GetChildContainerPackage() const { return NAME_None; }
368 virtual FString GetChildContainerName() const { return FString(); }
370 virtual const FWorldPartitionActorFilter* GetChildContainerFilter() const { return nullptr; }
371 virtual UActorDescContainer* GetChildContainer() const { return nullptr; }
372
374
375 virtual const FGuid& GetSceneOutlinerParent() const { return GetParentActor(); }
376 virtual bool IsResaveNeeded() const { return bIsSpatiallyLoaded && !RuntimeBounds.IsValid; }
377
379
380 bool operator==(const FWorldPartitionActorDesc& Other) const
381 {
382 return Guid == Other.Guid;
383 }
384
385 friend uint32 GetTypeHash(const FWorldPartitionActorDesc& Key)
386 {
387 return GetTypeHash(Key.Guid);
388 }
389
390 //~ Begin Deprecation
391 UE_DEPRECATED(5.1, "SetIsSpatiallyLoadedRaw is deprecated and should not be used.")
392 inline void SetIsSpatiallyLoadedRaw(bool bNewIsSpatiallyLoaded) { bIsSpatiallyLoaded = bNewIsSpatiallyLoaded; }
393
395 UE_DEPRECATED(5.2, "GetOrigin is deprecated.")
396 inline FVector GetOrigin() const { return GetBounds().GetCenter(); }
397
398 UE_DEPRECATED(5.2, "GetBounds is deprecated, GetEditorBounds or GetRuntimeBounds should be used instead.")
399 FBox GetBounds() const { return GetEditorBounds(); }
401
402 UE_DEPRECATED(5.2, "ShouldValidateRuntimeGrid is deprecated and should not be used")
403 virtual bool ShouldValidateRuntimeGrid() const { return true; }
404
405 UE_DEPRECATED(5.3, "GetLevelPackage is deprecated use GetChildContainerPackage instead")
406 virtual FName GetLevelPackage() const { return GetChildContainerPackage(); }
407
408 UE_DEPRECATED(5.4, "Use FWorldPartitionActorDescInstance::HasResolvedDataLayerInstanceNames")
409 inline bool HasResolvedDataLayerInstanceNames() const { return false; }
410
411 UE_DEPRECATED(5.4, "Use FWorldPartitionActorDescInstance::GetDataLayerInstanceNames")
412 TArray<FName> GetDataLayerInstanceNames() const { return TArray<FName>(); }
413
414 UE_DEPRECATED(5.4, "Use FWorldPartitionActorDescInstance::SetDataLayerInstanceNames")
416
417 UE_DEPRECATED(5.4, "Use FWorldPartitionActorDescInstance::IsRuntimeRelevant instead")
418 virtual bool IsRuntimeRelevant(const FActorContainerID& InContainerID) const { return false; }
419
420 UE_DEPRECATED(5.4, "Use FWorldPartitionActorDescInstance::IsEditorRelevant instead")
421 virtual bool IsEditorRelevant() const { return false; }
422
423 UE_DEPRECATED(5.4, "Please use FWorldPartitionActorDescInstance::GetUnloadedReason")
424 FText GetUnloadedReason() const { return FText(); }
425
426 UE_DEPRECATED(5.4, "Please use FWorldPartitionActorDescInstance::SetUnloadedReason")
428
429 UE_DEPRECATED(5.4, "Use IsChildContainerInstance instead")
430 virtual bool IsContainerInstance() const { return false; }
431
432 UE_DEPRECATED(5.4, "Use GetChildContainerPackage instead")
433 virtual FName GetContainerPackage() const { return NAME_None; }
434
435 UE_DEPRECATED(5.4, "Use GetChildContainerFilterType instead")
437
438 UE_DEPRECATED(5.4, "Use GetChildContainerFilter instead")
439 virtual const FWorldPartitionActorFilter* GetContainerFilter() const { return nullptr; }
440
441 UE_DEPRECATED(5.4, "Use GetChildContainerInstance instead")
442 virtual bool GetContainerInstance(FContainerInstance& OutContainerInstance) const { return false; }
443
444 UE_DEPRECATED(5.4, "Use SetContainer without World param")
445 virtual void SetContainer(UActorDescContainer* InContainer, UWorld* InWorldContext) { }
446
447 UE_DEPRECATED(5.4, "Please use FWorldPartitionActorDescInstance::IsLoaded")
448 bool IsLoaded(bool bEvenIfPendingKill=false) const { return false; }
449
450 UE_DEPRECATED(5.4, "Please use FWorldPartitionActorDescInstance::GetActor")
451 AActor* GetActor(bool bEvenIfPendingKill=true, bool bEvenIfUnreachable=false) const { return nullptr; }
452
453 UE_DEPRECATED(5.4, "Please use FWorldPartitionActorDescInstance::GetActor")
454 TWeakObjectPtr<AActor>* GetActorPtr(bool bEvenIfPendingKill = true, bool bEvenIfUnreachable = false) const { return nullptr; }
455
456 UE_DEPRECATED(5.4, "Please use FWorldPartitionActorDescInstance::Load")
457 AActor* Load() const { return nullptr;}
458
459 UE_DEPRECATED(5.4, "Please use FWorldPartitionActorDescInstance::Unload")
460 virtual void Unload() {}
461
462 UE_DEPRECATED(5.4, "Please use FWorldPartitionActorDescInstance")
463 void TransformInstance(const FString& From, const FString& To) {}
464
465 UE_DEPRECATED(5.4, "Use FWorldPartitionActorDescInstance version instead")
466 virtual void CheckForErrors(IStreamingGenerationErrorHandler* ErrorHandler) const {}
467
468protected:
469 UE_DEPRECATED(5.4, "Please use FWorldPartitionActorDescInstance::IncSoftRefCount")
470 inline uint32 IncSoftRefCount() const { return 0; }
471
472 UE_DEPRECATED(5.4, "Please use FWorldPartitionActorDescInstance::DecSoftRefCount")
473 inline uint32 DecSoftRefCount() const { return 0; }
474
475 UE_DEPRECATED(5.4, "Please use FWorldPartitionActorDescInstance::IncHardRefCount")
476 inline uint32 IncHardRefCount() const { return 0;}
477
478 UE_DEPRECATED(5.4, "Please use FWorldPartitionActorDescInstance::DecHardRefCount")
479 inline uint32 DecHardRefCount() const { return 0;}
480
481 UE_DEPRECATED(5.4, "Please use FWorldPartitionActorDescInstance::GetSoftRefCount")
482 inline uint32 GetSoftRefCount() const { return 0; }
483
484 UE_DEPRECATED(5.4, "Please use FWorldPartitionActorDescInstance::GetHardRefCount")
485 inline uint32 GetHardRefCount() const { return 0; }
486 //~ End Deprecation
487
488public:
489 const TArray<FGuid>& GetReferences() const
490 {
491 return References;
492 }
493
495 {
497 }
498
499 bool IsEditorOnlyReference(const FGuid& ReferenceGuid) const
500 {
502 }
503
504 UActorDescContainer* GetContainer() const
505 {
506 return Container;
507 }
508
509 virtual void SetContainer(UActorDescContainer* InContainer)
510 {
513 }
514
515 ENGINE_API virtual void UpdateActorToWorld();
516
517 enum class EToStringMode : uint8
518 {
519 Guid,
520 Compact,
521 Full,
522 Verbose,
523 ForDiff
524 };
525
526 ENGINE_API FString ToString(EToStringMode Mode = EToStringMode::Compact) const;
527
528 ENGINE_API virtual void Init(const AActor* InActor);
530
532
533 ENGINE_API virtual bool Equals(const FWorldPartitionActorDesc* Other) const;
534
535 virtual bool HasStandaloneHLOD() const { return false; }
536
541 ENGINE_API virtual bool ShouldResave(const FWorldPartitionActorDesc* Other) const;
542
544
547
548 ENGINE_API bool IsMainWorldOnly() const;
550
551protected:
558
560
561 ENGINE_API virtual void TransferFrom(const FWorldPartitionActorDesc* From);
562
563 virtual void TransferWorldData(const FWorldPartitionActorDesc* From)
564 {
565 ActorTransform = From->ActorTransform;
566 RuntimeBounds = From->RuntimeBounds;
567 EditorBounds = From->EditorBounds;
568
569
570 ActorTransformRelative = From->ActorTransformRelative;
571 RuntimeBoundsRelative = From->RuntimeBoundsRelative;
572 EditorBoundsRelative = From->EditorBoundsRelative;
573 bHasValidRelativeBounds = From->bHasValidRelativeBounds;
574 }
575
576 virtual uint32 GetSizeOf() const { return sizeof(FWorldPartitionActorDesc); }
577
578 ENGINE_API virtual void Serialize(FArchive& Ar);
579
582
583 // Persistent
584 FGuid Guid;
585 FTopLevelAssetPath BaseClass;
586 FTopLevelAssetPath NativeClass; // Not serialized, comes from initialization data
587 FName ActorPackage; // Not serialized, comes from initialization data
588 FSoftObjectPath ActorPath; // Not serialized, comes from initialization data
590 FTransform ActorTransformRelative; // Relative transform for actors with parent actor, actor-to-world transform otherwise
591 FWorldPartitionRelativeBounds RuntimeBoundsRelative; // Runtime bounds relative to actor-to-world transform
592 FWorldPartitionRelativeBounds EditorBoundsRelative; // Editor bounds relative to actor-to-world transform
593 FName RuntimeGrid;
594 bool bIsSpatiallyLoaded;
595 bool bActorIsEditorOnly;
600 bool bIsUsingDataLayerAsset; // Used to know if DataLayers array represents DataLayers Asset paths or the FNames of the deprecated version of Data Layers
601 FSoftObjectPath HLODLayer;
602 TArray<FName> DataLayers;
603 FSoftObjectPath ExternalDataLayerAsset;
604 TArray<FGuid> References;
605 TArray<FGuid> EditorOnlyReferences; // References that aren't necessarily editor only but referenced through an editor only property.
607 FPropertyPairsMap Properties;
610 FGuid ParentActor; // Used to validate settings against parent (to warn on layer/placement compatibility issues)
611 FGuid ContentBundleGuid;
612
614
615 // Transient
617 FName ActorName;
618 FString ActorNameString;
619 FString ActorLabelString;
622 FTransform ActorTransform; // Current actor-to-world transform, considering parent transform
623 FBox RuntimeBounds; // Current runtime bounds, considering parent transform
624 FBox EditorBounds; // Current editor bounds, considering parent transform
627
629
630private:
632#endif // WITH_EDITOR
633};
634
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define check(expr)
Definition AssertionMacros.h:314
EForceInit
Definition CoreMiscDefines.h:154
@ ForceInit
Definition CoreMiscDefines.h:155
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
#define TEXT(x)
Definition Platform.h:1272
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
@ Patch
Patch version increments fix existing functionality without changing the API.
FArchive & operator<<(FArchive &Ar, FEnvQueryDebugProfileData::FStep &Data)
Definition EnvQueryTypes.cpp:489
return true
Definition ExternalRpcRegistry.cpp:601
#define X(Name, Desc)
Definition FormatStringSan.h:47
#define PRAGMA_ENABLE_DEPRECATION_WARNINGS
Definition GenericPlatformCompilerPreSetup.h:12
#define PRAGMA_DISABLE_DEPRECATION_WARNINGS
Definition GenericPlatformCompilerPreSetup.h:8
#define FVector
Definition IOSSystemIncludes.h:8
void Init()
Definition LockFreeList.h:4
#define UE_KINDA_SMALL_NUMBER
Definition UnrealMathUtility.h:131
EWorldPartitionActorFilterType
Definition WorldPartitionActorFilter.h:13
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Actor.h:257
Definition Archive.h:1208
Definition NameTypes.h:617
bool IsValid() const
Definition NameTypes.h:842
Definition PropertyPairsMap.h:13
Definition Text.h:385
Definition WorldPartitionActorDescInstance.h:18
Definition WorldPartitionActorDesc.h:282
Definition WorldPartitionActorDesc.h:250
Definition ActorDescContainerCollection.h:14
Definition Array.h:670
bool Contains(const ComparisonType &Item) const
Definition Array.h:1518
Definition AndroidPlatformMisc.h:14
Definition UnrealString.h.inl:34
Definition SubclassOf.h:30
Definition TVariant.h:48
Definition ActorComponent.h:152
Definition ActorDescContainerInstance.h:23
Definition ActorDescContainer.h:40
Definition Class.h:3793
Definition Level.h:423
Definition WorldPartition.h:142
Definition World.h:918
FString ToString(uint16 Value)
Definition PathFollowingComponent.cpp:82
UE_STRING_CLASS Result(Forward< LhsType >(Lhs), RhsLen)
Definition String.cpp.inl:732
@ false
Definition radaudio_common.h:23
Definition WorldPartitionActorContainerID.h:44
Definition Guid.h:109
Definition SoftObjectPath.h:56
Definition TopLevelAssetPath.h:38
Definition WorldPartitionActorFilter.h:23
Definition WorldPartitionActorDesc.h:237
Definition TVariant.h:13
Definition WeakObjectPtrTemplates.h:25
static CORE_API const TQuat< double > Identity
Definition Quat.h:63
static TVector< double > GetSafeScaleReciprocal(const TVector< double > &InScale, FReal Tolerance=UE_SMALL_NUMBER)
Definition TransformNonVectorized.h:1603
static CORE_API const TTransform< double > Identity
Definition TransformNonVectorized.h:58