Got it working.
Just replace YOUR_API with the your project api
.h
#pragma once
#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "ImageFunctionLibrary.generated.h"
/**
*
*/
UCLASS()
class YOUR_API UImageFunctionLibrary : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
UFUNCTION(BlueprintCallable, BlueprintPure)
static TArray<UTexture2D*> ImportAsTexture2DArray(const FString directory, const bool fullPath, const FString onlyFilesStartingWith, const FString onlyFilesWithExtension, bool skipRecursionSelf);
UFUNCTION()
static TArray<FString> GetAllFilesInDirectory(const FString directory, const bool fullPath, const FString onlyFilesStartingWith, const FString onlyFilesWithExtension, bool skipRecursionSelf);
UFUNCTION(BlueprintCallable, BlueprintPure)
static TArray<UTexture2D*> ImportTexture2DUAssetArray(const FString directory, const FString onlyFilesStartingWith, bool IncludeSubdirectories);
UFUNCTION()
static FString filterDirectory(FString &path);
};
.cpp
#include "ImageFunctionLibrary.h"
#include "ImageUtils.h"
#include "HAL/FileManagerGeneric.h"
#include "Misc/LocalTimestampDirectoryVisitor.h"
TArray<UTexture2D*> UImageFunctionLibrary::ImportAsTexture2DArray(const FString directory, const bool fullPath, const FString onlyFilesStartingWith, const FString onlyFilesWithExtension, bool skipRecursionSelf = true)
{
FString directoryCut = directory;
filterDirectory(directoryCut);
TArray<UTexture2D*> filesArray;
TArray<FString> files = GetAllFilesInDirectory(directoryCut, fullPath, onlyFilesStartingWith, onlyFilesWithExtension, skipRecursionSelf);
for (int32 i = 0; i < files.Num(); i++) {
UTexture2D* f = FImageUtils::ImportFileAsTexture2D(files[i]);
filesArray.Add(f);
}
return filesArray;
}
TArray<UTexture2D*> UImageFunctionLibrary::ImportTexture2DUAssetArray(const FString directory, const FString onlyFilesStartingWith, bool IncludeSubdirectories)
{
TArray<UTexture2D*> returnFiles;
FString directoryCut = directory;
filterDirectory(directoryCut);
FString contentPath = FPaths::ProjectContentDir();
FString fullPath = FPaths::ConvertRelativePathToFull(contentPath);
FString fullProjPath = fullPath + directory;
TArray<FString> files = GetAllFilesInDirectory(fullProjPath, true, onlyFilesStartingWith, "uasset", !IncludeSubdirectories);
for (int i = 0; i < files.Num(); i++) {
files[i].RemoveFromStart(fullPath);
files[i].RemoveFromEnd(".uasset");
//FString filePath = "/Game/" + directory + "/" + files[i];
FString filePath = "/Game/" + files[i];
FSoftObjectPath TexturePath(TEXT("Texture2D'" + filePath + "'"));
UTexture2D* texture2d = Cast<UTexture2D>(TexturePath.ResolveObject());
if (texture2d == nullptr)
{
texture2d = CastChecked<UTexture2D>(TexturePath.TryLoad());
returnFiles.Add(texture2d);
}
}
return returnFiles;
}
FString UImageFunctionLibrary::filterDirectory(FString &path)
{
path.ReplaceInline(TEXT("\\"), TEXT("/"), ESearchCase::CaseSensitive);
path.ReplaceInline(TEXT("//"), TEXT("/"), ESearchCase::CaseSensitive);
path.RemoveFromStart(TEXT("/"));
path.RemoveFromEnd(TEXT("/"));
FPlatformMisc::NormalizePath(path);
path.RemoveFromEnd(FPaths::GetExtension(path, true));
return path;
}
TArray<FString> UImageFunctionLibrary::GetAllFilesInDirectory(const FString directory, const bool fullPath, const FString onlyFilesStartingWith, const FString onlyFilesWithExtension,bool skipRecursionSelf = true)
{
FString directoryCut = directory;
filterDirectory(directoryCut);
// Get all files in directory
TArray<FString> directoriesToSkip;
TArray<FString> directoriesToSkipRecurse;
if (skipRecursionSelf == true) {
directoriesToSkipRecurse.Add(directoryCut);
}
IPlatformFile& PlatformFile = FPlatformFileManager::Get().GetPlatformFile();
FLocalTimestampDirectoryVisitor Visitor(PlatformFile, directoriesToSkip, directoriesToSkipRecurse, false);
PlatformFile.IterateDirectory(*directoryCut, Visitor);
TArray<FString> files;
for (TMap<FString, FDateTime>::TIterator TimestampIt(Visitor.FileTimes); TimestampIt; ++TimestampIt)
{
const FString filePath = TimestampIt.Key();
const FString fileName = FPaths::GetCleanFilename(filePath);
bool shouldAddFile = true;
// Check if filename starts with required characters
if (!onlyFilesStartingWith.IsEmpty())
{
const FString left = fileName.Left(onlyFilesStartingWith.Len());
if (!(fileName.Left(onlyFilesStartingWith.Len()).Equals(onlyFilesStartingWith)))
shouldAddFile = false;
}
// Check if file extension is required characters
if (!onlyFilesWithExtension.IsEmpty())
{
if (!(FPaths::GetExtension(fileName, false).Equals(onlyFilesWithExtension, ESearchCase::IgnoreCase)))
shouldAddFile = false;
}
// Add full path to results
if (shouldAddFile)
{
files.Add(fullPath ? filePath : fileName);
}
}
return files;
}
edit: found a bug is now fixed. Function renamed to “ImportTexture2DUAssetArray”
added folder filter / sanitizer