diff --git a/Code/Tools/AssetProcessor/native/AssetManager/assetProcessorManager.cpp b/Code/Tools/AssetProcessor/native/AssetManager/assetProcessorManager.cpp index 4cd4489a4c..fc806f6c9e 100644 --- a/Code/Tools/AssetProcessor/native/AssetManager/assetProcessorManager.cpp +++ b/Code/Tools/AssetProcessor/native/AssetManager/assetProcessorManager.cpp @@ -3573,19 +3573,61 @@ namespace AssetProcessor QString knownPathBeforeWildcard = encodedFileData.left(slashBeforeWildcardIndex + 1); // include the slash QString relativeSearch = encodedFileData.mid(slashBeforeWildcardIndex + 1); // skip the slash - for (int i = 0; i < m_platformConfig->GetScanFolderCount(); ++i) + // Absolute path, just check the 1 scan folder + if (AZ::IO::PathView(encodedFileData.toUtf8().constData()).IsAbsolute()) { - const ScanFolderInfo* scanFolderInfo = &m_platformConfig->GetScanFolderAt(i); - - if (!scanFolderInfo->RecurseSubFolders() && encodedFileData.contains("/")) + QString scanFolderName; + if (!m_platformConfig->ConvertToRelativePath(encodedFileData, resultDatabaseSourceName, scanFolderName)) { - continue; + AZ_Warning( + AssetProcessor::ConsoleChannel, false, + "'%s' does not appear to be in any input folder. Use relative paths instead.", + sourceDependency.m_sourceFileDependencyPath.c_str()); } - QDir rooted(scanFolderInfo->ScanPath()); - QString absolutePath = rooted.absoluteFilePath(knownPathBeforeWildcard); + auto scanFolderInfo = m_platformConfig->GetScanFolderByPath(scanFolderName); + + // Make an absolute path that is ScanFolderPath + Part of search path before the wildcard + QDir rooted(scanFolderName); + QString scanFolderAndKnownSubPath = rooted.absoluteFilePath(knownPathBeforeWildcard); + + resolvedDependencyList.append(m_platformConfig->FindWildcardMatches( + scanFolderAndKnownSubPath, relativeSearch, false, scanFolderInfo->RecurseSubFolders())); + } + else // Relative path, check every scan folder + { + for (int i = 0; i < m_platformConfig->GetScanFolderCount(); ++i) + { + const ScanFolderInfo* scanFolderInfo = &m_platformConfig->GetScanFolderAt(i); + + if (!scanFolderInfo->RecurseSubFolders() && encodedFileData.contains("/")) + { + continue; + } - resolvedDependencyList.append(m_platformConfig->FindWildcardMatches(absolutePath, relativeSearch, false, scanFolderInfo->RecurseSubFolders())); + QDir rooted(scanFolderInfo->ScanPath()); + QString absolutePath = rooted.absoluteFilePath(knownPathBeforeWildcard); + + resolvedDependencyList.append(m_platformConfig->FindWildcardMatches( + absolutePath, relativeSearch, false, scanFolderInfo->RecurseSubFolders())); + } + } + + // Convert to relative paths + for (auto dependencyItr = resolvedDependencyList.begin(); dependencyItr != resolvedDependencyList.end();) + { + QString relativePath, scanFolder; + if (m_platformConfig->ConvertToRelativePath(*dependencyItr, relativePath, scanFolder)) + { + *dependencyItr = relativePath; + ++dependencyItr; + } + else + { + AZ_Warning("AssetProcessor", false, "Failed to get relative path for wildcard dependency file %s. Is the file within a scan folder?", + dependencyItr->toUtf8().constData()); + dependencyItr = resolvedDependencyList.erase(dependencyItr); + } } resultDatabaseSourceName = encodedFileData.replace('\\', '/'); diff --git a/Code/Tools/AssetProcessor/native/utilities/PlatformConfiguration.cpp b/Code/Tools/AssetProcessor/native/utilities/PlatformConfiguration.cpp index 4a033cf6ca..9a60bf3110 100644 --- a/Code/Tools/AssetProcessor/native/utilities/PlatformConfiguration.cpp +++ b/Code/Tools/AssetProcessor/native/utilities/PlatformConfiguration.cpp @@ -1435,32 +1435,35 @@ namespace AssetProcessor return QString(); } - QStringList PlatformConfiguration::FindWildcardMatches(const QString& sourceFolder, QString relativeName, bool includeFolders, bool recursiveSearch) const + QStringList PlatformConfiguration::FindWildcardMatches( + const QString& sourceFolder, QString relativeName, bool includeFolders, bool recursiveSearch) const { if (relativeName.isEmpty()) { return QStringList(); } - const int pathLen = sourceFolder.length() + 1; + QDir sourceFolderDir(sourceFolder); - relativeName.replace('\\', '/'); + QString posixRelativeName = QDir::fromNativeSeparators(relativeName); QStringList returnList; - QRegExp nameMatch{ relativeName, Qt::CaseInsensitive, QRegExp::Wildcard }; - QDirIterator diretoryIterator(sourceFolder, QDir::AllEntries | QDir::NoSymLinks | QDir::NoDotAndDotDot, recursiveSearch ? QDirIterator::Subdirectories : QDirIterator::NoIteratorFlags); + QRegExp nameMatch{ posixRelativeName, Qt::CaseInsensitive, QRegExp::Wildcard }; + QDirIterator dirIterator( + sourceFolderDir.path(), QDir::AllEntries | QDir::NoSymLinks | QDir::NoDotAndDotDot, + recursiveSearch ? QDirIterator::Subdirectories : QDirIterator::NoIteratorFlags); QStringList files; - while (diretoryIterator.hasNext()) + while (dirIterator.hasNext()) { - diretoryIterator.next(); - if (!includeFolders && !diretoryIterator.fileInfo().isFile()) + dirIterator.next(); + if (!includeFolders && !dirIterator.fileInfo().isFile()) { continue; } - QString pathMatch{ diretoryIterator.filePath().mid(pathLen) }; + QString pathMatch{ sourceFolderDir.relativeFilePath(dirIterator.filePath()) }; if (nameMatch.exactMatch(pathMatch)) { - returnList.append(AssetUtilities::NormalizeFilePath(diretoryIterator.filePath())); + returnList.append(QDir::fromNativeSeparators(dirIterator.filePath())); } } return returnList;