Postprocessing/FX: Fix locating shaders in subdirectories

This commit is contained in:
Stenzek 2024-06-23 13:20:33 +10:00
parent 63055f1e7f
commit ea3fa7fe3d
No known key found for this signature in database
3 changed files with 35 additions and 17 deletions

View file

@ -1,8 +1,8 @@
// SPDX-FileCopyrightText: 2019-2023 Connor McLaughlin <stenzek@gmail.com>
// SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0)
#include "assert.h"
#include "string_util.h"
#include "assert.h"
#include <cctype>
#include <codecvt>
@ -306,6 +306,22 @@ void StringUtil::ReplaceAll(std::string* subject, const std::string_view search,
}
}
std::string StringUtil::ReplaceAll(const std::string_view subject, const char search, const char replacement)
{
std::string ret(subject);
ReplaceAll(&ret, search, replacement);
return ret;
}
void StringUtil::ReplaceAll(std::string* subject, const char search, const char replacement)
{
for (size_t i = 0; i < subject->length(); i++)
{
const char ch = (*subject)[i];
(*subject)[i] = (ch == search) ? replacement : ch;
}
}
bool StringUtil::ParseAssignmentString(const std::string_view str, std::string_view* key, std::string_view* value)
{
const std::string_view::size_type pos = str.find('=');

View file

@ -223,8 +223,10 @@ std::string_view StripWhitespace(const std::string_view str);
void StripWhitespace(std::string* str);
/// Splits a string based on a single character delimiter.
std::vector<std::string_view> SplitString(const std::string_view str, char delimiter, bool skip_empty = true);
std::vector<std::string> SplitNewString(const std::string_view str, char delimiter, bool skip_empty = true);
[[nodiscard]] std::vector<std::string_view> SplitString(const std::string_view str, char delimiter,
bool skip_empty = true);
[[nodiscard]] std::vector<std::string> SplitNewString(const std::string_view str, char delimiter,
bool skip_empty = true);
/// Joins a string together using the specified delimiter.
template<typename T>
@ -253,9 +255,11 @@ static inline std::string JoinString(const T& start, const T& end, const std::st
}
/// Replaces all instances of search in subject with replacement.
std::string ReplaceAll(const std::string_view subject, const std::string_view search,
const std::string_view replacement);
[[nodiscard]] std::string ReplaceAll(const std::string_view subject, const std::string_view search,
const std::string_view replacement);
void ReplaceAll(std::string* subject, const std::string_view search, const std::string_view replacement);
[[nodiscard]] std::string ReplaceAll(const std::string_view subject, const char search, const char replacement);
void ReplaceAll(std::string* subject, const char search, const char replacement);
/// Parses an assignment string (Key = Value) into its two components.
bool ParseAssignmentString(const std::string_view str, std::string_view* key, std::string_view* value);

View file

@ -164,12 +164,10 @@ std::vector<std::pair<std::string, std::string>> PostProcessing::GetAvailableSha
if (pos != std::string::npos && pos > 0)
fd.FileName.erase(pos);
#ifdef _WIN32
// swap any backslashes for forward slashes so the config is cross-platform
for (size_t i = 0; i < fd.FileName.size(); i++)
{
if (fd.FileName[i] == '\\')
fd.FileName[i] = '/';
}
StringUtil::ReplaceAll(&fd.FileName, '\\', '/');
#endif
if (std::none_of(names.begin(), names.end(), [&fd](const auto& other) { return fd.FileName == other.second; }))
{
@ -179,11 +177,13 @@ std::vector<std::pair<std::string, std::string>> PostProcessing::GetAvailableSha
}
FileSystem::FindFiles(Path::Combine(EmuFolders::Shaders, "reshade" FS_OSPATH_SEPARATOR_STR "Shaders").c_str(), "*.fx",
FILESYSTEM_FIND_FILES | FILESYSTEM_FIND_RELATIVE_PATHS, &results);
FILESYSTEM_FIND_FILES | FILESYSTEM_FIND_RECURSIVE | FILESYSTEM_FIND_RELATIVE_PATHS, &results);
FileSystem::FindFiles(
Path::Combine(EmuFolders::Resources, "shaders" FS_OSPATH_SEPARATOR_STR "reshade" FS_OSPATH_SEPARATOR_STR "Shaders")
.c_str(),
"*.fx", FILESYSTEM_FIND_FILES | FILESYSTEM_FIND_RELATIVE_PATHS | FILESYSTEM_FIND_KEEP_ARRAY, &results);
"*.fx",
FILESYSTEM_FIND_FILES | FILESYSTEM_FIND_RECURSIVE | FILESYSTEM_FIND_RELATIVE_PATHS | FILESYSTEM_FIND_KEEP_ARRAY,
&results);
std::sort(results.begin(), results.end(),
[](const auto& lhs, const auto& rhs) { return lhs.FileName < rhs.FileName; });
@ -193,12 +193,10 @@ std::vector<std::pair<std::string, std::string>> PostProcessing::GetAvailableSha
if (pos != std::string::npos && pos > 0)
fd.FileName.erase(pos);
#ifdef _WIN32
// swap any backslashes for forward slashes so the config is cross-platform
for (size_t i = 0; i < fd.FileName.size(); i++)
{
if (fd.FileName[i] == '\\')
fd.FileName[i] = '/';
}
StringUtil::ReplaceAll(&fd.FileName, '\\', '/');
#endif
if (std::none_of(names.begin(), names.end(), [&fd](const auto& other) { return fd.FileName == other.second; }))
{