UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
SparseVolumeTexture.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
6
8
9#include "Containers/Array.h"
14#include "UnrealClient.h"
16
17#include "SparseVolumeTexture.generated.h"
18
19namespace UE { namespace Shader { enum class EValueType : uint8; } }
20namespace UE { namespace DerivedData { class FRequestOwner; } }
21
22// SVT_TODO: Unify with macros in SparseVolumeTextureCommon.ush
23#define SPARSE_VOLUME_TILE_RES 16
24#define SPARSE_VOLUME_TILE_BORDER 1
25#define SPARSE_VOLUME_TILE_RES_PADDED (SPARSE_VOLUME_TILE_RES + 2 * SPARSE_VOLUME_TILE_BORDER)
26
27namespace UE
28{
29namespace SVT
30{
31
32struct FTextureData;
34
35struct FHeader
36{
45
46 FHeader() = default;
47 ENGINE_API FHeader(const FIntVector3& AABBMin, const FIntVector3& AABBMax, EPixelFormat FormatA, EPixelFormat FormatB, const FVector4f& FallbackValueA, const FVector4f& FallbackValueB);
48
49 // PageTableVolumeAABBMin needs to be aligned to a power of two such that (PageTableVolumeAABBMin / pow(2, MipLevel)) results in an integer value for all mip levels. Otherwise we could end up
50 // with higher mip levels that are shifted in world space (due to PageTableVolumeAABBMin getting rounded down for every mip level) and would therefore not have corresponding voxels for voxels of lower mip levels.
51 // Such a shifted page table mip level causes clearly visible artifacts because the volume looks cut off where the page table ends.
52 // This problem can be avoided by aligning PageTableVolumeAABBMin to pow(2, (NumMipLevelsGlobal - 1)), where NumMipLevelsGlobal is the maximum number of mip levels in the entire animated SVT sequence.
55};
56
57// Linear struct of arrays octree describing the mipped SVT topology
59{
60 struct FMip
61 {
62 uint32 PageOffset; // Offset in Pages array where the pages for this mip begin
63 uint32 PageCount; // Number of pages in this mip
64 };
65
67 TArray<uint32> PackedPageTableCoords; // 11|11|10 packed coords of the page within the dense page table. One entry per (sparse) page.
68 TArray<uint32> TileIndices; // Index of tile data the page points to. One entry per (sparse) page.
69 TArray<uint32> ParentIndices; // Parent index. One entry per (sparse) page.
70
71 void Reset();
72 void Serialize(FArchive& Ar);
74 bool IsValidPageIndex(uint32 PageIndex) const { return PackedPageTableCoords.IsValidIndex(PageIndex); }
75 void GetTileRange(uint32 PageOffset, uint32 PageCount, uint32& OutTileOffset, uint32& OutTileCount) const;
76};
77
78// Describes a mip level of a SVT frame in terms of the sizes and offsets of the data in the built bulk data.
79// Each mip level consists of 4 buffer sections:
80//
81// Page table data is stored as two consecutive uint32 arrays, where the first array stores packed coordinates into the page table.
82// The second array stores the physical tile indices to be written to the page table. Only non-zero page table entries are stored.
83//
84// Since often about 30%-50% of all voxels in the physical tiles have values equal to the fallback value, the tile data (voxels) is also compressed.
85// For each tile, a bit mask with one bit per voxel is stored (occupancy bits). A set bit indicates that the voxel is actually stored and not equal
86// to the fallback value. When streaming in the data, the compressed voxel data is expanded on the GPU in the upload shader.
87// This bit mask costs 183 uint32 -> 732 bytes. A full 18x18x18 tile (16+2 padding) of 8bit unorm data is 5832 bytes, so if 30%-50% of that can be saved,
88// then paying 732 bytes for the occupancy bits should almost always be worth it.
89//
90// Due to the above compression technique, the start offset of the voxel data for a given tile can now no longer be computed as NumVoxelsPerPaddedTile * TileIndex,
91// so a precomputed offset into the shared array of voxel data is needed (tile data offsets). This means that we need to store one additional uint32 per tile,
92// arriving at a total overhead of 736 bytes per tile.
93//
94// Finally there is the actual voxel data, which is simply the all non-fallback voxels in contiguous memory.
95//
110
111// All the tiles are essentially stored as an array of structs with each tile having different memory sections:
112//
113// | OccupancyBitsA | OccupancyBitsB | VoxelsA | VoxelsB |
114//
115// OccupancyBitsA and OccupancyBitsB will only be stored if the respective texture/attributes group exists (Format is != Unknown).
116// Each set of occupancy bits has a fixed size, so it doesn't need to be stored explicitely.
117// VoxelsA and VoxelsB are the compacted non-fallback-value voxels of the tile. The sizes of these sections varies with the number of active
118// voxels in the tile (and in each texture).
119
130
131// Compactly stores data to construct a FTileInfo for every stored (and compressed) tile.
133{
134 // Array of byte offsets into the tile data. Has N+1 entries, with the last entry effectively being the total size of all tiles. This is a "logical" offset
135 // so we can compute the size of each tile as TileDataOffsets[N+1] - TileDataOffsets[N]. Tiles < FirstStreamingTileIndex are not actually stored with the rest of the
136 // streaming tiles, so to get the actual file offset of a streaming tile, the size of the root/non-streaming tile needs to be subtracted first. GetTileInfo() takes this into account.
138 TArray<uint16> NumVoxelsA; // Number of stored voxels for texture A for every tile. We reconstruct the number of voxels for texture B based on NumVoxelsA and the tile size.
139 uint32 FirstStreamingTileIndex; // Index of first tile that does not belong to the root mip level. Root tiles are always in memory/resident and do not stream.
140
141 void Reset()
142 {
146 }
147
149 {
150 return NumVoxelsA.Num();
151 }
152
157
158 bool HasRootTile() const
159 {
160 return FirstStreamingTileIndex > 0;
161 }
162
167
169 {
170 return TileDataOffsets[TileIndex + 1] - TileDataOffsets[TileIndex];
171 }
172
174 {
175 checkf(!(TileOffset < FirstStreamingTileIndex && (TileOffset + TileCount) > FirstStreamingTileIndex), TEXT("Tile range must not straddle the root tile and streaming tiles!"));
176 const uint32 RootTileSize = TileOffset < FirstStreamingTileIndex ? 0 : GetRootTileSize();
178 const uint32 ReadEnd = TileDataOffsets[TileOffset + TileCount] - RootTileSize;
180 }
181
182 FTileInfo GetTileInfo(uint32 TileIndex, uint32 FormatSizeA, uint32 FormatSizeB) const;
183
184 void GetNumVoxelsInTileRange(uint32 TileOffset, uint32 TileCount, uint32 FormatSizeA, uint32 FormatSizeB, const TBitArray<>* OptionalValidTiles, uint32& OutNumVoxelsA, uint32& OutNumVoxelsB) const;
185};
186
188{
189 EResourceFlag_StreamingDataInDDC = 1 << 0u, // FResources was cached, so MipLevelStreamingInfo can be streamed from DDC
190};
191
192// Represents the derived data of a SVT that is needed by the streaming manager.
194{
195public:
199 // Info about offsets into the tile data.
201 // Data for the highest/"root" mip level
203 // Data for all streamable mip levels
205
207
208 // These are used for logging and retrieving StreamableMipLevels from DDC in FStreamingManager
209#if WITH_EDITORONLY_DATA
210 FString ResourceName;
212 TArray<TStaticArray<uint8, 12>> DDCChunkIds; // 12-byte hashes used to reconstruct the FValueId required to look up the chunks.
213 TArray<uint32> DDCChunkMaxTileIndices; // Maximum tile index of each chunk. Used to look up the chunk a given tile belongs to.
214#endif
215
216 // Called when serializing to/from DDC buffers and when serializing the owning USparseVolumeTextureFrame.
217 void Serialize(FArchive& Ar, UObject* Owner, bool bCooked);
218 // Returns true if there are streamable mip levels.
219 bool HasStreamingData() const;
220#if WITH_EDITORONLY_DATA
221 // Removes the StreamableMipLevels bulk data if it was successfully cached to DDC.
222 void DropBulkData();
223 bool HasBuildFromDDCError() const;
224 void SetHasBuildFromDDCError(bool bHasError);
225 // Fills StreamableMipLevels with data from DDC. Returns true when done.
226 bool RebuildBulkDataFromCacheAsync(const UObject* Owner, bool& bFailed);
227 // Builds all the data from SourceData. Is called by Cache().
229 // Cache the built data to/from DDC. If bLocalCachingOnly is true, the read/write queries will only use the local DDC; otherwise the remote DDC will also be used.
231 // Sets empty default data. This is used when caching/building is canceled but some form of valid data is needed.
232 void SetDefault(EPixelFormat FormatA, EPixelFormat FormatB, const FVector4f& FallbackValueA, const FVector4f& FallbackValueB);
233#endif
234
235private:
236#if WITH_EDITORONLY_DATA
237 enum class EDDCRebuildState : uint8
238 {
239 Initial,
241 Pending,
242 Succeeded,
243 Failed,
244 };
245 static bool IsInitialState(EDDCRebuildState State)
246 {
247 return State == EDDCRebuildState::Initial || State == EDDCRebuildState::InitialAfterFailed;
248 }
250 std::atomic<EDDCRebuildState> DDCRebuildState;
251 std::atomic_int DDCRebuildNumFinishedRequests;
254#endif
255
256 static FTileStreamingMetaData CompressTiles(const FPageTopology& Topology, const struct FDerivedTextureData& DerivedTextureData, TArray<uint8>& OutRootBulkData, TArray64<uint8>& OutStreamingBulkData);
257};
258
259// Encapsulates RHI resources needed to render a SparseVolumeTexture.
261{
262 friend class FStreamingManager;
263public:
265 FIntVector3 GetTileDataTextureResolution() const { check(IsInParallelRenderingThread()); return TileDataTextureResolution; }
266 int32 GetFrameIndex() const { check(IsInParallelRenderingThread()); return FrameIndex; }
267 int32 GetNumLogicalMipLevels() const { check(IsInParallelRenderingThread()); return NumLogicalMipLevels; }
268 FRHITextureReference* GetPageTableTexture() const { check(IsInParallelRenderingThread()); return PageTableTextureReferenceRHI.GetReference(); }
269 FRHITextureReference* GetPhysicalTileDataATexture() const { check(IsInParallelRenderingThread()); return PhysicalTileDataATextureReferenceRHI.GetReference(); }
270 FRHITextureReference* GetPhysicalTileDataBTexture() const { check(IsInParallelRenderingThread()); return PhysicalTileDataBTextureReferenceRHI.GetReference(); }
272 // Updates the GlobalVolumeResolution member in a thread-safe way.
273 ENGINE_API void SetGlobalVolumeResolution_GameThread(const FIntVector3& GlobalVolumeResolution);
274
275 //~ Begin FRenderResource Interface.
276 ENGINE_API virtual void InitRHI(FRHICommandListBase& RHICmdList) override;
277 ENGINE_API virtual void ReleaseRHI() override;
278 //~ End FRenderResource Interface.
279
280private:
282 FIntVector3 GlobalVolumeResolution = FIntVector3::ZeroValue; // The virtual resolution of the union of the AABBs of all frames. Needed for GetPackedUniforms().
283 FIntVector3 TileDataTextureResolution = FIntVector3::ZeroValue;
284 int32 FrameIndex = INDEX_NONE;
285 int32 NumLogicalMipLevels = 0; // Might not all be resident in GPU memory
286 FTextureReferenceRHIRef PageTableTextureReferenceRHI;
287 FTextureReferenceRHIRef PhysicalTileDataATextureReferenceRHI;
288 FTextureReferenceRHIRef PhysicalTileDataBTextureReferenceRHI;
289};
290
291}
292}
293
296
305
306// SparseVolumeTexture base interface to communicate with material graph and shader bindings.
307UCLASS(MinimalAPI, ClassGroup = Rendering, BlueprintType)
309{
311
312public:
313
315 virtual ~USparseVolumeTexture() = default;
316
317 UFUNCTION(BlueprintCallable, Category = "Texture")
318 virtual int32 GetSizeX() const { return GetVolumeResolution().X; }
319
320 UFUNCTION(BlueprintCallable, Category = "Texture")
321 virtual int32 GetSizeY() const { return GetVolumeResolution().Y; }
322
323 UFUNCTION(BlueprintCallable, Category = "Texture")
324 virtual int32 GetSizeZ() const { return GetVolumeResolution().Z; }
325
326 UFUNCTION(BlueprintCallable, Category = "Texture")
327 virtual int32 GetNumFrames() const { return 0; }
328
329 UFUNCTION(BlueprintCallable, Category = "Texture")
330 virtual int32 GetNumMipLevels() const { return 0; }
331
332 UFUNCTION(BlueprintCallable, Category = "Texture")
333 virtual FTransform GetFrameTransform() const { return FTransform::Identity; }
334
335 virtual FIntVector GetVolumeResolution() const { return FIntVector(); }
338 virtual TextureAddress GetTextureAddressX() const { return TA_Wrap; }
339 virtual TextureAddress GetTextureAddressY() const { return TA_Wrap; }
340 virtual TextureAddress GetTextureAddressZ() const { return TA_Wrap; }
341 virtual const UE::SVT::FTextureRenderResources* GetTextureRenderResources() const { return nullptr; }
342 // Computes the optimal mip level to stream the SVT at, based on projected screen space size and voxel resolution.
343 float GetOptimalStreamingMipLevel(const FBoxSphereBounds& Bounds, float MipBias) const;
344
346 FVector4 GetUniformParameter(int32 Index) const { return FVector4(ForceInitToZero); } // SVT_TODO: This mechanism is no longer needed and can be removed
347
349 static ENGINE_API UE::Shader::EValueType GetUniformParameterType(int32 Index);
350
351#if WITH_EDITOR
353 {
354 Default,
355 DoesNotInvalidate
356 };
357
359 ENGINE_API void NotifyMaterials(const ENotifyMaterialsEffectOnShaders EffectOnShaders = ENotifyMaterialsEffectOnShaders::Default);
360#endif // WITH_EDITOR
361};
362
363// Represents a frame in a SparseVolumeTexture sequence and owns the actual data needed for rendering. Is owned by a UStreamableSparseVolumeTexture object.
364UCLASS(MinimalAPI, ClassGroup = Rendering, BlueprintType)
366{
368
369 friend class UE::SVT::FStreamingManager;
371
372public:
373
376
377 // Retrieves a frame from the given SparseVolumeTexture and also issues a streaming request for it.
378 // StreamingInstanceKey can be any arbitrary value that is suitable to keep track of the source of requests for a given SVT. This key is used internally to associate
379 // incoming requests with prior requests issued for the same SVT. A good value to pass here might be the pointer of the component the SVT is used within.
380 // FrameRate is an optional argument which helps to more accurately predict the required bandwidth when using non-blocking requests.
381 // FrameIndex is of float type so that the streaming system can use the fractional part to more easily keep track of playback speed and direction (forward/reverse playback).
382 // MipLevel is the lowest mip level that the caller intends to use but does not guarantee that the mip is actually resident.
383 // If bBlocking is true, DDC streaming requests will block on completion, guaranteeing that the requested frame will have been streamed in after the next streaming system update.
384 // If streaming cooked data from disk, the highest priority will be used, but no guarantee is given.
385 // if bHasValidFrameRate is true, the FrameRate argument will be use to predict the required streaming IO bandwidth.
386 static ENGINE_API USparseVolumeTextureFrame* GetFrameAndIssueStreamingRequest(USparseVolumeTexture* SparseVolumeTexture, uint32 StreamingInstanceKey, float FrameRate, float FrameIndex, float MipLevel, bool bBlocking, bool bHasValidFrameRate);
387
389 int32 GetFrameIndex() const { return FrameIndex; }
390 UE::SVT::FResources* GetResources() { return &Resources; }
391 // Creates TextureRenderResources if they don't already exist. Returns false if they already existed.
392 ENGINE_API bool CreateTextureRenderResources();
393
394#if WITH_EDITORONLY_DATA
395 // Caches the derived data (FResources) of this frame to/from DDC and ensures that FTextureRenderResources exists.
397#endif
398
399 //~ Begin UObject Interface.
400 ENGINE_API virtual void PostLoad() override;
401 ENGINE_API virtual void FinishDestroy() override;
402 ENGINE_API virtual void BeginDestroy() override;
403 ENGINE_API virtual void Serialize(FArchive& Ar) override;
404 ENGINE_API virtual void GetResourceSizeEx(FResourceSizeEx& CumulativeResourceSize) override;
405#if WITH_EDITOR
406 ENGINE_API virtual void BeginCacheForCookedPlatformData(const ITargetPlatform* TargetPlatform) override;
407 ENGINE_API virtual bool IsCachedCookedPlatformDataLoaded(const ITargetPlatform* TargetPlatform) override;
409 ENGINE_API virtual void ClearCachedCookedPlatformData(const ITargetPlatform* TargetPlatform) override;
410 ENGINE_API virtual void ClearAllCachedCookedPlatformData() override;
411#endif
412 //~ End UObject Interface.
413
414 //~ Begin USparseVolumeTexture Interface.
415 virtual int32 GetNumFrames() const override { return 1; }
416 virtual int32 GetNumMipLevels() const override { return Owner->GetNumMipLevels(); }
417 virtual FTransform GetFrameTransform() const override { return Transform; }
418 virtual FIntVector GetVolumeResolution() const override { return Owner->GetVolumeResolution(); }
419 virtual EPixelFormat GetFormat(int32 AttributesIndex) const override { return Owner->GetFormat(AttributesIndex); }
420 virtual FVector4f GetFallbackValue(int32 AttributesIndex) const override { return Owner->GetFallbackValue(AttributesIndex); }
421 virtual TextureAddress GetTextureAddressX() const override { return Owner->GetTextureAddressX(); }
422 virtual TextureAddress GetTextureAddressY() const override { return Owner->GetTextureAddressY(); }
423 virtual TextureAddress GetTextureAddressZ() const override { return Owner->GetTextureAddressZ(); }
424 virtual const UE::SVT::FTextureRenderResources* GetTextureRenderResources() const override { return TextureRenderResources; }
425 //~ End USparseVolumeTexture Interface.
426
427private:
428
429 UPROPERTY()
431
432 UPROPERTY()
433 int32 FrameIndex;
434
435 UPROPERTY(VisibleAnywhere, Category = "Texture", AssetRegistrySearchable)
437
438#if WITH_EDITORONLY_DATA
439 // FTextureData from which the FResources data can be built with a call to FResources::Build()
441#endif
442
443 // Derived data used at runtime
444 UE::SVT::FResources Resources;
445 // Runtime render data
446 UE::SVT::FTextureRenderResources* TextureRenderResources;
447};
448
449// Represents a streamable SparseVolumeTexture asset and serves as base class for UStaticSparseVolumeTexture and UAnimatedSparseVolumeTexture. It has an array of USparseVolumeTextureFrame.
450UCLASS(MinimalAPI, ClassGroup = Rendering, BlueprintType)
452{
454
455public:
456
457 UPROPERTY(VisibleAnywhere, Category = "Texture", AssetRegistrySearchable)
458 FIntVector VolumeResolution;
459
460 UPROPERTY(VisibleAnywhere, Category = "Texture", AssetRegistrySearchable)
461 int32 NumMipLevels;
462
463 UPROPERTY(VisibleAnywhere, Category = "Texture", AssetRegistrySearchable)
464 int32 NumFrames;
465
466 UPROPERTY(VisibleAnywhere, Category = "Texture", AssetRegistrySearchable)
468
469 UPROPERTY(VisibleAnywhere, Category = "Texture", AssetRegistrySearchable)
471
472 UPROPERTY(VisibleAnywhere, Category = "Texture", AdvancedDisplay)
473 FVector4f FallbackValueA;
474
475 UPROPERTY(VisibleAnywhere, Category = "Texture", AdvancedDisplay)
476 FVector4f FallbackValueB;
477
478 // The addressing mode to use for the X axis.
479 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Texture", meta = (DisplayName = "X-axis Tiling Method"), AssetRegistrySearchable, AdvancedDisplay)
481
482 // The addressing mode to use for the Y axis.
483 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Texture", meta = (DisplayName = "Y-axis Tiling Method"), AssetRegistrySearchable, AdvancedDisplay)
485
486 // The addressing mode to use for the Z axis.
487 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Texture", meta = (DisplayName = "Z-axis Tiling Method"), AssetRegistrySearchable, AdvancedDisplay)
489
490 // If enabled, the SparseVolumeTexture is only going to use the local DDC. For certain assets it might be reasonable to also use the remote DDC, but for larger assets this will mean long up- and download times.
491 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Texture", AdvancedDisplay)
492 bool bLocalDDCOnly = true;
493
494 // The SVT streaming pool is sized such that it can hold the largest frame multiplied by this value. There should be some slack to allow for prefetching frames.
495 UPROPERTY(EditAnywhere, Category = "Texture", AdvancedDisplay)
496 float StreamingPoolSizeFactor = 3.0f;
497
498 // When using non-blocking streaming requests, upcoming frames are loaded into memory in advance. This property controls how many frames to prefetch.
499 UPROPERTY(EditAnywhere, Category = "Texture", AdvancedDisplay)
500 int32 NumberOfPrefetchFrames = 3;
501
502 // When using non-blocking streaming requests, upcoming frames are loaded into memory in advance. This property controls the size reduction in percent of each additional prefetched frames.
503 // A value of 20.0 would prefetch frame N+1 at 80%, N+2 at 60%, N+3 at 40% etc.
504 UPROPERTY(EditAnywhere, Category = "Texture", AdvancedDisplay)
505 float PrefetchPercentageStepSize = 20.0f;
506
507 // When using non-blocking streaming requests, upcoming frames are loaded into memory in advance. This property applies a bias in percent to how much data is prefetched for every frame.
508 // A value of 20.0 adds 20% to all prefetch percentages. So if PrefetchPercentageStepSize is set to 20.0, frame N+1 is prefetched at 80% + 20% = 100%, frame N+2 at 60% + 20% = 80%, N+3 at 40% + 20% = 60% etc.
509 UPROPERTY(EditAnywhere, Category = "Texture", AdvancedDisplay)
510 float PrefetchPercentageBias = 20.0f;
511
512#if WITH_EDITORONLY_DATA
513 UPROPERTY(VisibleAnywhere, Instanced, Category = ImportSettings)
515#endif // WITH_EDITORONLY_DATA
516
518 UPROPERTY(EditAnywhere, AdvancedDisplay, Instanced, Category = "Texture")
519 TArray<TObjectPtr<class UAssetUserData>> AssetUserData;
520
523
524 // Multi-phase initialization: Call BeginInitialize(), then call AppendFrame() for each frame to add and then finish initialization with a call to EndInitialize().
525 // The NumExpectedFrames parameter on BeginInitialize() just serves as a potential optimization to reserve memory for the frames to be appended
526 // and doesn't need to match the exact number if it is not known at the time.
527 ENGINE_API virtual bool BeginInitialize(int32 NumExpectedFrames);
528 ENGINE_API virtual bool AppendFrame(UE::SVT::FTextureData& UncookedFrame, const FTransform& FrameTransform);
529 ENGINE_API virtual bool EndInitialize();
530
531 // Convenience function wrapping the multi-phase initialization functions above
532 virtual bool Initialize(const TArrayView<UE::SVT::FTextureData>& UncookedData, const TArrayView<FTransform>& FrameTransforms);
533 // Consider using USparseVolumeTextureFrame::GetFrameAndIssueStreamingRequest() if the frame should have streaming requests issued.
534 USparseVolumeTextureFrame* GetFrame(int32 FrameIndex) const { return Frames.IsValidIndex(FrameIndex) ? Frames[FrameIndex] : nullptr; }
535
536 //~ Begin UObject Interface.
537 ENGINE_API virtual void PostInitProperties() override;
538 ENGINE_API virtual void PostLoad() override;
539 ENGINE_API virtual void FinishDestroy() override;
540 ENGINE_API virtual void BeginDestroy() override;
541 ENGINE_API virtual void Serialize(FArchive& Ar) override;
542#if WITH_EDITOR
543 ENGINE_API virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;
544#endif
545 ENGINE_API virtual void GetResourceSizeEx(FResourceSizeEx& CumulativeResourceSize) override;
546 ENGINE_API virtual void GetAssetRegistryTags(FAssetRegistryTagsContext Context) const override;
547 UE_DEPRECATED(5.4, "Implement the version that takes FAssetRegistryTagsContext instead.")
548 ENGINE_API virtual void GetAssetRegistryTags(TArray<FAssetRegistryTag>& OutTags) const override;
549 //~ End UObject Interface.
550
551 //~ Begin IInterface_AssetUserData Interface
552 ENGINE_API virtual void AddAssetUserData(UAssetUserData* InUserData) override;
555 ENGINE_API virtual const TArray<UAssetUserData*>* GetAssetUserDataArray() const override;
556 //~ End IInterface_AssetUserData Interface
557
558 //~ Begin USparseVolumeTexture Interface.
559 virtual int32 GetNumFrames() const override { return Frames.Num(); }
560 virtual int32 GetNumMipLevels() const override { return NumMipLevels; }
561 virtual FTransform GetFrameTransform() const override { return Frames.IsEmpty() ? FTransform::Identity : Frames[0]->GetFrameTransform(); }
562 virtual FIntVector GetVolumeResolution() const override { return VolumeResolution; };
563 virtual EPixelFormat GetFormat(int32 AttributesIndex) const override { check(AttributesIndex >= 0 && AttributesIndex < 2) return AttributesIndex == 0 ? FormatA : FormatB; }
564 virtual FVector4f GetFallbackValue(int32 AttributesIndex) const override { check(AttributesIndex >= 0 && AttributesIndex < 2) return AttributesIndex == 0 ? FallbackValueA : FallbackValueB; }
565 virtual TextureAddress GetTextureAddressX() const override { return AddressX; }
566 virtual TextureAddress GetTextureAddressY() const override { return AddressY; }
567 virtual TextureAddress GetTextureAddressZ() const override { return AddressZ; }
568 virtual const UE::SVT::FTextureRenderResources* GetTextureRenderResources() const override { return Frames.IsEmpty() ? nullptr : Frames[0]->GetTextureRenderResources(); }
569 //~ End USparseVolumeTexture Interface.
570
571#if WITH_EDITOR
572 UE_DEPRECATED(5.5, "OnAssetsAddExtraObjectsToDelete signature has been deprecated please use OnAddExtraObjectsToDelete instead")
575#endif
576
577protected:
578
581
582#if WITH_EDITORONLY_DATA
583
584 enum EInitState : uint8
585 {
590 };
591
592 UPROPERTY()
594
595 UPROPERTY()
597
598 UPROPERTY()
600
601 // Ensures all frames have derived data (based on the source data and the current settings like TextureAddress modes etc.) cached to DDC and are ready for rendering.
602 // Disconnects this SVT from the streaming manager, calls Cache() on all frames and finally connects to FStreamingManager again.
603 void RecacheFrames();
604
605#endif // WITH_EDITORONLY_DATA
606
607#if WITH_EDITOR
611#endif // WITH_EDITOR
612};
613
614// Represents a streamable SparseVolumeTexture asset with a single frame. Although there is only a single frame, it is still recommended to use USparseVolumeTextureFrame::GetFrameAndIssueStreamingRequest().
615UCLASS(MinimalAPI, ClassGroup = Rendering, BlueprintType)
617{
619
620public:
621
623 virtual ~UStaticSparseVolumeTexture() = default;
624
625 //~ Begin UStreamableSparseVolumeTexture Interface.
626 // Override AppendFrame() to ensure that there is never more than a single frame in a static SVT
627 ENGINE_API virtual bool AppendFrame(UE::SVT::FTextureData& UncookedFrame, const FTransform& InFrameTransform) override;
628 //~ End UStreamableSparseVolumeTexture Interface.
629
630 //~ Begin USparseVolumeTexture Interface.
631 int32 GetNumFrames() const override { return 1; }
632 //~ End USparseVolumeTexture Interface.
633
634private:
635};
636
637// Represents a streamable SparseVolumeTexture with one or more frames. Use USparseVolumeTextureFrame::GetFrameAndIssueStreamingRequest() to bind extract a particular frame to be used for rendering.
638UCLASS(MinimalAPI, ClassGroup = Rendering, BlueprintType)
640{
642
643public:
644
646 virtual ~UAnimatedSparseVolumeTexture() = default;
647
648 //~ Begin USparseVolumeTexture Interface.
649 virtual const UE::SVT::FTextureRenderResources* GetTextureRenderResources() const override { return Frames.IsValidIndex(PreviewFrameIndex) ? Frames[PreviewFrameIndex]->GetTextureRenderResources() : nullptr; }
650 //~ End USparseVolumeTexture Interface.
651
652private:
653 int32 PreviewFrameIndex;
654};
655
656// Utility (blueprint) class for controlling SparseVolumeTexture playback.
657UCLASS(MinimalAPI, ClassGroup = Rendering, BlueprintType)
659{
661
662public:
663
664 UPROPERTY(BlueprintReadWrite, Category = "Animation")
666
667 UPROPERTY(BlueprintReadWrite, Category = "Animation")
668 float Time;
669
670 UPROPERTY(BlueprintReadWrite, Category = "Animation")
671 bool bIsPlaying;
672
673 UPROPERTY(BlueprintReadWrite, Category = "Animation")
674 float FrameRate = 24.0f;
675
676 UPROPERTY(BlueprintReadWrite, Category = "Rendering")
677 int32 MipLevel = 0;
678
679 UPROPERTY(BlueprintReadWrite, Category = "Rendering")
680 bool bBlockingStreamingRequests = false;
681
684
685 UFUNCTION(BlueprintCallable, Category = "Animation")
686 ENGINE_API void Play();
687
688 UFUNCTION(BlueprintCallable, Category = "Animation")
689 ENGINE_API void Pause();
690
691 UFUNCTION(BlueprintCallable, Category = "Animation")
692 ENGINE_API void Stop();
693
694 UFUNCTION(BlueprintCallable, Category = "Animation")
695 ENGINE_API void Update(float DeltaTime);
696
697 UFUNCTION(BlueprintCallable, Category = "Animation")
698 ENGINE_API float GetFractionalFrameIndex();
699
700 UFUNCTION(BlueprintCallable, Category = "Animation")
701 ENGINE_API USparseVolumeTextureFrame* GetFrameByIndex(int32 FrameIndex);
702
703 UFUNCTION(BlueprintCallable, Category = "Animation")
704 ENGINE_API USparseVolumeTextureFrame* GetCurrentFrame();
705
706 UFUNCTION(BlueprintCallable, Category = "Animation")
707 ENGINE_API void GetCurrentFramesForInterpolation(USparseVolumeTextureFrame*& Frame0, USparseVolumeTextureFrame*& Frame1, float& LerpAlpha);
708
709 UFUNCTION(BlueprintCallable, Category = "Animation")
710 ENGINE_API float GetDuration();
711};
#define check(expr)
Definition AssertionMacros.h:314
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
@ INDEX_NONE
Definition CoreMiscDefines.h:150
@ ForceInitToZero
Definition CoreMiscDefines.h:156
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
@ InPlace
Definition CoreMiscDefines.h:162
#define TEXT(x)
Definition Platform.h:1272
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
return true
Definition ExternalRpcRegistry.cpp:601
#define X(Name, Desc)
Definition FormatStringSan.h:47
UE::Math::TVector4< double > FVector4
Definition MathFwd.h:49
UE::Math::TIntVector3< int32 > FIntVector3
Definition MathFwd.h:92
FInt32Vector3 FIntVector
Definition MathFwd.h:115
UE::Math::TVector4< float > FVector4f
Definition MathFwd.h:75
#define UPROPERTY(...)
UObject definition macros.
Definition ObjectMacros.h:744
#define UFUNCTION(...)
Definition ObjectMacros.h:745
#define GENERATED_UCLASS_BODY(...)
Definition ObjectMacros.h:768
#define UCLASS(...)
Definition ObjectMacros.h:776
EPixelFormat
Definition PixelFormat.h:16
@ PF_Unknown
Definition PixelFormat.h:17
@ Stop
Definition PrecomputedVolumetricLightmapStreaming.cpp:26
FArchive & operator<<(FArchive &Ar, UE::SVT::FHeader &Header)
Definition SparseVolumeTexture.cpp:95
ESparseVolumeTextureShaderUniform
Definition SparseVolumeTexture.h:298
@ ESparseVolumeTexture_TileSize
Definition SparseVolumeTexture.h:299
@ ESparseVolumeTexture_PageTableSize
Definition SparseVolumeTexture.h:300
@ ESparseVolumeTexture_UVScale
Definition SparseVolumeTexture.h:301
@ ESparseVolumeTexture_UVBias
Definition SparseVolumeTexture.h:302
@ ESparseVolumeTexture_Count
Definition SparseVolumeTexture.h:303
TextureAddress
Definition TextureDefines.h:496
CORE_API bool IsInParallelRenderingThread()
Definition ThreadingBase.cpp:301
bool Failed
Definition binka_ue_decode_test.cpp:18
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 AssetRegistryTagsContext.h:98
Definition RHICommandList.h:455
Definition RHITextureReference.h:8
Definition RenderResource.h:37
Definition Interface_AssetUserData.h:20
Definition ArrayView.h:139
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
void Reset(SizeType NewSize=0)
Definition Array.h:2246
UE_NODEBUG UE_FORCEINLINE_HINT bool IsValidIndex(SizeType Index) const
Definition Array.h:1122
Definition EnumAsByte.h:22
UE_FORCEINLINE_HINT ReferencedType * GetReference() const
Definition RefCounting.h:584
Definition StaticArray.h:26
Definition SubclassOf.h:30
Definition SparseVolumeTexture.h:659
Definition SparseVolumeTexture.h:640
virtual ~UAnimatedSparseVolumeTexture()=default
virtual const UE::SVT::FTextureRenderResources * GetTextureRenderResources() const override
Definition SparseVolumeTexture.h:649
Definition AssetUserData.h:18
Definition SparseVolumeTextureStreamingManager.h:96
Definition SparseVolumeTexture.h:261
ENGINE_API void GetPackedUniforms(FUintVector4 &OutPacked0, FUintVector4 &OutPacked1) const
Definition SparseVolumeTexture.cpp:870
const FHeader & GetHeader() const
Definition SparseVolumeTexture.h:264
FRHITextureReference * GetPhysicalTileDataATexture() const
Definition SparseVolumeTexture.h:269
FIntVector3 GetTileDataTextureResolution() const
Definition SparseVolumeTexture.h:265
int32 GetNumLogicalMipLevels() const
Definition SparseVolumeTexture.h:267
int32 GetFrameIndex() const
Definition SparseVolumeTexture.h:266
ENGINE_API void SetGlobalVolumeResolution_GameThread(const FIntVector3 &GlobalVolumeResolution)
Definition SparseVolumeTexture.cpp:893
virtual ENGINE_API void ReleaseRHI() override
Definition SparseVolumeTexture.cpp:909
FRHITextureReference * GetPhysicalTileDataBTexture() const
Definition SparseVolumeTexture.h:270
FRHITextureReference * GetPageTableTexture() const
Definition SparseVolumeTexture.h:268
virtual ENGINE_API void InitRHI(FRHICommandListBase &RHICmdList) override
Definition SparseVolumeTexture.cpp:902
Definition EditorBulkData.h:132
Definition Object.h:95
Definition SparseVolumeTexture.h:366
UE::SVT::FResources * GetResources()
Definition SparseVolumeTexture.h:390
virtual FVector4f GetFallbackValue(int32 AttributesIndex) const override
Definition SparseVolumeTexture.h:420
virtual int32 GetNumMipLevels() const override
Definition SparseVolumeTexture.h:416
virtual int32 GetNumFrames() const override
Definition SparseVolumeTexture.h:415
virtual FIntVector GetVolumeResolution() const override
Definition SparseVolumeTexture.h:418
virtual const UE::SVT::FTextureRenderResources * GetTextureRenderResources() const override
Definition SparseVolumeTexture.h:424
virtual TextureAddress GetTextureAddressX() const override
Definition SparseVolumeTexture.h:421
virtual TextureAddress GetTextureAddressZ() const override
Definition SparseVolumeTexture.h:423
virtual EPixelFormat GetFormat(int32 AttributesIndex) const override
Definition SparseVolumeTexture.h:419
virtual FTransform GetFrameTransform() const override
Definition SparseVolumeTexture.h:417
virtual TextureAddress GetTextureAddressY() const override
Definition SparseVolumeTexture.h:422
Definition SparseVolumeTexture.h:309
virtual EPixelFormat GetFormat(int32 AttributesIndex) const
Definition SparseVolumeTexture.h:336
virtual const UE::SVT::FTextureRenderResources * GetTextureRenderResources() const
Definition SparseVolumeTexture.h:341
FVector4 GetUniformParameter(int32 Index) const
Definition SparseVolumeTexture.h:346
virtual FVector4f GetFallbackValue(int32 AttributesIndex) const
Definition SparseVolumeTexture.h:337
virtual TextureAddress GetTextureAddressX() const
Definition SparseVolumeTexture.h:338
virtual FIntVector GetVolumeResolution() const
Definition SparseVolumeTexture.h:335
virtual ~USparseVolumeTexture()=default
virtual TextureAddress GetTextureAddressY() const
Definition SparseVolumeTexture.h:339
virtual TextureAddress GetTextureAddressZ() const
Definition SparseVolumeTexture.h:340
Definition SparseVolumeTexture.h:617
virtual ~UStaticSparseVolumeTexture()=default
int32 GetNumFrames() const override
Definition SparseVolumeTexture.h:631
Definition SparseVolumeTexture.h:452
virtual int32 GetNumMipLevels() const override
Definition SparseVolumeTexture.h:560
virtual TextureAddress GetTextureAddressZ() const override
Definition SparseVolumeTexture.h:567
virtual EPixelFormat GetFormat(int32 AttributesIndex) const override
Definition SparseVolumeTexture.h:563
virtual FTransform GetFrameTransform() const override
Definition SparseVolumeTexture.h:561
virtual TextureAddress GetTextureAddressY() const override
Definition SparseVolumeTexture.h:566
virtual FVector4f GetFallbackValue(int32 AttributesIndex) const override
Definition SparseVolumeTexture.h:564
virtual FIntVector GetVolumeResolution() const override
Definition SparseVolumeTexture.h:562
virtual const UE::SVT::FTextureRenderResources * GetTextureRenderResources() const override
Definition SparseVolumeTexture.h:568
virtual TextureAddress GetTextureAddressX() const override
Definition SparseVolumeTexture.h:565
EResourceFlag
Definition SparseVolumeTexture.h:188
@ EResourceFlag_StreamingDataInDDC
Definition SparseVolumeTexture.h:189
EValueType
Definition ShaderTypes.h:94
Definition AdvancedWidgetsModule.cpp:13
@ false
Definition radaudio_common.h:23
U16 Index
Definition radfft.cpp:71
Definition IoHash.h:33
Definition UnrealType.h:6865
Definition ResourceSize.h:31
Definition DontCopy.h:13
Definition ObjectPtr.h:488
Definition BoxSphereBounds.h:25
IntType Y
Definition IntVector.h:34
IntType X
Definition IntVector.h:31
static const TIntVector3 ZeroValue
Definition IntVector.h:45
IntType Z
Definition IntVector.h:37
static CORE_API const TTransform< double > Identity
Definition TransformNonVectorized.h:58
Definition SparseVolumeTexture.h:36
FHeader()=default
FIntVector3 VirtualVolumeAABBMax
Definition SparseVolumeTexture.h:39
FIntVector3 VirtualVolumeAABBMin
Definition SparseVolumeTexture.h:38
TStaticArray< EPixelFormat, 2 > AttributesFormats
Definition SparseVolumeTexture.h:43
FIntVector3 PageTableVolumeAABBMax
Definition SparseVolumeTexture.h:42
TStaticArray< FVector4f, 2 > FallbackValues
Definition SparseVolumeTexture.h:44
FIntVector3 VirtualVolumeResolution
Definition SparseVolumeTexture.h:37
FIntVector3 PageTableVolumeAABBMin
Definition SparseVolumeTexture.h:41
ENGINE_API bool Validate(bool bPrintToLog)
Definition SparseVolumeTexture.cpp:182
ENGINE_API void UpdatePageTableFromGlobalNumMipLevels(int32 NumMipLevelsGlobal)
Definition SparseVolumeTexture.cpp:166
FIntVector3 PageTableVolumeResolution
Definition SparseVolumeTexture.h:40
Definition SparseVolumeTexture.h:97
TStaticArray< int32, 2 > TileDataSize
Definition SparseVolumeTexture.h:107
int32 NumPhysicalTiles
Definition SparseVolumeTexture.h:108
int32 PageTableSize
Definition SparseVolumeTexture.h:101
TStaticArray< int32, 2 > OccupancyBitsSize
Definition SparseVolumeTexture.h:103
TStaticArray< int32, 2 > TileDataOffsetsOffset
Definition SparseVolumeTexture.h:104
TStaticArray< int32, 2 > TileDataOffset
Definition SparseVolumeTexture.h:106
TStaticArray< int32, 2 > OccupancyBitsOffset
Definition SparseVolumeTexture.h:102
int32 BulkOffset
Definition SparseVolumeTexture.h:98
int32 PageTableOffset
Definition SparseVolumeTexture.h:100
TStaticArray< int32, 2 > TileDataOffsetsSize
Definition SparseVolumeTexture.h:105
int32 BulkSize
Definition SparseVolumeTexture.h:99
Definition SparseVolumeTexture.h:61
uint32 PageCount
Definition SparseVolumeTexture.h:63
uint32 PageOffset
Definition SparseVolumeTexture.h:62
Definition SparseVolumeTexture.h:59
void GetTileRange(uint32 PageOffset, uint32 PageCount, uint32 &OutTileOffset, uint32 &OutTileCount) const
Definition SparseVolumeTexture.cpp:238
bool IsValidPageIndex(uint32 PageIndex) const
Definition SparseVolumeTexture.h:74
void Reset()
Definition SparseVolumeTexture.cpp:222
TArray< uint32 > TileIndices
Definition SparseVolumeTexture.h:68
TArray< FMip > MipInfo
Definition SparseVolumeTexture.h:66
TArray< uint32 > PackedPageTableCoords
Definition SparseVolumeTexture.h:67
uint32 NumPages() const
Definition SparseVolumeTexture.h:73
TArray< uint32 > ParentIndices
Definition SparseVolumeTexture.h:69
Definition SparseVolumeTexture.h:194
uint32 ResourceFlags
Definition SparseVolumeTexture.h:197
bool HasStreamingData() const
Definition SparseVolumeTexture.cpp:319
FByteBulkData StreamableMipLevels
Definition SparseVolumeTexture.h:204
TArray< uint8 > RootData
Definition SparseVolumeTexture.h:202
FHeader Header
Definition SparseVolumeTexture.h:196
int32 NumMipLevels
Definition SparseVolumeTexture.h:198
FTileStreamingMetaData StreamingMetaData
Definition SparseVolumeTexture.h:200
FPageTopology Topology
Definition SparseVolumeTexture.h:206
Definition SparseVolumeTextureData.h:41
Definition SparseVolumeTexture.h:121
TStaticArray< uint32, 2 > NumVoxels
Definition SparseVolumeTexture.h:128
TStaticArray< uint32, 2 > VoxelDataSizes
Definition SparseVolumeTexture.h:127
TStaticArray< uint32, 2 > OccupancyBitsSizes
Definition SparseVolumeTexture.h:125
uint32 Offset
Definition SparseVolumeTexture.h:122
uint32 Size
Definition SparseVolumeTexture.h:123
TStaticArray< uint32, 2 > OccupancyBitsOffsets
Definition SparseVolumeTexture.h:124
TStaticArray< uint32, 2 > VoxelDataOffsets
Definition SparseVolumeTexture.h:126
Definition SparseVolumeTexture.h:133
uint32 GetNumTiles() const
Definition SparseVolumeTexture.h:148
void GetNumVoxelsInTileRange(uint32 TileOffset, uint32 TileCount, uint32 FormatSizeA, uint32 FormatSizeB, const TBitArray<> *OptionalValidTiles, uint32 &OutNumVoxelsA, uint32 &OutNumVoxelsB) const
Definition SparseVolumeTexture.cpp:949
TArray< uint32 > TileDataOffsets
Definition SparseVolumeTexture.h:137
uint32 FirstStreamingTileIndex
Definition SparseVolumeTexture.h:139
uint32 GetTileMemorySize(uint32 TileIndex) const
Definition SparseVolumeTexture.h:168
void Reset()
Definition SparseVolumeTexture.h:141
uint32 GetRootTileSize() const
Definition SparseVolumeTexture.h:163
void GetTileRangeMemoryOffsetSize(uint32 TileOffset, uint32 TileCount, uint32 &OutMemoryOffset, uint32 &OutMemorySize) const
Definition SparseVolumeTexture.h:173
bool HasRootTile() const
Definition SparseVolumeTexture.h:158
TArray< uint16 > NumVoxelsA
Definition SparseVolumeTexture.h:138
FTileInfo GetTileInfo(uint32 TileIndex, uint32 FormatSizeA, uint32 FormatSizeB) const
Definition SparseVolumeTexture.cpp:916
uint32 GetNumStreamingTiles() const
Definition SparseVolumeTexture.h:153