Files
UnrealEngineUWP/Engine/Source/Editor/UnrealEd/Public/ThumbnailExternalCache.h
aurel cordonnier 34f55d3a4a Merge from Release-Engine-Test @ 17946149 to UE5/Main
This represents UE4/Main @17911760, Release-5.0 @17915875 and Dev-PerfTest @17914035

[CL 17949667 by aurel cordonnier in ue5-main branch]
2021-10-27 15:14:40 -04:00

107 lines
2.8 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "ThumbnailRendering/ThumbnailManager.h"
#include "ThumbnailRendering/ThumbnailRenderer.h"
#include "Misc/ObjectThumbnail.h"
class IPlugin;
struct UNREALED_API FThumbnailExternalCacheSettings
{
/** Recompress any lossless thumbnails */
bool bRecompressLossless = false;
/** Reduce size of any thumbnails to MaxImageSize */
int32 MaxImageSize = INT32_MAX;
};
class FThumbnailExternalCache
{
public:
FThumbnailExternalCache();
~FThumbnailExternalCache();
/** Get thumbnail external cache */
UNREALED_API static FThumbnailExternalCache& Get();
/** Load thumbnails for the given object names from external cache */
UNREALED_API bool LoadThumbnailsFromExternalCache(const TSet<FName>& InObjectFullNames, FThumbnailMap& InOutThumbnails);
/** Save thumbnails for the given assets to an external file. Deterministic if assets were sorted. */
UNREALED_API bool SaveExternalCache(const FString& InFilename, const TArrayView<FAssetData> InAssetDatas, const FThumbnailExternalCacheSettings& InSettings);
/** Sort asset data list if determinism needed */
UNREALED_API static void SortAssetDatas(TArray<FAssetData>& InOutAssetDatas);
/** Try to load thumbnail for a given asset data */
static FObjectThumbnail LoadThumbnailFromPackage(const FAssetData& AssetData);
enum class EThumbnailExternalCacheHeaderFlags : uint64
{
None = 0,
};
struct FThumbnailExternalCacheHeader
{
uint64 HeaderId = 0;
uint64 Version = 0;
uint64 Flags = 0;
FString ImageFormatName;
int64 ThumbnailTableOffset = 0;
void Serialize(FArchive& Ar)
{
Ar << HeaderId;
Ar << Version;
Ar << Flags;
Ar << ImageFormatName;
Ar << ThumbnailTableOffset; // Offset must be serialized last
}
bool HasAnyFlags(EThumbnailExternalCacheHeaderFlags FlagsToCheck) const
{
return (Flags & (uint64)FlagsToCheck) != 0;
}
};
struct FThumbnailEntry
{
int64 Offset = 0;
};
struct FThumbnailCacheFile
{
bool bUnableToOpenFile = false;
FString Filename;
FThumbnailExternalCacheHeader Header;
TMap<FName, FThumbnailEntry> NameToEntry;
};
private:
void SaveExternalCache(FArchive& Ar, const TArrayView<FAssetData> InAssetDatas, const FThumbnailExternalCacheSettings& InSettings);
void Init();
void Cleanup();
void OnContentPathMounted(const FString& InAssetPath, const FString& InFilesystemPath);
void OnContentPathDismounted(const FString& InAssetPath, const FString& InFilesystemPath);
void LoadCacheFileIndexForPlugin(const TSharedPtr<IPlugin> InPlugin);
bool LoadCacheFileIndex(const FString& Filename);
bool LoadCacheFileIndex(FArchive& Ar, const TSharedPtr<FThumbnailCacheFile>& CacheFile);
TMap<FString, TSharedPtr<FThumbnailCacheFile>> CacheFiles;
bool bHasInit = false;
bool bIsSavingCache = false;
};