Hello Friends,
I’m currently trying to generate some Render Targets on play from ue4 c++ on BeginPlay.
I’ve found you can easily generate textures doing the following:
//testing on begin play
int i = 0;
//get minimap content game folder from content browser
FString TextureName = TEXT("T_MM_T");
TextureName += FString::FromInt(i);
FString PackageName = TEXT("/Game/Textures/");
PackageName += TextureName;
UPackage* Package = CreatePackage(NULL, *PackageName);
Package->FullyLoad();
//create texture
float TextureWidth = 2048;
float TextureHeight = 2048;
UTexture2D* NewTexture = NewObject<UTexture2D>(Package, *TextureName, RF_Public | RF_Standalone | RF_MarkAsRootSet);
NewTexture->AddToRoot(); // This line prevents garbage collection of the texture
NewTexture->PlatformData = new FTexturePlatformData(); // Then we initialize the PlatformData
NewTexture->PlatformData->SizeX = TextureWidth;
NewTexture->PlatformData->SizeY = TextureHeight;
NewTexture->PlatformData->NumSlices = 1;
NewTexture->PlatformData->PixelFormat = EPixelFormat::PF_FloatRGBA;
//save texture
NewTexture->Source.Init(TextureWidth, TextureHeight, 1, 1, ETextureSourceFormat::TSF_BGRA8);
NewTexture->UpdateResource();
Package->MarkPackageDirty();
FAssetRegistryModule::AssetCreated(NewTexture);
FString PackageFileName = FPackageName::LongPackageNameToFilename(PackageName, FPackageName::GetAssetPackageExtension());
bool bSaved = UPackage::SavePackage(Package, NewTexture, EObjectFlags::RF_Public | EObjectFlags::RF_Standalone, *PackageFileName, GError, nullptr, true, true, SAVE_NoError);
UE_LOG(LogTemp, Warning, TEXT("Generated new texture at %s"), *PackageName);
Now when I try to use this method for UTextureRenderTarget, nothing saves and I get “LogOutputDevice: Error: Class which was marked abstract was trying to be loaded. It will be nulled out on save. RT_MM_RT0 TextureRenderTarget”.
Why does this not work?
UTextureRenderTarget* NewAsset = NewObject<UTextureRenderTarget>(Package, *AssetName, RF_Public | RF_Standalone | RF_MarkAsRootSet);
NewAsset->AddToRoot(); // This line prevents garbage collection of the texture
NewAsset->CreateResource();
NewAsset->Source.Init(TextureWidth, TextureHeight, 1, 1, ETextureSourceFormat::TSF_BGRA8);
NewAsset->UpdateResource();
Package->MarkPackageDirty();
FAssetRegistryModule::AssetCreated(NewAsset);
FString PackageFileName = FPackageName::LongPackageNameToFilename(PackageName, FPackageName::GetAssetPackageExtension());
bool bSaved = UPackage::SavePackage(Package, NewAsset, EObjectFlags::RF_Public | EObjectFlags::RF_Standalone, *PackageFileName, GError, nullptr, true, true, SAVE_NoError);
UE_LOG(LogTemp, Warning, TEXT("Generated new texture at %s"), *PackageName);
Does anyone have advice for generating TextureRenderTargets from ue4 c++?
Thank you for your time!