FSlateTextureDataPtr FTileThumbnail::UpdateThumbnail() { // No need images for persistent and always loaded levels if (TileModel.IsPersistent()) { return ToSlateTextureData(nullptr); } // Load image from a package header if (!TileModel.IsVisible() || TileModel.IsSimulating()) { const FName LevelAssetName = TileModel.GetAssetName(); TSet<FName> ObjectFullNames; ObjectFullNames.Add(LevelAssetName); FThumbnailMap ThumbnailMap; if (ThumbnailTools::ConditionallyLoadThumbnailsFromPackage(TileModel.GetPackageFileName(), ObjectFullNames, ThumbnailMap)) { const FObjectThumbnail* ObjectThumbnail = ThumbnailMap.Find(LevelAssetName); return ToSlateTextureData(ObjectThumbnail); } } // Render image from a visible level else { ULevel* TargetLevel = TileModel.GetLevelObject(); if (TargetLevel) { FIntPoint RTSize = ThumbnailRenderTarget->GetSizeXY(); // Set persistent world package as transient to avoid package dirtying during thumbnail rendering FUnmodifiableObject ImmuneWorld(TargetLevel->OwningWorld); FObjectThumbnail NewThumbnail; // Generate the thumbnail ThumbnailTools::RenderThumbnail( TargetLevel, RTSize.X, RTSize.Y, ThumbnailTools::EThumbnailTextureFlushMode::NeverFlush, ThumbnailRenderTarget, &NewThumbnail ); UPackage* MyOutermostPackage = CastChecked<UPackage>(TargetLevel->GetOutermost()); ThumbnailTools::CacheThumbnail(TileModel.GetAssetName().ToString(), &NewThumbnail, MyOutermostPackage); return ToSlateTextureData(&NewThumbnail); } } return ToSlateTextureData(nullptr); }
void FContentBrowserSingleton::OnObjectPropertyChanged(UObject* ObjectBeingModified) { if ( !ensure(ObjectBeingModified) ) { return; } if ( ObjectBeingModified->HasAnyFlags(RF_ClassDefaultObject) && ObjectBeingModified->GetClass()->ClassGeneratedBy != NULL ) { // This is a CDO for a blueprint. Pretend the blueprint changed instead. ObjectBeingModified = ObjectBeingModified->GetClass()->ClassGeneratedBy; } if ( ObjectBeingModified->IsAsset() ) { // An object in memory was modified. We'll mark it's thumbnail as dirty so that it'll be // regenerated on demand later. (Before being displayed in the browser, or package saves, etc.) FObjectThumbnail* Thumbnail = ThumbnailTools::GetThumbnailForObject( ObjectBeingModified ); if ( Thumbnail == NULL ) { // If we don't yet have a thumbnail map, load one from disk if possible FName ObjectFullName = FName(*ObjectBeingModified->GetFullName()); TArray<FName> ObjectFullNames; FThumbnailMap LoadedThumbnails; ObjectFullNames.Add( ObjectFullName ); if ( ThumbnailTools::ConditionallyLoadThumbnailsForObjects( ObjectFullNames, LoadedThumbnails ) ) { Thumbnail = LoadedThumbnails.Find(ObjectFullName); if ( Thumbnail != NULL ) { Thumbnail = ThumbnailTools::CacheThumbnail(ObjectBeingModified->GetFullName(), Thumbnail, ObjectBeingModified->GetOutermost()); } } } if( Thumbnail != NULL ) { // Mark the thumbnail as dirty Thumbnail->MarkAsDirty(); } } }