UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
EditorBulkData.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Async/Mutex.h"
7#include "Async/Future.h"
9#include "Containers/Array.h"
10#include "CoreTypes.h"
11#include "HAL/Platform.h"
12#include "IO/IoHash.h"
14#include "Memory/SharedBuffer.h"
15#include "Misc/EnumClassFlags.h"
16#include "Misc/Guid.h"
17#include "Misc/PackagePath.h"
18#include "Misc/PackageSegment.h"
21
22class FArchive;
23class FBulkData;
24class FLinkerSave;
25class UObject;
27
28namespace UE::BulkDataRegistry { enum class ERegisterResult : uint8; }
29
30// When enabled it will be possible for specific editor bulkdata objects to opt out of being virtualized
31// This is a development feature and not expected to be used!
32#define UE_ENABLE_VIRTUALIZATION_TOGGLE 1
33
34//TODO: At some point it might be a good idea to uncomment this to make sure that FEditorBulkData is
35// never used at runtime (requires a little too much reworking of some assets for now though)
36//#if WITH_EDITORONLY_DATA
37
38namespace UE::Serialization
39{
40
41namespace Private
42{
71} // namespace Private
72
78{
80 Default,
83};
84
132{
133public:
134 FEditorBulkData() = default;
136
139
142
151
157
169
171 COREUOBJECT_API void Reset();
172
173 // TODO: Not sure if there is a scenario where we can reload the payload off disk but it is also
174 // in memory.and so this might not really do anything anymore.
175
178
188
191
193 COREUOBJECT_API const FIoHash& GetPayloadId() const;
194
197 {
198 return PayloadSize;
199 }
200
202 bool HasPayloadData() const
203 {
204 return PayloadSize > 0;
205 }
206
209
212
221
237
247
270
287 COREUOBJECT_API void UpdatePayload(FSharedBufferWithID InPayload, UObject* Owner = nullptr);
288
298
309
310 UE_DEPRECATED(5.1, "Call GetBulkDataVersions instead.")
312
320
327
330 {
331 return FEditorBulkData(*this, ETornOff());
332 }
333
334 // Functions used by the BulkDataRegistry
335
338
341
344 {
345 return EnumHasAnyFlags(Flags, EFlags::LegacyKeyWasGuidDerived);
346 }
347
350
353
356
363
364#if UE_ENABLE_VIRTUALIZATION_TOGGLE
365 UE_DEPRECATED(5.0, "SetVirtualizationOptOut is an internal feature for development and will be removed without warning!")
367#endif //UE_ENABLE_VIRTUALIZATION_TOGGLE
368
369protected:
370 enum class ETornOff {};
372
373private:
374 friend struct FTocEntry;
375
377 enum class EFlags : uint32
378 {
380 None = 0,
382 IsVirtualized = 1 << 0,
384 HasPayloadSidecarFile = 1 << 1,
386 ReferencesLegacyFile = 1 << 2,
388 LegacyFileIsCompressed = 1 << 3,
391 DisablePayloadCompression = 1 << 4,
393 LegacyKeyWasGuidDerived = 1 << 5,
395 HasRegistered = 1 << 6,
397 IsTornOff = 1 << 7,
399 ReferencesWorkspaceDomain = 1 << 8,
401 StoredInPackageTrailer = 1 << 9,
403 IsCooked = 1 << 10,
405 WasDetached = 1 << 11
406 };
407
409
411 static constexpr EFlags TransientFlags = EFlags((uint32)EFlags::HasRegistered | (uint32)EFlags::IsTornOff | (uint32)EFlags::WasDetached);
412
414 enum ErrorVerbosity
415 {
417 None = 0,
419 All
420 };
421
423 COREUOBJECT_API void SerializeToLegacyPath(FLinkerSave& LinkerSave, FCompressedBuffer PayloadToSerialize, EFlags UpdatedFlags, UObject* Owner);
425 COREUOBJECT_API void SerializeToPackageTrailer(FLinkerSave& LinkerSave, FCompressedBuffer PayloadToSerialize, EFlags UpdatedFlags, UObject* Owner);
426
427 COREUOBJECT_API void UpdatePayloadImpl(FSharedBuffer&& InPayload, const FIoHash& InPayloadID, UObject* Owner);
428
429 COREUOBJECT_API FCompressedBuffer GetDataInternal() const;
430
431 COREUOBJECT_API FCompressedBuffer LoadFromDisk() const;
432 COREUOBJECT_API FCompressedBuffer LoadFromPackageFile() const;
433 COREUOBJECT_API FCompressedBuffer LoadFromPackageTrailer() const;
434 COREUOBJECT_API FCompressedBuffer LoadFromSidecarFile() const;
435 COREUOBJECT_API FCompressedBuffer LoadFromSidecarFileInternal(ErrorVerbosity Verbosity) const;
436
437 COREUOBJECT_API bool SerializeData(FArchive& Ar, FCompressedBuffer& Payload, const EFlags PayloadFlags) const;
438
439 COREUOBJECT_API void PushData(const FPackagePath& InPackagePath);
440 COREUOBJECT_API FCompressedBuffer PullData() const;
441
442 COREUOBJECT_API bool CanUnloadData() const;
443 COREUOBJECT_API bool CanLoadDataFromDisk() const;
444
445 COREUOBJECT_API void UpdateKeyIfNeeded();
446 COREUOBJECT_API void UpdateKeyIfNeeded(FCompressedBuffer InPayload) const;
447
448 COREUOBJECT_API void RecompressForSerialization(FCompressedBuffer& InOutPayload, EFlags PayloadFlags) const;
449 COREUOBJECT_API EFlags BuildFlagsForSerialization(FArchive& Ar, bool bKeepFileDataByReference) const;
450
451 bool IsDataVirtualized() const
452 {
453 return IsDataVirtualized(Flags);
454 }
455
456 static bool IsDataVirtualized(EFlags InFlags)
457 {
458 return EnumHasAnyFlags(InFlags, EFlags::IsVirtualized);
459 }
460
461 bool HasPayloadSidecarFile() const
462 {
463 return EnumHasAnyFlags(Flags, EFlags::HasPayloadSidecarFile);
464 }
465
466 bool IsReferencingOldBulkData() const
467 {
468 return IsReferencingOldBulkData(Flags);
469 }
470 static bool IsReferencingOldBulkData(EFlags InFlags)
471 {
472 return EnumHasAnyFlags(InFlags, EFlags::ReferencesLegacyFile);
473 }
474
475 bool IsReferencingWorkspaceDomain() const
476 {
477 return IsReferencingWorkspaceDomain(Flags);
478 }
479 static bool IsReferencingWorkspaceDomain(EFlags InFlags)
480 {
481 return EnumHasAnyFlags(InFlags, EFlags::ReferencesWorkspaceDomain);
482 }
483
484 bool IsReferencingByPackagePath() const
485 {
486 return IsReferencingByPackagePath(Flags);
487 }
488 static bool IsReferencingByPackagePath(EFlags InFlags)
489 {
490 return EnumHasAnyFlags(InFlags, EFlags::ReferencesLegacyFile | EFlags::ReferencesWorkspaceDomain);
491 }
492
493 bool IsStoredInPackageTrailer() const
494 {
495 return IsStoredInPackageTrailer(Flags);
496 }
497 static bool IsStoredInPackageTrailer(EFlags InFlags)
498 {
499 return EnumHasAnyFlags(InFlags, EFlags::StoredInPackageTrailer);
500 }
501
506 bool HasAttachedArchive() const
507 {
508 return AttachedAr != nullptr;
509 }
510
513 COREUOBJECT_API void Unregister();
518 COREUOBJECT_API void OnExitMemory();
520 COREUOBJECT_API void UpdateRegistrationData(UObject* Owner, const TCHAR* LogCallerName, bool bAllowUpdateId);
522 const TCHAR* CallerName, bool bHandledbyCreateUniqueGuid) const;
523
530 COREUOBJECT_API bool TryPayloadValidationForSaving(const FCompressedBuffer& PayloadForSaving, FLinkerSave* LinkerSave) const;
531
538 COREUOBJECT_API FText GetCorruptedPayloadErrorMsgForSave(FLinkerSave* Linker) const;
539
552 static COREUOBJECT_API void ValidatePackageTrailerBuilder(const FLinkerSave* LinkerSave, const FIoHash& Id, EFlags PayloadFlags);
553
555 COREUOBJECT_API bool ShouldUseLegacySerialization(const FLinkerSave* LinkerSave) const;
556
558 FGuid BulkDataId;
559
561 FIoHash PayloadContentId;
562
564 FSharedBuffer Payload;
565
567 int64 PayloadSize = 0;
568
569 //---- The remaining members are used when the payload is not virtualized.
570
572 FArchive* AttachedAr = nullptr;
573
575 int64 OffsetInFile = INDEX_NONE;
576
578 FPackagePath PackagePath;
579
581 EFlags Flags = EFlags::None;
582
583 // Use of IBulkDataRegistry requires a recursive mutex
584 mutable FRecursiveMutex Mutex;
585
586#if UE_ENABLE_VIRTUALIZATION_TOGGLE
587 bool bSkipVirtualization = false;
588#endif //UE_ENABLE_VIRTUALIZATION_TOGGLE
589
595 Private::FCompressionSettings CompressionSettings;
596};
597
598ENUM_CLASS_FLAGS(FEditorBulkData::EFlags);
599
605
606} // namespace UE::Serialization
607
608//#endif //WITH_EDITORONLY_DATA
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
FPlatformTypes::TCHAR TCHAR
Either ANSICHAR or WIDECHAR, depending on whether the platform supports wide characters or the requir...
Definition Platform.h:1135
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
constexpr bool EnumHasAnyFlags(Enum Flags, Enum Contains)
Definition EnumClassFlags.h:35
#define FRIEND_ENUM_CLASS_FLAGS(Enum)
Definition EnumClassFlags.h:17
#define ENUM_CLASS_FLAGS(Enum)
Definition EnumClassFlags.h:6
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 BulkData.h:470
Definition CompressedBuffer.h:50
Definition CustomVersion.h:111
Definition LinkerSave.h:48
Definition PackagePath.h:89
Definition SharedBuffer.h:341
Definition Text.h:385
Definition Future.h:393
Definition EditorBulkData.h:132
friend struct FTocEntry
Definition EditorBulkData.h:374
COREUOBJECT_API void UpdatePayload(FSharedBuffer InPayload, UObject *Owner=nullptr)
Definition EditorBulkData.cpp:2115
COREUOBJECT_API ~FEditorBulkData()
Definition EditorBulkData.cpp:465
COREUOBJECT_API void SerializeForRegistry(FArchive &Ar)
Definition EditorBulkData.cpp:1274
ETornOff
Definition EditorBulkData.h:370
COREUOBJECT_API void SetCompressionOptions(ECompressionOptions Option)
Definition EditorBulkData.cpp:2144
COREUOBJECT_API void SetVirtualizationOptOut(bool bOptOut)
COREUOBJECT_API FCustomVersionContainer GetCustomVersions(FArchive &InlineArchive)
Definition EditorBulkData.cpp:2186
COREUOBJECT_API void CreateFromBulkData(FBulkData &BulkData, const FGuid &Guid, UObject *Owner)
Definition EditorBulkData.cpp:801
COREUOBJECT_API void UpdatePayloadId()
Definition EditorBulkData.cpp:2228
COREUOBJECT_API void UnloadData()
Definition EditorBulkData.cpp:1734
bool HasPayloadData() const
Definition EditorBulkData.h:202
COREUOBJECT_API void CreateLegacyUniqueIdentifier(UObject *Owner)
Definition EditorBulkData.cpp:855
COREUOBJECT_API bool IsMemoryOnlyPayload() const
Definition EditorBulkData.cpp:1705
COREUOBJECT_API bool LocationMatches(const FEditorBulkData &Other) const
Definition EditorBulkData.cpp:2235
FEditorBulkData CopyTornOff() const
Definition EditorBulkData.h:329
int64 GetPayloadSize() const
Definition EditorBulkData.h:196
COREUOBJECT_API void TearOff()
Definition EditorBulkData.cpp:591
COREUOBJECT_API bool CanSaveForRegistry() const
Definition EditorBulkData.cpp:1316
COREUOBJECT_API void UpdateRegistrationOwner(UObject *Owner)
Definition EditorBulkData.cpp:599
COREUOBJECT_API void GetBulkDataVersions(FArchive &InlineArchive, FPackageFileVersion &OutUEVersion, int32 &OutLicenseeUEVersion, FCustomVersionContainer &OutCustomVersions) const
Definition EditorBulkData.cpp:2195
COREUOBJECT_API FGuid GetIdentifier() const
Definition EditorBulkData.cpp:1801
COREUOBJECT_API void Reset()
Definition EditorBulkData.cpp:1711
COREUOBJECT_API bool DoesPayloadNeedLoading() const
Definition EditorBulkData.cpp:2054
COREUOBJECT_API void DetachFromDisk(FArchive *Ar, bool bEnsurePayloadIsLoaded)
Definition EditorBulkData.cpp:1753
COREUOBJECT_API TFuture< FSharedBuffer > GetPayload() const
Definition EditorBulkData.cpp:2064
bool HasPlaceholderPayloadId() const
Definition EditorBulkData.h:343
COREUOBJECT_API TFuture< FCompressedBuffer > GetCompressedPayload() const
Definition EditorBulkData.cpp:2101
COREUOBJECT_API FEditorBulkData & operator=(FEditorBulkData &&Other)
Definition EditorBulkData.cpp:484
COREUOBJECT_API const FIoHash & GetPayloadId() const
Definition EditorBulkData.cpp:1809
Definition Object.h:95
ECompressor
Definition OodleDataCompression.h:49
ECompressionLevel
Definition OodleDataCompression.h:94
Definition Linker.cpp:38
Definition OverriddenPropertySet.cpp:45
Definition BulkDataRegistry.h:35
ERegisterResult
Definition BulkDataRegistry.h:38
Definition StructuredLog.cpp:42
ECompressionOptions
Definition EditorBulkData.h:78
FGuid IoHashToGuid(const FIoHash &Hash)
Definition EditorBulkData.cpp:298
Definition Guid.h:109
Definition IoHash.h:33
Definition ObjectVersion.h:762
FSharedBufferWithID & operator=(FSharedBufferWithID &&)=default
FSharedBuffer GetPayload()
Definition EditorBulkData.h:262
FSharedBufferWithID(FSharedBufferWithID &&)=default
FSharedBufferWithID & operator=(const FSharedBufferWithID &)=delete
FSharedBufferWithID(const FSharedBufferWithID &)=delete
ECompressedBufferCompressor GetCompressor() const
Definition EditorBulkData.cpp:453
void SetToDisabled()
Definition EditorBulkData.cpp:436
bool IsSet() const
Definition EditorBulkData.cpp:443
COREUOBJECT_API FCompressionSettings()
Definition EditorBulkData.cpp:380
bool IsCompressed() const
Definition EditorBulkData.cpp:448
ECompressedBufferCompressionLevel GetCompressionLevel()
Definition EditorBulkData.cpp:458
bool operator!=(const FCompressionSettings &Other) const
Definition EditorBulkData.cpp:410
void SetToDefault()
Definition EditorBulkData.cpp:429
bool operator==(const FCompressionSettings &Other) const
Definition EditorBulkData.cpp:403
void Reset()
Definition EditorBulkData.cpp:415