f648cb1fd8
* Update the FileIOAlias naming to make the cache, project root and engine root paths more clear The alias of `@root@`, `@assets@`, and `@projectplatformcache@` has been collapsed to `@projectproductassets@` The alias of `@devroot@` and `@engroot@` has been collapsed to `@engroot@` The alias of `@devassets@` and `@projectroot@` has been collapsed to `@projectroot@` Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Updated use of devassets and devroot properties in python Those properties now use projectroot and engroot Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Updating the alias @engroot@ alias path comment in each platform specific LocalFileIO_*.cpp file Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Removed hardcoded size of 9 for the product asset alias. The ResolvePath function now just appends the @projectproductassets@ alias with the input path Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Remove duplicate @projectproductassets@ check in ProcessFileTreeRequest Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Fix for typos in Hydra python test Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Updated LocalFileIO::Copy call on Windows to use the Unicode aware CopyFileW API Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Updated the AWSMetreicsGemAllocatorFixture to properly suppress asset cache write errors for Test file creation. Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Removed unneeded call to set the @projectproductasstes@ alias at the bottom of the AssetSeedManagerTest SetUp Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Added a deprecated alias map to the FileIO System When a deprecated alias is accessed, the FileIO System logs an AZ_Error and indicates the alias that should be used Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Updated python test scripts to use the projectroot binding Retrieving the AutomatedTesting project path based on "<devroot>/AutomatedTesting" has been removed. Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Updated references to devroot and devgame within the codebase The GetAbsoluteDevGameFolderPath functions has been replaced with direct call to AZ::Utils::GetProjectPath The GetAbsoluteDevRootFolderPath functions has been replaced with direct calls to AZ::Utils::GetEnginePath Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Updated <engroot>/AutomatedTesting references to projectroot Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Replaced references that assumes the project path is <engroot>/AutomatedTesting with <projectroot> in the AutomatedTesting python test Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Correct casing in emfxworkspace file Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Removed newly added AppendPathParts function Removed the Path constructors which accepts a PathIterable instance The PathIterable isn't safe to return to a user of the Path class as it might be referencing temporary paths supplied via PathView arguments Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Fixed unused parameter warning Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Undid change to the LexicallyProximate function to set the path result to the base path. It needs to return the *this path if the pathResult is empty Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Moved the LocalFileIO ConvertToAbsolutePath implementations to AZ::Utils Fixed the ConvertToAbsolutePath implementation for Unix platforms to use a buffer that is size PATH_MAX(4096 on all our supported Unix platforms). Because the buffer before was AZ::IO::MaxPathLength which as a size of 1024, this was resulting in the Unix `realpath` function smashing the stack when it converts a path to an absolute path that is longer than 1024 characters Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Updated the EditorCore.Tests to attach the AZ Environment to the EditorCore shared library that is statically loaded on launch. Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Fixed for DeprecatedAlaisesKeyVisitor Visit function causing the non string_view overloads being hidden causing a hidden base class function warning Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Changed the AWSMetricsGemMock to use a temporary for writing test assets Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Updated the LocalFileIO::ResolvePath function to use HasRootPath to determine if a path starts with a root path such as "D:", "D:/" or "/" IsAbsolute was not the corect check as the path of "D:" is a relative path. To be absolute according to the Windows the path must have a root directory. i.e "D:/" or "D:\" Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Removed absolute path comment from LocalFile_UnixLike.cpp and LocalFile_Android.cpp FindFiles implementations Updated the ConvertToAlias to supply an AZ::IO::FixedMaxPath Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Replaced usage of the @projectproductassets@ alias with @engroot@ when referring to the LmbrCentral source folder in the CopyDependencyBuilderTest and the SeedBuilderTests Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Updated the ScriptCanvas Upgrade Tool to output backed up files to the Project User Path instead of the engine root Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Fixed whitespacing issues in Application.cpp Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Remove unnecessary creation of a FixedMaxPath in the UpgradeTool.cpp Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Modified testSeedFolder variable in the SeedBuilderTests to use the @engroot@ alias instead of @projectproductassets@/.. alias when referring to the LmbrCentral Gem source path Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Updated references to the Project Asset Cache in the PythonTests. Those tests no longer use the logic `azlmbr.paths.projectroot / "Cache" / "pc"` to retrieve a path to the cache root but instead the `azlmbr.paths.projectproductassets` constant Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Fixed the FileIO Deprecated Alias test on Windows Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Removing @projectsourceassets@ alias, as it is only used once. Updated the PhysX EditorSystemComponent.cpp to query the ProjectPath form the SettingsRegistry. Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Replaced @projectproductassets@ alias with @products@ Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Rollback changes to the PhysX EditorSystemComponent.cpp The changes to use the ProjectPath from the SettingsRegistry has been implemented in PR #4497 Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com>
219 lines
12 KiB
C++
219 lines
12 KiB
C++
/*
|
|
* Copyright (c) Contributors to the Open 3D Engine Project.
|
|
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
|
*
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#if !defined(Q_MOC_RUN)
|
|
#include <AzCore/std/smart_ptr/unique_ptr.h>
|
|
#include <AzCore/std/smart_ptr/shared_ptr.h>
|
|
#include <QObject>
|
|
#include <QString>
|
|
#include <QTimer>
|
|
#include <QStringList>
|
|
#include <QHash>
|
|
#include <QDir>
|
|
#include "native/AssetDatabase/AssetDatabase.h"
|
|
#include "native/assetprocessor.h"
|
|
#include "native/utilities/AssetUtilEBusHelper.h"
|
|
#include "native/utilities/PlatformConfiguration.h"
|
|
#include <AzFramework/Asset/AssetRegistry.h>
|
|
#include <QMutex>
|
|
#include <QMultiMap>
|
|
#include <AzCore/IO/SystemFile.h>
|
|
#include <AzToolsFramework/ToolsComponents/ToolsAssetCatalogBus.h>
|
|
#endif
|
|
|
|
#include "AssetRequestHandler.h"
|
|
|
|
namespace AzFramework
|
|
{
|
|
class AssetRegistry;
|
|
namespace AssetSystem
|
|
{
|
|
class AssetNotificationMessage;
|
|
}
|
|
}
|
|
|
|
namespace AssetProcessor
|
|
{
|
|
class AssetDatabaseConnection;
|
|
|
|
class AssetCatalog
|
|
: public QObject
|
|
, private AssetRegistryRequestBus::Handler
|
|
, private AzToolsFramework::AssetSystemRequestBus::Handler
|
|
, private AzToolsFramework::ToolsAssetSystemBus::Handler
|
|
, private AZ::Data::AssetCatalogRequestBus::Handler
|
|
{
|
|
using NetworkRequestID = AssetProcessor::NetworkRequestID;
|
|
using BaseAssetProcessorMessage = AzFramework::AssetSystem::BaseAssetProcessorMessage;
|
|
Q_OBJECT;
|
|
|
|
public:
|
|
AssetCatalog(QObject* parent, AssetProcessor::PlatformConfiguration* platformConfiguration);
|
|
virtual ~AssetCatalog();
|
|
|
|
Q_SIGNALS:
|
|
// outgoing message to the network
|
|
void SendAssetMessage(AzFramework::AssetSystem::AssetNotificationMessage message);
|
|
void AsyncAssetCatalogStatusResponse(AssetCatalogStatus status);
|
|
|
|
public Q_SLOTS:
|
|
// incoming message from the AP
|
|
void OnAssetMessage(AzFramework::AssetSystem::AssetNotificationMessage message);
|
|
void OnDependencyResolved(const AZ::Data::AssetId& assetId, const AzToolsFramework::AssetDatabase::ProductDependencyDatabaseEntry& entry);
|
|
|
|
void SaveRegistry_Impl();
|
|
virtual AzFramework::AssetSystem::GetUnresolvedDependencyCountsResponse HandleGetUnresolvedDependencyCountsRequest(MessageData<AzFramework::AssetSystem::GetUnresolvedDependencyCountsRequest> messageData);
|
|
virtual void HandleSaveAssetCatalogRequest(MessageData<AzFramework::AssetSystem::SaveAssetCatalogRequest> messageData);
|
|
void BuildRegistry();
|
|
void OnSourceQueued(AZ::Uuid sourceUuid, AZ::Uuid legacyUuid, QString rootPath, QString relativeFilePath);
|
|
void OnSourceFinished(AZ::Uuid sourceUuid, AZ::Uuid legacyUuid);
|
|
void AsyncAssetCatalogStatusRequest();
|
|
|
|
protected:
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// AssetRegistryRequestBus::Handler overrides
|
|
int SaveRegistry() override;
|
|
void ValidatePreLoadDependency() override;
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
void RegistrySaveComplete(int assetCatalogVersion, bool allCatalogsSaved);
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// AzToolsFramework::AssetSystem::AssetSystemRequestBus::Handler overrides
|
|
bool GetRelativeProductPathFromFullSourceOrProductPath(const AZStd::string& fullPath, AZStd::string& relativeProductPath) override;
|
|
|
|
//! Given a partial or full source file path, respond with its relative path and the watch folder it is relative to.
|
|
//! The input source path does not need to exist, so this can be used for new files that haven't been saved yet.
|
|
bool GenerateRelativeSourcePath(
|
|
const AZStd::string& sourcePath, AZStd::string& relativePath, AZStd::string& watchFolder) override;
|
|
|
|
bool GetFullSourcePathFromRelativeProductPath(const AZStd::string& relPath, AZStd::string& fullSourcePath) override;
|
|
bool GetAssetInfoById(const AZ::Data::AssetId& assetId, const AZ::Data::AssetType& assetType, const AZStd::string& platformName, AZ::Data::AssetInfo& assetInfo, AZStd::string& rootFilePath) override;
|
|
bool GetSourceInfoBySourcePath(const char* sourcePath, AZ::Data::AssetInfo& assetInfo, AZStd::string& watchFolder) override;
|
|
bool GetSourceInfoBySourceUUID(const AZ::Uuid& sourceUuid, AZ::Data::AssetInfo& assetInfo, AZStd::string& watchFolder) override;
|
|
bool GetScanFolders(AZStd::vector<AZStd::string>& scanFolders) override;
|
|
bool GetAssetSafeFolders(AZStd::vector<AZStd::string>& assetSafeFolders) override;
|
|
bool IsAssetPlatformEnabled(const char* platform) override;
|
|
int GetPendingAssetsForPlatform(const char* platform) override;
|
|
bool GetAssetsProducedBySourceUUID(const AZ::Uuid& sourceUuid, AZStd::vector<AZ::Data::AssetInfo>& productsAssetInfo) override;
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
// AssetCatalogRequestBus overrides
|
|
AZStd::string GetAssetPathById(const AZ::Data::AssetId& id) override;
|
|
AZ::Data::AssetId GetAssetIdByPath(const char* path, const AZ::Data::AssetType& typeToRegister, bool autoRegisterIfNotFound) override;
|
|
AZ::Data::AssetInfo GetAssetInfoById(const AZ::Data::AssetId& id) override;
|
|
AZ::Outcome<AZStd::vector<AZ::Data::ProductDependency>, AZStd::string> GetDirectProductDependencies(const AZ::Data::AssetId& id) override;
|
|
AZ::Outcome<AZStd::vector<AZ::Data::ProductDependency>, AZStd::string> GetAllProductDependencies(const AZ::Data::AssetId& id) override;
|
|
AZ::Outcome<AZStd::vector<AZ::Data::ProductDependency>, AZStd::string> GetLoadBehaviorProductDependencies(
|
|
const AZ::Data::AssetId& id, AZStd::unordered_set<AZ::Data::AssetId>& noloadSet,
|
|
AZ::Data::PreloadAssetListType& preloadAssetList) override;
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// AzToolsFramework::ToolsAssetSystemBus::Handler
|
|
void RegisterSourceAssetType(const AZ::Data::AssetType& assetType, const char* assetFileFilter) override;
|
|
void UnregisterSourceAssetType(const AZ::Data::AssetType& assetType) override;
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
//! given some absolute path, please respond with its relative product path. For now, this will be a
|
|
//! string like 'textures/blah.tif' (we don't care about extensions), but eventually, this will
|
|
//! be an actual asset UUID.
|
|
void ProcessGetRelativeProductPathFromFullSourceOrProductPathRequest(const AZStd::string& fullPath, AZStd::string& relativeProductPath);
|
|
|
|
//! This function helps in determining the full product path of an relative product path.
|
|
//! In the future we will be sending an asset UUID to this function to request for full path.
|
|
void ProcessGetFullSourcePathFromRelativeProductPathRequest(const AZStd::string& relPath, AZStd::string& fullSourcePath);
|
|
|
|
//! Gets the source file info for an Asset by checking the DB first and the APM queue second
|
|
bool GetSourceFileInfoFromAssetId(const AZ::Data::AssetId &assetId, AZStd::string& watchFolder, AZStd::string& relativePath);
|
|
|
|
//! Gets the product AssetInfo based on a platform and assetId. If you specify a null or empty platform the current or first available will be used.
|
|
AZ::Data::AssetInfo GetProductAssetInfo(const char* platformName, const AZ::Data::AssetId& id);
|
|
|
|
//! GetAssetInfo that tries to figure out if the asset is a product or source so it can return info about the product or source respectively
|
|
bool GetAssetInfoByIdOnly(const AZ::Data::AssetId& id, const AZStd::string& platformName, AZ::Data::AssetInfo& assetInfo, AZStd::string& rootFilePath);
|
|
|
|
//! Checks in the currently-in-queue assets list for info on an asset (by source Id)
|
|
bool GetQueuedAssetInfoById(const AZ::Uuid& guid, AZStd::string& watchFolder, AZStd::string& relativePath);
|
|
|
|
//! Checks in the currently-in-queue assets list for info on an asset (by source name)
|
|
bool GetQueuedAssetInfoByRelativeSourceName(const char* sourceName, AZ::Data::AssetInfo& assetInfo, AZStd::string& watchFolder);
|
|
|
|
//! Gets the source info for a source that is not in the DB or APM queue
|
|
bool GetUncachedSourceInfoFromDatabaseNameAndWatchFolder(const char* sourceDatabasePath, const char* watchFolder, AZ::Data::AssetInfo& assetInfo);
|
|
|
|
bool ConnectToDatabase();
|
|
|
|
bool CheckValidatedAssets(AZ::Data::AssetId assetId, const QString& platform);
|
|
|
|
//! For lookups that don't provide a specific platform, provide a default platform to use.
|
|
QString GetDefaultAssetPlatform();
|
|
|
|
AZ::Outcome<AZStd::vector<AZ::Data::ProductDependency>, AZStd::string> GetAllProductDependenciesFilter(
|
|
const AZ::Data::AssetId& id,
|
|
const AZStd::unordered_set<AZ::Data::AssetId>& exclusionList,
|
|
const AZStd::vector<AZStd::string>& wildcardPatternExclusionList) override;
|
|
|
|
bool DoesAssetIdMatchWildcardPattern(const AZ::Data::AssetId& assetId, const AZStd::string& wildcardPattern) override;
|
|
|
|
void AddAssetDependencies(
|
|
const AZ::Data::AssetId& searchAssetId,
|
|
AZStd::unordered_set<AZ::Data::AssetId>& assetSet,
|
|
AZStd::vector<AZ::Data::ProductDependency>& dependencyList,
|
|
const AZStd::unordered_set<AZ::Data::AssetId>& exclusionList,
|
|
const AZStd::vector<AZStd::string>& wildcardPatternExclusionList,
|
|
AZ::Data::PreloadAssetListType& preloadAssetList);
|
|
|
|
//! List of AssetTypes that should return info for the source instead of the product
|
|
AZStd::unordered_set<AZ::Data::AssetType> m_sourceAssetTypes;
|
|
AZStd::unordered_map<AZStd::string, AZ::Data::AssetType> m_sourceAssetTypeFilters;
|
|
AZStd::mutex m_sourceAssetTypesMutex;
|
|
|
|
//! Used to protect access to the database connection, only one thread can use it at a time
|
|
AZStd::mutex m_databaseMutex;
|
|
|
|
struct SourceInfo
|
|
{
|
|
QString m_watchFolder;
|
|
QString m_sourceName;
|
|
};
|
|
|
|
AZStd::mutex m_sourceUUIDToSourceNameMapMutex;
|
|
using SourceUUIDToSourceNameMap = AZStd::unordered_map<AZ::Uuid, SourceInfo>;
|
|
using SourceNameToSourceUuidMap = AZStd::unordered_map<AZStd::string, AZ::Uuid>;
|
|
|
|
SourceUUIDToSourceNameMap m_sourceUUIDToSourceNameMap; // map of uuids to source file names for assets that are currently in the processing queue
|
|
SourceNameToSourceUuidMap m_sourceNameToSourceUUIDMap;
|
|
|
|
QMutex m_registriesMutex;
|
|
QHash<QString, AzFramework::AssetRegistry> m_registries; // per platform.
|
|
AssetProcessor::PlatformConfiguration* m_platformConfig;
|
|
QStringList m_platforms;
|
|
AZStd::unique_ptr<AssetDatabaseConnection> m_db;
|
|
QDir m_cacheRoot;
|
|
|
|
bool m_registryBuiltOnce;
|
|
bool m_catalogIsDirty = true;
|
|
bool m_currentlySavingCatalog = false;
|
|
bool m_currentlyValidatingPreloadDependency = false;
|
|
int m_currentRegistrySaveVersion = 0;
|
|
QMutex m_savingRegistryMutex;
|
|
QMultiMap<int, AssetProcessor::NetworkRequestID> m_queuedSaveCatalogRequest;
|
|
AZStd::vector<AZStd::pair<AZ::Data::AssetId, QString>> m_preloadAssetList;
|
|
AZStd::unordered_multimap<AZ::Data::AssetId, QString> m_cachedNoPreloadDependenyAssetList;
|
|
|
|
AZStd::vector<char> m_saveBuffer; // so that we don't realloc all the time
|
|
|
|
QDir m_cacheRootDir;
|
|
};
|
|
}
|