You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
Removed the with_engine defines from the texture factory nodes as those are no longer needed. Made the texture factory node abstract to reflect the engine structure for those asset. Removed the asset class attribute for the texture node as it is no longer needed. #jira UETOOL-4711 #rb Alexis.Matte #preflight 6216623cc152c67496d9d703 [CL 19094855 by Julien StJean in ue5-main branch]
99 lines
3.3 KiB
C++
99 lines
3.3 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#include "UDIMUtilities.h"
|
|
|
|
#include "Internationalization/Regex.h"
|
|
#include "Misc/Paths.h"
|
|
#include "HAL/FileManager.h"
|
|
|
|
namespace UE
|
|
{
|
|
namespace TextureUtilitiesCommon
|
|
{
|
|
uint32 ParseUDIMName(const FString& Name, const FString& UdimRegexPattern, FString& OutPrefixName, FString& OutPostfixName)
|
|
{
|
|
FRegexPattern RegexPattern( UdimRegexPattern );
|
|
FRegexMatcher RegexMatcher( RegexPattern, Name );
|
|
|
|
int32 UdimValue = INDEX_NONE;
|
|
|
|
if ( RegexMatcher.FindNext() )
|
|
{
|
|
const int32 StartOfCaptureGroup1 = RegexMatcher.GetCaptureGroupBeginning(1);
|
|
const int32 EndOfCaptureGroup1 = RegexMatcher.GetCaptureGroupEnding(1);
|
|
const int32 StartOfCaptureGroup2 = RegexMatcher.GetCaptureGroupBeginning(2);
|
|
const int32 EndOfCaptureGroup2 = RegexMatcher.GetCaptureGroupEnding(2);
|
|
const int32 StartOfCaptureGroup3 = RegexMatcher.GetCaptureGroupBeginning(3);
|
|
const int32 EndOfCaptureGroup3 = RegexMatcher.GetCaptureGroupEnding(3);
|
|
|
|
if ( StartOfCaptureGroup1 != INDEX_NONE && StartOfCaptureGroup2 != INDEX_NONE &&
|
|
EndOfCaptureGroup1 != INDEX_NONE && EndOfCaptureGroup2 != INDEX_NONE )
|
|
{
|
|
LexFromString( UdimValue, *Name.Mid( StartOfCaptureGroup2, EndOfCaptureGroup2 - StartOfCaptureGroup2 ) );
|
|
|
|
OutPrefixName = Name.Mid( StartOfCaptureGroup1, EndOfCaptureGroup1 - StartOfCaptureGroup1 );
|
|
|
|
if ( StartOfCaptureGroup3 != INDEX_NONE && EndOfCaptureGroup3 != INDEX_NONE )
|
|
{
|
|
OutPostfixName = Name.Mid( StartOfCaptureGroup3, EndOfCaptureGroup3 - StartOfCaptureGroup3 );
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( UdimValue < 1001 )
|
|
{
|
|
// UDIM starts with 1001 as the origin
|
|
return INDEX_NONE;
|
|
}
|
|
|
|
return UdimValue;
|
|
}
|
|
|
|
int32 GetUDIMIndex(int32 BlockX, int32 BlockY)
|
|
{
|
|
return BlockY * 10 + BlockX + 1001;
|
|
}
|
|
|
|
TEXTUREUTILITIESCOMMON_API TMap<int32, FString> GetUDIMBlocksFromSourceFile(const FString& File, const FString& UdimRegexPattern, FString* OutFilenameWithoutUdimPatternAndExtension)
|
|
{
|
|
FString PreUDIMName;
|
|
FString PostUDIMName;
|
|
TMap<int32, FString> UDIMsAndSourcesFile;
|
|
|
|
if (ParseUDIMName(FPaths::GetBaseFilename(File), UdimRegexPattern, PreUDIMName, PostUDIMName) != INDEX_NONE)
|
|
{
|
|
const FString Path = FPaths::GetPath(File);
|
|
const FString UDIMFilter = (Path / PreUDIMName) + TEXT("*") + PostUDIMName + FPaths::GetExtension(File, true);
|
|
|
|
TArray<FString> UDIMFiles;
|
|
IFileManager::Get().FindFiles(UDIMFiles, *UDIMFilter, true, false);
|
|
UDIMFiles.Reserve(UDIMFiles.Num());
|
|
|
|
for (FString& UDIMFile : UDIMFiles)
|
|
{
|
|
const int32 UDIMIndex = ParseUDIMName(FPaths::GetBaseFilename(UDIMFile), UdimRegexPattern, PreUDIMName, PostUDIMName);
|
|
if (UDIMIndex != INDEX_NONE)
|
|
{
|
|
const FString UDIMName = PreUDIMName + PostUDIMName;
|
|
FString UDIMPath = FPaths::Combine(Path, UDIMFile);
|
|
UDIMsAndSourcesFile.Add(UDIMIndex, MoveTemp(UDIMPath));
|
|
}
|
|
}
|
|
|
|
if (!UDIMsAndSourcesFile.IsEmpty() && OutFilenameWithoutUdimPatternAndExtension)
|
|
{
|
|
*OutFilenameWithoutUdimPatternAndExtension = PreUDIMName + PostUDIMName;
|
|
}
|
|
}
|
|
|
|
return UDIMsAndSourcesFile;
|
|
}
|
|
|
|
void ExtractUDIMCoordinates(int32 UDIMIndex, int32& OutBlockX, int32& OutBlockY)
|
|
{
|
|
OutBlockX = (UDIMIndex - 1001) % 10;
|
|
OutBlockY = (UDIMIndex - 1001) / 10;
|
|
}
|
|
}
|
|
}
|