UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
OverriddenPropertySet.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "UObject/Object.h"
8
9#include "OverriddenPropertySet.generated.h"
10
11#define UE_API COREUOBJECT_API
12
14
16
18/*
19 *************************************************************************************
20 * Overridable serialization is experimental, not supported and use at your own risk *
21 *************************************************************************************
22 * Scope responsible to control overridable serialization logic.
23 */
25{
26public:
27
28 enum class ECapabilities : uint32
29 {
30 None = 0,
31 // Enables serialization of override state into and from T3D
32 T3DSerialization = 1 << 0,
33 // Enables shadow serialization of subobject, any saved data can be skipped at load time unless loading in loose property or in a placeholder.
34 // This will keep reference to subobjects that might contain overrides.
37 };
38
40
41
46 {
47 checkf(!bUseOverridableSerialization, TEXT("Nobody should use this method if overridable serialization is already enabled"));
48 bUseOverridableSerialization = true;
49 OverriddenProperties = InOverriddenProperties;
50 }
51
55 inline static void Disable()
56 {
57 checkf(bUseOverridableSerialization, TEXT("Expecting overridable serialization to be already enabled"));
58 OverriddenProperties = nullptr;
59 bUseOverridableSerialization = false;
60 }
61
65 inline static bool IsEnabled()
66 {
67 return bUseOverridableSerialization;
68 }
69
70
76
83 {
84 return OverriddenProperties;
85 }
86
93
101 COREUOBJECT_API static EOverriddenPropertyOperation GetOverriddenPropertyOperation(const FArchive& Ar, FProperty* Property = nullptr, uint8* DataPtr = nullptr, const uint8* DefaultValue = nullptr);
102
109 COREUOBJECT_API static EOverriddenPropertyOperation GetOverriddenPropertyOperationForPortText(const void* DataPtr, const void* DefaultValue, int32 PortFlags);
110
115
120
123
126
127private:
128
129 static EOverriddenPropertyOperation GetOverriddenPropertyOperation(const int32 PortFlags, const FArchiveSerializedPropertyChain* CurrentPropertyChain, FProperty* Property, const void* DataPtr, const void* DefaultValue);
130
132
133 static ECapabilities Capabilities;
134 static thread_local bool bUseOverridableSerialization;
135 static thread_local FOverriddenPropertySet* OverriddenProperties;
136 static thread_local FPropertyVisitorPath* OverriddenPortTextPropertyPath;
137};
138
139/*
140 *************************************************************************************
141 * Overridable serialization is experimental, not supported and use at your own risk *
142 *************************************************************************************
143 * Scope responsible for enabling/disabling the overridable serialization from the parameters
144*/
155
156
157/*
158 *************************************************************************************
159 * Overridable serialization is experimental, not supported and use at your own risk *
160 *************************************************************************************
161 * Scope responsible for tracking current property path for text importing
162*/
173
174/*
175 * Override operation type for each property node
176 */
177UENUM()
179{
180 None = 0, /* no overridden operation was recorded on this property */
181 Modified, /* some sub property has recorded overridden operation */
182 Replace, /* everything has been overridden from this property down to every sub property/sub object*/
183 Add, /* this element was added in the container */
184 Remove, /* this element was removed from the container */
185 SubObjectsShadowing, /* only used to serialize/collect the subobjects, this saved data can be skipped at loading unless loading a loose property or in a placeholder which will keep reference to subobjects */
186};
187
198
203
205{
206 return UEnum::GetValueAsString(Operation).RightChop(StaticEnum<EOverriddenPropertyOperation>()->GetName().Len() + /*::*/2);
207}
208
209USTRUCT()
211{
213
215
221
222 FOverriddenPropertyPath& operator=(const FName Name);
225 void operator+=(const FName Name);
226 void operator+=(const TArray<FName>& Names);
228 {
229 this->operator+=(Other.Path);
230 }
231
233 {
234 return CachedHash == Other.CachedHash;
235 }
236
237 bool IsEmpty() const
238 {
239 return Path.IsEmpty();
240 }
241
242 FString ToString() const;
243
244private:
245 UPROPERTY()
246 TArray<FName> Path;
247
248 UPROPERTY()
249 uint32 CachedHash = 0;
250
252 {
253 return MappableString.CachedHash;
254 }
255};
256
257USTRUCT()
259{
261
265
271
272 static COREUOBJECT_API FOverriddenPropertyNodeID RootNodeId();
273
274 // Overridden property node map helpers
275 static COREUOBJECT_API FOverriddenPropertyNodeID FromMapKey(const FProperty* KeyProperty, const void* KeyData);
276 COREUOBJECT_API int32 ToMapInternalIndex(FScriptMapHelper& MapHelper) const;
277
278 COREUOBJECT_API bool operator==(const FOverriddenPropertyNodeID& Other) const;
279
280 FString ToString() const
281 {
282 return Path.ToString();
283 }
284
285 FString ToDebugString() const
286 {
287 return Path.ToString() + FString::Printf(TEXT("(0x%p)"), Object.Get());
288 }
289
290 bool IsValid() const
291 {
292 return !Path.IsEmpty();
293 }
294
295 void HandleObjectsReInstantiated(const TMap<UObject*, UObject*>& Map);
296 void HandleDeadObjectReferences(const TSet<UObject*>& ActiveInstances, const TSet<UObject*>& TemplateInstances);
297
299 {
300 return GetTypeHash(NodeID.Path);
301 }
302
303private:
304 UPROPERTY()
306
307 UPROPERTY()
309};
310
311/*
312 *************************************************************************************
313 * Overridable serialization is experimental, not supported and use at your own risk *
314 *************************************************************************************
315 * Overridden property information node, there will be one per overriden property/subojects
316 *
317 */
318USTRUCT()
320{
322
328
335
336private:
337 UPROPERTY()
339
340 UPROPERTY()
342
343 // Unable to make this a UPROPERTY() because of this UHT error:
344 // 'Struct' recursion via arrays is unsupported for properties.
345 // Instead will be serializing by hand
346 TArray<FOverriddenPropertyNode> SubPropertyNodes;
347
348public:
349
350 const FOverriddenPropertyNodeID& GetNodeID() const
351 {
352 return NodeID;
353 }
354
356 {
357 return Operation;
358 }
359
360 void SetOperation(EOverriddenPropertyOperation InOperation, bool* bWasModified = nullptr);
361
363 {
364 return SubPropertyNodes;
365 }
366
368 {
369 return SubPropertyNodes;
370 }
371
372 FOverriddenPropertyNode& FindOrAddNode(const FOverriddenPropertyNodeID& NodeID, bool* bWasModified = nullptr);
373
374 bool RemoveSubPropertyNode(const FOverriddenPropertyNodeID& NodeID, bool* bWasModified = nullptr);
375
377 {
378 return NodeID == Other.NodeID;
379 }
380
381 void Reset(bool* bWasModified = nullptr);
382
383 void HandleObjectsReInstantiated(const TMap<UObject*, UObject*>& Map);
384 void HandleDeadObjectReferences(const TSet<UObject*>& ActiveInstances, const TSet<UObject*>& TemplateInstances);
385
386 UE_API bool Serialize(FArchive& Ar);
388 {
389 P.Serialize(Ar);
390 return Ar;
391 }
392};
393
394template<>
403
404/*
405 * Property change notification type mapping the Pre/PostEditChange callbacks
406 */
408{
409 PreEdit,
411};
412
413/*
414 *************************************************************************************
415 * Overridable serialization is experimental, not supported and use at your own risk *
416 *************************************************************************************
417 * Structure holding and tracking overridden properties of an UObject
418 */
419USTRUCT()
421{
423
424public:
425
430
437
442 UE_API bool ClearOverriddenProperty(FPropertyVisitorPath::Iterator PropertyIterator);
443
448 UE_API void OverrideProperty(FPropertyVisitorPath::Iterator PropertyIterator, const void* Data);
449
456 UE_API void NotifyPropertyChange(const EPropertyNotificationType Notification, FPropertyVisitorPath::Iterator PropertyIterator, const EPropertyChangeType::Type ChangeType, const void* Data);
457
464
472
481
486 UE_API const FOverriddenPropertyNode* GetOverriddenPropertyNode(const FArchiveSerializedPropertyChain* CurrentPropertyChain) const;
487 UE_API const FOverriddenPropertyNode* GetOverriddenPropertyNode(const FOverriddenPropertyNodeID& NodeID) const;
488
493 UE_API EOverriddenPropertyOperation GetSubPropertyOperation(const FOverriddenPropertyNodeID& NodeID) const;
494
501 UE_API FOverriddenPropertyNode* RestoreSubPropertyOperation(EOverriddenPropertyOperation Operation, FOverriddenPropertyNode& Node, const FOverriddenPropertyNodeID& NodeID);
502
509 UE_API FOverriddenPropertyNode* RestoreSubObjectOperation(EOverriddenPropertyOperation Operation, FOverriddenPropertyNode& Node, TNotNull<UObject*> SubObject);
516 UE_API bool IsCDOOwningProperty(const FProperty& Property) const;
517
520 UE_API void Reset(bool bShouldDirtyObject = true);
521 UE_API void HandleObjectsReInstantiated(const TMap<UObject*, UObject*>& Map);
522 UE_API void HandleDeadObjectReferences(const TSet<UObject*>& ActiveInstances, const TSet<UObject*>& TemplateInstances);
523
524 /* return whether this object is considered added or not */
525 bool WasAdded() const
526 {
527 return bWasAdded;
528 }
529
531 {
532 return Owner;
533 }
534
539 UE_API void RestoreOverriddenState(const FOverriddenPropertySet& FromOverriddenProperties);
540
541protected:
542
545 UE_API void NotifyPropertyChange(FOverriddenPropertyNode* ParentPropertyNode, const EPropertyNotificationType Notification, FPropertyVisitorPath::Iterator PropertyIterator, const EPropertyChangeType::Type ChangeType, const void* Data, bool& bNeedsCleanup);
547
551
552 UE_API UObject* TryGetInstancedSubObjectValue(const FObjectPropertyBase* FromProperty, const void* ValuePtr) const;
553
554private:
555 UPROPERTY()
556 TObjectPtr<UObject> Owner = nullptr;
557
558 UPROPERTY()
559 bool bWasAdded = false;
560
561 UPROPERTY()
562 FOverriddenPropertyNode RootNode { RootNodeID };
563
565
566public:
567 bool bNeedsSubobjectTemplateInstantiation = false;
568};
569
570#undef UE_API
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::int64 int64
A 64-bit signed integer.
Definition Platform.h:1127
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define FRIEND_ENUM_CLASS_FLAGS(Enum)
Definition EnumClassFlags.h:17
constexpr EIOSEventType operator+(EIOSEventType type, int Index)
Definition IOSInputInterface.cpp:138
#define DECLARE_LOG_CATEGORY_EXTERN(CategoryName, DefaultVerbosity, CompileTimeVerbosity)
Definition LogMacros.h:361
T TNotNull
Definition NotNull.h:307
#define UPROPERTY(...)
UObject definition macros.
Definition ObjectMacros.h:744
#define GENERATED_BODY(...)
Definition ObjectMacros.h:765
#define UENUM(...)
Definition ObjectMacros.h:749
#define USTRUCT(...)
Definition ObjectMacros.h:746
EPropertyObjectReferenceType
Definition ObjectMacros.h:533
TOptional< EOverriddenPropertyOperation > GetOverriddenOperationFromString(const FString &OverriddenOperationString)
Definition OverriddenPropertySet.h:188
EPropertyNotificationType
Definition OverriddenPropertySet.h:408
#define UE_API
Definition OverriddenPropertySet.h:11
EOverriddenPropertyOperation
Definition OverriddenPropertySet.h:179
FString GetOverriddenOperationString(EOverriddenPropertyOperation Operation)
Definition OverriddenPropertySet.h:204
TOptional< EOverriddenPropertyOperation > GetOverriddenOperationFromName(const FName OverriddenOperationName)
Definition OverriddenPropertySet.h:199
EPropertyVisitorInfoType
Definition PropertyVisitor.h:23
FStringBuilderBase & operator+=(FStringBuilderBase &Builder, ANSICHAR Char)
Definition StringBuilder.h:582
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Archive.h:1208
Definition NameTypes.h:617
Definition UnrealType.h:2725
Definition UnrealType.h:174
Definition UnrealType.h:4678
Definition ArrayView.h:139
Definition Array.h:670
Definition UnrealString.h.inl:34
static FString GetValueAsString(const TCHAR *EnumPath, const T EnumeratorValue)
Definition Class.h:3161
Definition Object.h:95
uint32 Type
Definition UnrealType.h:6835
@ false
Definition radaudio_common.h:23
Definition ArchiveSerializedPropertyChain.h:9
CORE_API FString ToString() const
Definition Color.cpp:584
Definition OverriddenPropertySet.h:146
bool bOverridableSerializationEnabled
Definition OverriddenPropertySet.h:151
FOverriddenPropertySet * SavedOverriddenProperties
Definition OverriddenPropertySet.h:153
COREUOBJECT_API ~FEnableOverridableSerializationScope()
Definition OverriddenPropertySet.cpp:221
bool bWasOverridableSerializationEnabled
Definition OverriddenPropertySet.h:152
Definition OverriddenPropertySet.cpp:30
Definition OverriddenPropertySet.h:25
static COREUOBJECT_API bool HasCapabilities(ECapabilities InCapabilities)
Definition OverriddenPropertySet.cpp:159
static COREUOBJECT_API void SetOverriddenPortTextPropertyPath(FPropertyVisitorPath &Path)
Definition OverriddenPropertySet.cpp:192
static FOverriddenPropertySet * GetOverriddenProperties()
Definition OverriddenPropertySet.h:82
static COREUOBJECT_API FOverriddenPropertySet * GetOverriddenPropertiesSlow()
Definition OverriddenPropertySet.cpp:164
static COREUOBJECT_API EOverriddenPropertyOperation GetOverriddenPropertyOperation(const FArchive &Ar, FProperty *Property=nullptr, uint8 *DataPtr=nullptr, const uint8 *DefaultValue=nullptr)
Definition OverriddenPropertySet.cpp:169
static COREUOBJECT_API FPropertyVisitorPath * GetOverriddenPortTextPropertyPath()
Definition OverriddenPropertySet.cpp:187
static COREUOBJECT_API bool ShouldPropertyShadowSerializeSubObject(TNotNull< const FProperty * > Property)
Definition OverriddenPropertySet.cpp:129
static void Disable()
Definition OverriddenPropertySet.h:55
ECapabilities
Definition OverriddenPropertySet.h:29
static bool IsEnabled()
Definition OverriddenPropertySet.h:65
static COREUOBJECT_API EOverriddenPropertyOperation GetOverriddenPropertyOperationForPortText(const void *DataPtr, const void *DefaultValue, int32 PortFlags)
Definition OverriddenPropertySet.cpp:178
static COREUOBJECT_API void ResetOverriddenPortTextPropertyPath()
Definition OverriddenPropertySet.cpp:198
Definition OverriddenPropertySet.h:164
FPropertyVisitorPath DefaultPath
Definition OverriddenPropertySet.h:171
COREUOBJECT_API ~FOverridableTextPortPropertyPathScope()
Definition OverriddenPropertySet.cpp:258
const FProperty * Property
Definition OverriddenPropertySet.h:170
Definition OverriddenPropertySet.h:259
FOverriddenPropertyNodeID & operator=(FOverriddenPropertyNodeID &&)=default
FOverriddenPropertyNodeID & operator=(const FOverriddenPropertyNodeID &)=default
static COREUOBJECT_API FOverriddenPropertyNodeID RootNodeId()
Definition OverriddenPropertySet.cpp:368
friend uint32 GetTypeHash(const FOverriddenPropertyNodeID &NodeID)
Definition OverriddenPropertySet.h:298
FOverriddenPropertyNodeID(const FOverriddenPropertyNodeID &)=default
FString ToDebugString() const
Definition OverriddenPropertySet.h:285
FString ToString() const
Definition OverriddenPropertySet.h:280
bool IsValid() const
Definition OverriddenPropertySet.h:290
FOverriddenPropertyNodeID(FOverriddenPropertyNodeID &&)=default
FOverriddenPropertyNodeID()=default
Definition OverriddenPropertySet.h:320
TArrayView< FOverriddenPropertyNode > GetSubPropertyNodes()
Definition OverriddenPropertySet.h:362
EOverriddenPropertyOperation GetOperation() const
Definition OverriddenPropertySet.h:355
bool operator==(const FOverriddenPropertyNode &Other) const
Definition OverriddenPropertySet.h:376
FOverriddenPropertyNode(FOverriddenPropertyNodeID &&InNodeID)
Definition OverriddenPropertySet.h:332
friend FArchive & operator<<(FArchive &Ar, FOverriddenPropertyNode &P)
Definition OverriddenPropertySet.h:387
const TArray< FOverriddenPropertyNode > & GetSubPropertyNodes() const
Definition OverriddenPropertySet.h:367
Definition OverriddenPropertySet.h:211
bool IsEmpty() const
Definition OverriddenPropertySet.h:237
FOverriddenPropertyPath(const FOverriddenPropertyPath &)=default
bool operator==(const FOverriddenPropertyPath &Other) const
Definition OverriddenPropertySet.h:232
FOverriddenPropertyPath(FOverriddenPropertyPath &&)=default
void operator+=(const FOverriddenPropertyPath &Other)
Definition OverriddenPropertySet.h:227
FOverriddenPropertyPath()=default
FOverriddenPropertyPath & operator=(const FOverriddenPropertyPath &)=default
FOverriddenPropertyPath & operator=(FOverriddenPropertyPath &&)=default
Definition OverriddenPropertySet.h:421
bool WasAdded() const
Definition OverriddenPropertySet.h:525
TObjectPtr< UObject > GetOwner() const
Definition OverriddenPropertySet.h:530
FOverriddenPropertySet()=default
FOverriddenPropertySet(TNotNull< UObject * > InOwner)
Definition OverriddenPropertySet.h:427
Definition PropertyVisitor.h:97
TArray< FPropertyVisitorInfo >::TConstIterator Iterator
Definition PropertyVisitor.h:198
Definition ObjectPtr.h:488
Definition Optional.h:131
Definition StructOpsTypeTraits.h:11
@ WithSerializer
Definition StructOpsTypeTraits.h:23
static constexpr EPropertyObjectReferenceType WithSerializerObjectReferences
Definition StructOpsTypeTraits.h:41
Definition StructOpsTypeTraits.h:46
Definition WeakObjectPtrTemplates.h:25