Fix loading game assets in cooked build via path relative to the project folder

This commit is contained in:
Wojtek Figat
2021-03-01 13:00:07 +01:00
parent 489e8ddc42
commit 21d96c6baf
4 changed files with 18 additions and 8 deletions

View File

@@ -1081,12 +1081,12 @@ bool CookAssetsStep::Perform(CookingData& data)
data.StepProgress(TEXT("Creating assets cache"), Step2ProgressEnd);
// Create asset paths mapping for the root assets.
// Create asset paths mapping for the assets.
// Assets mapping is use to convert paths used in Content::Load(path) into the asset id.
// It fixes the issues when in build game all assets are in the packages while engine parts are requesting in-build assets by name.
// It fixes the issues when in build game all assets are in the packages and are requested by path.
// E.g. game settings are loaded from `Content/GameSettings.json` file which is packages in one of the packages.
// Additionally it improves the in-build assets loading performance.
for (auto i = data.RootAssets.Begin(); i.IsNotEnd(); ++i)
// Additionally it improves the in-build assets loading performance (no more registry linear lookup for path by dictionary access).
for (auto i = data.Assets.Begin(); i.IsNotEnd(); ++i)
{
if (Content::GetAssetInfo(i->Item, assetInfo))
{

View File

@@ -245,12 +245,22 @@ bool AssetsCache::FindAsset(const StringView& path, AssetInfo& info)
{
return FindAsset(id, info);
}
#if !USE_EDITOR
if (FileSystem::IsRelative(path))
{
// Additional check if user provides path relative to the project folder (eg. Content/SomeAssets/MyFile.json)
const String absolutePath = Globals::ProjectFolder / *path;
if (_pathsMapping.TryGet(absolutePath, id))
{
return FindAsset(id, info);
}
}
#endif
// Find asset in registry
for (auto i = _registry.Begin(); i.IsNotEnd(); ++i)
{
auto& e = i->Value;
if (e.Info.Path == path)
{
// Validate file exists

View File

@@ -98,11 +98,11 @@ void FileSystemBase::NormalizePath(String& path)
}
}
bool FileSystemBase::IsRelative(const String& path)
bool FileSystemBase::IsRelative(const StringView& path)
{
const bool isRooted =
(path.Length() >= 2 && StringUtils::IsAlpha(path[0]) && path[1] == ':') ||
path.StartsWith(TEXT("\\\\")) ||
path.StartsWith(StringView(TEXT("\\\\"), 2), StringSearchCase::CaseSensitive) ||
path.StartsWith('/') ||
path.StartsWith('\\') ||
path.StartsWith('/');

View File

@@ -104,7 +104,7 @@ public:
/// </summary>
/// <param name="path">Input path to check</param>
/// <returns>True if input path is relative one, otherwise false</returns>
static bool IsRelative(const String& path);
static bool IsRelative(const StringView& path);
/// <summary>
/// Retrieves file extension (without a dot)