Files
UnrealEngine/Engine/Source/Editor/Sequencer/Private/Misc/Thumbnail/ThumbnailCaptureUtils.cpp
2025-05-18 13:04:45 +08:00

53 lines
1.9 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "ThumbnailCaptureUtils.h"
#include "AssetRegistry/AssetData.h"
#include "Containers/Array.h"
#include "Editor.h"
#include "Misc/ConsoleVariables.h"
#include "Misc/ScopeExit.h"
#include "ObjectTools.h"
#include "Templates/Function.h"
#include "TextureResource.h"
namespace UE::Sequencer
{
void CaptureThumbnailForAssetBlocking(UObject& Asset, FSequencer& Sequencer, const FSequencerThumbnailCaptureSettings& Settings)
{
if (!CVarEnableRelevantThumbnails.GetValueOnGameThread()
|| !CaptureThumbnailFromCameraCutBlocking(Asset, Sequencer, Settings))
{
CaptureThumbnailFromViewportBlocking(Asset);
}
}
void SetAssetThumbnail(UObject& Asset, const TArrayView64<FColor>& Bitmap)
{
const int32 ThumbnailSize = ThumbnailTools::DefaultThumbnailSize;
const int32 NumPixels = ThumbnailSize * ThumbnailSize;
check(Bitmap.Num() == NumPixels);
FObjectThumbnail TempThumbnail;
TempThumbnail.SetImageSize(ThumbnailSize, ThumbnailSize);
TArray<uint8>& ThumbnailByteArray = TempThumbnail.AccessImageData();
constexpr int32 MemorySize = NumPixels * sizeof(FColor);
ThumbnailByteArray.AddUninitialized(MemorySize);
FMemory::Memcpy(&ThumbnailByteArray[0], &Bitmap[0], MemorySize);
const FString ObjectFullName = FAssetData(&Asset).GetFullName();
UPackage* Package = Asset.GetPackage();
FObjectThumbnail* NewThumbnail = ThumbnailTools::CacheThumbnail(ObjectFullName, &TempThumbnail, Package);
if (ensure(NewThumbnail))
{
// We need to indicate that the package needs to be resaved
Package->MarkPackageDirty();
// Let the content browser know that we've changed the thumbnail
NewThumbnail->MarkAsDirty();
// Signal that the asset was changed so thumbnail pools will update
Asset.PostEditChange();
// Set that thumbnail as a valid custom thumbnail so it'll be saved out
NewThumbnail->SetCreatedAfterCustomThumbsEnabled();
}
}
}