UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
DistanceFieldAtlas.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3/*=============================================================================
4 DistanceFieldAtlas.h
5=============================================================================*/
6
7#pragma once
8
11#include "Engine/EngineTypes.h"
12#include "UObject/GCObject.h"
13#include "RenderResource.h"
15#include "TextureLayout3d.h"
17#include "Templates/UniquePtr.h"
19#include "Async/AsyncWork.h"
20
21#if WITH_EDITOR
22#include "MeshUtilities.h"
23#endif
24
29class UStaticMesh;
30class UTexture2D;
31
32template <class T> class TLockFreePointerListLIFO;
33
34// Change DDC key when modifying these (or any DF encoding logic)
36{
37 // One voxel border around object for handling gradient
39 inline constexpr int32 UniqueDataBrickSize = 7;
40 // Half voxel border around brick for trilinear filtering
41 inline constexpr int32 BrickSize = 8;
42 // Trade off between SDF memory and number of steps required to find intersection
43 inline constexpr int32 BandSizeInVoxels = 4;
44 inline constexpr int32 NumMips = 3;
45 inline constexpr uint32 InvalidBrickIndex = 0xFFFFFFFF;
47
48 // Must match LoadDFAssetData
49 inline constexpr uint32 MaxIndirectionDimension = 1024;
50};
51
53{
54public:
61
63
65
66 ENGINE_API void AddAllocation(UTexture2D* Texture, uint32 VisibilityChannel = 0);
67
69
71
72 UE_DEPRECATED(5.0, "This method has been refactored to use an FRDGBuilder instead.")
74
76
78
79 bool HasAtlasTexture() const { return AtlasTextureRHI.IsValid(); }
80
82
84 {
85 return AddrSpaceAllocator.DimInTexels;
86 }
87
89 {
90 return AddrSpaceAllocator.DimInTexels;
91 }
92
94 {
95 return Generation;
96 }
97
98private:
99 ENGINE_API uint32 CalculateDownSampleLevel(uint32 SizeX, uint32 SizeY) const;
100
101 class FSubAllocator
102 {
103 public:
105
106 uint32 Alloc(uint32 SizeX, uint32 SizeY);
107
108 void Free(uint32 Handle);
109
110 FVector4f GetScaleBias(uint32 Handle) const;
111
112 FIntPoint GetStartOffset(uint32 Handle) const;
113
114 private:
115 struct FSubAllocInfo
116 {
117 uint32 Level;
118 uint32 QuadIdx;
119 FVector4f UVScaleBias;
120 };
121
123 uint32 BorderSize;
124 uint32 TileSizeWithBorder;
125 uint32 DimInTiles;
126 uint32 DimInTilesShift;
127 uint32 DimInTilesMask;
128 uint32 DimInTexels;
129 uint32 MaxNumTiles;
130
131 float TexelSize;
132 float TileScale;
133
134 // 0: Free, 1: Allocated
135 TBitArray<> MarkerQuadTree;
137
138 TSparseArray<FSubAllocInfo> SubAllocInfos;
139
140 friend class FLandscapeTextureAtlas;
141 };
142
143 struct FAllocation
144 {
145 UTexture2D* SourceTexture;
147 uint32 VisibilityChannel : 2;
148 uint32 RefCount : 30;
149
150 FAllocation();
151
153
154 bool operator==(const FAllocation& Other) const
155 {
156 return SourceTexture == Other.SourceTexture;
157 }
158
159 friend uint32 GetTypeHash(const FAllocation& Key)
160 {
161 return GetTypeHash(Key.SourceTexture);
162 }
163 };
164
165 struct FPendingUpload
166 {
167 FRHITexture* SourceTexture;
168 FIntVector SizesAndMipBias;
169 uint32 VisibilityChannel : 2;
170 uint32 Handle : 30;
171
172 FPendingUpload(UTexture2D* Texture, uint32 SizeX, uint32 SizeY, uint32 MipBias, uint32 InHandle, uint32 Channel);
173
174 FIntPoint SetShaderParameters(void* ParamsPtr, const FLandscapeTextureAtlas& Atlas, FRDGTextureUAV* AtlasUAV) const;
175
176 private:
177 FIntPoint SetCommonShaderParameters(void* ParamsPtr, const FLandscapeTextureAtlas& Atlas) const;
178 };
179
180 FSubAllocator AddrSpaceAllocator;
181
182 TSet<FAllocation> PendingAllocations;
183 TSet<FAllocation> FailedAllocations;
184 TSet<FAllocation> CurrentAllocations;
185 TArray<UTexture2D*> PendingStreamingTextures;
186
187 TRefCountPtr<IPooledRenderTarget> AtlasTextureRHI;
188
189 uint32 MaxDownSampleLevel;
190 uint32 Generation;
191
192 const ESubAllocType SubAllocType;
193};
194
197
238
241{
242public:
243
246
249
251
253
254 // Lowest resolution mip is always loaded so we always have something
256
257 // Remaining mips are streamed
259
261
262 // For stats
264
266
268 {
269 CumulativeResourceSize.AddDedicatedSystemMemoryBytes(sizeof(*this));
270
271 for (const FSparseDistanceFieldMip& Mip : Mips)
272 {
273 Mip.GetResourceSizeEx(CumulativeResourceSize);
274 }
275
276 CumulativeResourceSize.AddDedicatedSystemMemoryBytes(AlwaysLoadedMip.GetAllocatedSize());
277 }
278
280 {
283 return ResSize.GetTotalMemoryBytes();
284 }
285
286 bool IsValid() const
287 {
288 return Mips[0].IndirectionDimensions.GetMax() > 0;
289 }
290
291#if WITH_EDITORONLY_DATA
292
293 UE_DEPRECATED(5.6, "Distance fields are always generated from the UStaticMesh's base render data, and platform independent. Simplified version of function below removes now unused arguments.")
294 ENGINE_API void CacheDerivedData(const FString& InStaticMeshDerivedDataKey, const ITargetPlatform* TargetPlatform, UStaticMesh* Mesh, class FStaticMeshRenderData& RenderData, UStaticMesh* GenerateSource, float DistanceFieldResolutionScale, bool bGenerateDistanceFieldAsIfTwoSided);
295
296 ENGINE_API void CacheDerivedData(UStaticMesh* Mesh, UStaticMesh* GenerateSource, float DistanceFieldResolutionScale, bool bGenerateDistanceFieldAsIfTwoSided);
297
298#endif
299
301
302 uint64 GetId() const { return Id; }
303};
304
324
346
349{
350public:
351
353
355
358
361
364
367
370
373
375 ENGINE_API void ProcessAsyncTasks(bool bLimitExecutionTime = false) override;
376
378 ENGINE_API void Shutdown() override;
379
381 {
382 FScopeLock Lock(&CriticalSection);
383 return ReferencedTasks.Num();
384 }
385
388
389private:
390 FName GetAssetTypeName() const override;
391 FTextFormat GetAssetNameFormat() const override;
392 TArrayView<FName> GetDependentTypeNames() const override;
393 int32 GetNumRemainingAssets() const override;
394 void FinishAllCompilation() override;
395
397 void ProcessPendingTasks();
398
400
402 void Build(FAsyncDistanceFieldTask* Task, class FQueuedThreadPool& ThreadPool);
403
405 void RescheduleBackgroundTask(FAsyncDistanceFieldTask* InTask, EQueuedWorkPriority InPriority);
406
408 void StartBackgroundTask(FAsyncDistanceFieldTask* Task);
409
411 void CancelAndDeleteTaskByPredicate(TFunctionRef<bool(FAsyncDistanceFieldTask*)> ShouldCancelPredicate);
412
414 void CancelAndDeleteTask(const TSet<FAsyncDistanceFieldTask*>& Tasks);
415
417 void FinishCompilationForObjects(TArrayView<UObject* const> InObjects) override;
418
420 void MarkCompilationAsCanceled(TArrayView<UObject* const> InObjects) override;
421
423 bool IsTaskInvalid(FAsyncDistanceFieldTask* Task) const;
424
426 void OnPostReachabilityAnalysis();
427
429 void OnAssetPostCompile(const TArray<FAssetCompileData>& CompiledAssets);
430
432 TSet<FAsyncDistanceFieldTask*> ReferencedTasks;
433
436
438 TSet<FAsyncDistanceFieldTask*> CompletedTasks;
439
440 FDelegateHandle PostReachabilityAnalysisHandle;
441
442 std::atomic<class IMeshUtilities*> MeshUtilities;
443
444 mutable FCriticalSection CriticalSection;
445
447};
448
451
452#if WITH_EDITOR
459
460extern ENGINE_API FString BuildDistanceFieldDerivedDataKey(const FString& InMeshKey);
461#endif
462
463
464#if UE_ENABLE_INCLUDE_ORDER_DEPRECATED_IN_5_4
467#endif
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
FPlatformTypes::SIZE_T SIZE_T
An unsigned integer the same size as a pointer, the same as UPTRINT.
Definition Platform.h:1150
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
FPlatformTypes::uint64 uint64
A 64-bit unsigned integer.
Definition Platform.h:1117
#define RETURN_QUICK_DECLARE_CYCLE_STAT(StatId, GroupId)
Definition Stats.h:655
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
UE::FPlatformRecursiveMutex FCriticalSection
Definition CriticalSection.h:53
ENGINE_API FDistanceFieldAsyncQueue * GDistanceFieldAsyncQueue
Definition DistanceFieldAtlas.cpp:133
ENGINE_API TGlobalResource< FLandscapeTextureAtlas > GHeightFieldTextureAtlas
ENGINE_API TGlobalResource< FLandscapeTextureAtlas > GHFVisibilityTextureAtlas
void Init()
Definition LockFreeList.h:4
EPixelFormat
Definition PixelFormat.h:16
@ PF_G8
Definition PixelFormat.h:20
EQueuedWorkPriority
Definition QueuedThreadPool.h:14
void SetShaderParameters(FRHIBatchedShaderParameters &BatchedParameters, const FShaderParameterBindings &Bindings, const FShaderParametersMetadata *ParametersMetadata, const void *InParametersData)
Definition ShaderParameterStruct.cpp:883
FRWLock Lock
Definition UnversionedPropertySerialization.cpp:921
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Archive.h:1208
Definition AsyncCompilationHelpers.h:14
Definition DistanceFieldAtlas.h:307
FAsyncDistanceFieldTaskWorker(FAsyncDistanceFieldTask &InTask)
Definition DistanceFieldAtlas.h:309
void DoWork()
Definition DistanceFieldAtlas.cpp:461
TStatId GetStatId() const
Definition DistanceFieldAtlas.h:314
Definition DistanceFieldAtlas.h:327
FAsyncDistanceFieldTask()
Definition DistanceFieldAtlas.cpp:402
UStaticMesh * GenerateSource
Definition DistanceFieldAtlas.h:337
bool bGeneratedCardRepresentation
Definition DistanceFieldAtlas.h:344
FDistanceFieldVolumeData * GeneratedVolumeData
Definition DistanceFieldAtlas.h:342
bool bGenerateDistanceFieldAsIfTwoSided
Definition DistanceFieldAtlas.h:339
FSourceMeshDataForDerivedDataTask SourceMeshData
Definition DistanceFieldAtlas.h:335
UStaticMesh * StaticMesh
Definition DistanceFieldAtlas.h:336
float DistanceFieldResolutionScale
Definition DistanceFieldAtlas.h:338
const ITargetPlatform * TargetPlatform
Definition DistanceFieldAtlas.h:340
TUniquePtr< FAsyncTask< FAsyncDistanceFieldTaskWorker > > AsyncTask
Definition DistanceFieldAtlas.h:343
FString DDCKey
Definition DistanceFieldAtlas.h:341
Definition RenderDeferredCleanup.h:11
Definition IDelegateInstance.h:14
Definition DistanceFieldAtlas.h:349
static ENGINE_API FName GetStaticAssetTypeName()
Definition DistanceFieldAtlas.cpp:468
ENGINE_API void AddTask(FAsyncDistanceFieldTask *Task)
Definition DistanceFieldAtlas.cpp:692
ENGINE_API void BlockUntilBuildComplete(UStaticMesh *StaticMesh, bool bWarnIfBlocked)
Definition DistanceFieldAtlas.cpp:782
ENGINE_API void ProcessAsyncTasks(bool bLimitExecutionTime=false) override
Definition DistanceFieldAtlas.cpp:962
ENGINE_API void Shutdown() override
Definition DistanceFieldAtlas.cpp:1080
int32 GetNumOutstandingTasks() const
Definition DistanceFieldAtlas.h:380
ENGINE_API void CancelAllOutstandingBuilds()
Definition DistanceFieldAtlas.cpp:760
ENGINE_API void CancelBuilds(const TSet< UStaticMesh * > &InStaticMeshes)
Definition DistanceFieldAtlas.cpp:748
ENGINE_API void CancelBuild(UStaticMesh *StaticMesh)
Definition DistanceFieldAtlas.cpp:743
ENGINE_API void BlockUntilAllBuildsComplete()
Definition DistanceFieldAtlas.cpp:870
virtual ENGINE_API ~FDistanceFieldAsyncQueue()
Definition DistanceFieldAtlas.cpp:447
ENGINE_API FDistanceFieldAsyncQueue()
Definition DistanceFieldAtlas.cpp:423
Definition DistanceFieldAtlas.h:241
FBox3f LocalSpaceMeshBounds
Definition DistanceFieldAtlas.h:245
SIZE_T GetResourceSizeBytes() const
Definition DistanceFieldAtlas.h:279
uint64 Id
Definition DistanceFieldAtlas.h:260
bool IsValid() const
Definition DistanceFieldAtlas.h:286
ENGINE_API FDistanceFieldVolumeData()
Definition DistanceFieldAtlas.cpp:379
bool bMostlyTwoSided
Definition DistanceFieldAtlas.h:248
uint64 GetId() const
Definition DistanceFieldAtlas.h:302
TArray< uint8 > AlwaysLoadedMip
Definition DistanceFieldAtlas.h:255
bool bAsyncBuilding
Definition DistanceFieldAtlas.h:250
FByteBulkData StreamableMips
Definition DistanceFieldAtlas.h:258
TStaticArray< FSparseDistanceFieldMip, DistanceField::NumMips > Mips
Definition DistanceFieldAtlas.h:252
FName AssetName
Definition DistanceFieldAtlas.h:263
void GetResourceSizeEx(FResourceSizeEx &CumulativeResourceSize) const
Definition DistanceFieldAtlas.h:267
Definition DistanceFieldAtlas.h:53
ENGINE_API void AddAllocation(UTexture2D *Texture, uint32 VisibilityChannel=0)
Definition DistanceFieldAtlas.cpp:1136
ENGINE_API void UpdateAllocations(FRDGBuilder &GraphBuilder, ERHIFeatureLevel::Type InFeatureLevel)
Definition DistanceFieldAtlas.cpp:1287
ENGINE_API FVector4f GetAllocationScaleBias(uint32 Handle) const
Definition DistanceFieldAtlas.cpp:1455
ENGINE_API FRDGTexture * GetAtlasTexture(FRDGBuilder &GraphBuilder) const
Definition DistanceFieldAtlas.cpp:1460
uint32 GetSizeX() const
Definition DistanceFieldAtlas.h:83
bool HasAtlasTexture() const
Definition DistanceFieldAtlas.h:79
ENGINE_API uint32 GetAllocationHandle(UTexture2D *Texture) const
Definition DistanceFieldAtlas.cpp:1449
ENGINE_API void RemoveAllocation(UTexture2D *Texture)
Definition DistanceFieldAtlas.cpp:1165
ENGINE_API void InitializeIfNeeded()
Definition DistanceFieldAtlas.cpp:1094
ESubAllocType
Definition DistanceFieldAtlas.h:56
@ SAT_Height
Definition DistanceFieldAtlas.h:57
@ SAT_Visibility
Definition DistanceFieldAtlas.h:58
@ SAT_Num
Definition DistanceFieldAtlas.h:59
uint32 GetSizeY() const
Definition DistanceFieldAtlas.h:88
uint32 GetGeneration() const
Definition DistanceFieldAtlas.h:93
Definition NameTypes.h:617
Definition AsyncWork.h:663
Definition QueuedThreadPool.h:105
Definition RenderGraphBuilder.h:49
Definition RenderGraphResources.h:905
Definition RenderGraphResources.h:571
Definition RHICommandList.h:4626
Definition RHIResources.h:2153
Definition RenderResource.h:37
Definition ScopeLock.h:141
Definition DerivedMeshDataTaskUtils.h:14
Definition DistanceFieldAtlas.h:199
void GetResourceSizeEx(FResourceSizeEx &CumulativeResourceSize) const
Definition DistanceFieldAtlas.h:233
FVector2f DistanceFieldToVolumeScaleBias
Definition DistanceFieldAtlas.h:216
FSparseDistanceFieldMip()
Definition DistanceFieldAtlas.h:202
SIZE_T GetResourceSizeBytes() const
Definition DistanceFieldAtlas.h:226
uint32 BulkSize
Definition DistanceFieldAtlas.h:218
FInt32Vector IndirectionDimensions
Definition DistanceFieldAtlas.h:212
uint32 BulkOffset
Definition DistanceFieldAtlas.h:217
friend FArchive & operator<<(FArchive &Ar, FSparseDistanceFieldMip &Mip)
Definition DistanceFieldAtlas.h:220
FVector3f VolumeToVirtualUVAdd
Definition DistanceFieldAtlas.h:215
int32 NumDistanceFieldBricks
Definition DistanceFieldAtlas.h:213
FVector3f VolumeToVirtualUVScale
Definition DistanceFieldAtlas.h:214
Definition StaticMeshResources.h:774
Definition Text.h:278
Definition ArrayView.h:139
Definition Array.h:670
UE_NODEBUG UE_FORCEINLINE_HINT SIZE_T GetAllocatedSize(void) const
Definition Array.h:1059
Definition AssetRegistryState.h:50
Definition RenderResource.h:543
Definition LockFreeList.h:898
Definition RefCounting.h:454
UE_FORCEINLINE_HINT bool IsValid() const
Definition RefCounting.h:594
Definition SparseArray.h:524
Definition StaticArray.h:26
Definition UniquePtr.h:107
Definition Object.h:95
Definition StaticMesh.h:593
Definition Texture2D.h:26
Definition DistanceFieldAtlas.h:36
constexpr int32 BrickSize
Definition DistanceFieldAtlas.h:41
constexpr int32 MeshDistanceFieldObjectBorder
Definition DistanceFieldAtlas.h:38
constexpr uint32 InvalidBrickIndex
Definition DistanceFieldAtlas.h:45
constexpr uint32 MaxIndirectionDimension
Definition DistanceFieldAtlas.h:49
constexpr int32 NumMips
Definition DistanceFieldAtlas.h:44
constexpr int32 BandSizeInVoxels
Definition DistanceFieldAtlas.h:43
constexpr EPixelFormat DistanceFieldFormat
Definition DistanceFieldAtlas.h:46
constexpr int32 UniqueDataBrickSize
Definition DistanceFieldAtlas.h:39
Definition SceneComponent.h:24
Type
Definition RHIFeatureLevel.h:20
uint32 GetTypeHash(const FKey &Key)
Definition BlackboardKey.h:35
constexpr int32 TileSize
Definition MegaLights.cpp:463
bool operator==(const FCachedAssetKey &A, const FCachedAssetKey &B)
Definition AssetDataMap.h:501
Definition AssetCompilingManager.h:25
Definition ResourceSize.h:31
Definition IAssetCompilingManager.h:25
Definition LightweightStats.h:416
Definition IntPoint.h:25