You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Code/Framework/AzToolsFramework/AzToolsFramework/Asset/AssetSeedManager.h

193 lines
9.7 KiB
C++

/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#pragma once
#include <AzCore/Asset/AssetCommon.h>
#include <AzCore/Serialization/SerializeContext.h>
#include <AzCore/std/containers/array.h>
#include <AzCore/std/containers/vector.h>
#include <AzFramework/Asset/AssetRegistry.h>
#include <AzFramework/Asset/AssetSeedList.h>
#include <AzFramework/Platform/PlatformDefaults.h>
namespace AzToolsFramework
{
class AssetFileDebugInfo;
class AssetFileDebugInfoList;
// AssetFileInfo class will be used to store information
// related to the asset file including modification time
// and the the hash of the entire file content.
class AssetFileInfo
{
public:
constexpr static int s_arraySize = 5;
AZ_TYPE_INFO(AssetFileInfo, "{F1616D53-9A20-4C04-854E-D458A334B86B}");
AZ_CLASS_ALLOCATOR(AssetFileInfo, AZ::SystemAllocator, 0);
AssetFileInfo(AZ::Data::AssetId assetId, AZStd::string assetRelativePath, uint64_t modTime, AZStd::array<AZ::u32, s_arraySize> hash);
AssetFileInfo() = default;
static void Reflect(AZ::ReflectContext* context);
AZ::Data::AssetId m_assetId;
AZStd::string m_assetRelativePath;
uint64_t m_modificationTime = 0;
AZStd::array<AZ::u32, s_arraySize> m_hash;// hash of the file content
};
class AssetFileInfoList
{
public:
AZ_TYPE_INFO(AssetFileInfoList, "{61F16042-E381-47E4-8AAA-91BC532F4101}");
AZ_CLASS_ALLOCATOR(AssetFileInfoList, AZ::SystemAllocator, 0);
static void Reflect(AZ::ReflectContext* context);
static bool Save(const AssetFileInfoList& assetFileInfoList, const AZStd::string& destinationFilePath);
//! Validates that the input path has the proper file extension for an Asset List file.
//! Input path can be relative or absolute.
//! Returns void on success, error message on failure.
static AZ::Outcome<void, AZStd::string> ValidateAssetListFileExtension(const AZStd::string& path);
AZStd::vector<AssetFileInfo> m_fileInfoList;
};
/*
* Implements an Asset Seed Manager that can be used to handle seed assets.
* Given a list of seed assets, this class can retrieve a complete
* list of all the product dependencies.
*/
class AssetSeedManager
{
public:
AZ_TYPE_INFO(AssetSeedManager, "{0DD7913A-EAD2-43DF-9A30-8A6FA6111E98}");
AZ_CLASS_ALLOCATOR(AssetSeedManager, AZ::SystemAllocator, 0);
using AssetsInfoList = AZStd::vector<AZ::Data::AssetInfo>;
~AssetSeedManager();
bool AddSeedAsset(AZ::Data::AssetId assetId, AzFramework::PlatformFlags platformFlags, AZStd::string path = AZStd::string(), const AZStd::string& seedListFilePath = AZStd::string());
bool AddSeedAsset(const AZStd::string& assetPath, AzFramework::PlatformFlags platformFlags, const AZStd::string& seedListFilePath = AZStd::string());
//! Attempts to add all platform-specific instances of the given Asset to the Seed List, if they exist.
//! Returns the Asset Id of the added Asset, and all of the Platforms that were found on-disk and added to the Seed List.
AZStd::pair<AZ::Data::AssetId, AzFramework::PlatformFlags> AddSeedAssetForValidPlatforms(const AZStd::string& assetPath, AzFramework::PlatformFlags platformFlags);
void RemoveSeedAsset(AZ::Data::AssetId assetId, AzFramework::PlatformFlags platformFlags);
//! Removes the seed from the seed list.
//! AssetKey can either be an assetid, assetpath or the path hint.
//! If you are providing an assetId than the format has to be "Uuid:SubID", i.e source Uuid and sub ID are separated by a colon
//! and subId needs to be in the decimal format.
//! Also important to note is that the asset path is relative to the second project name in the cache
//! for example if your asset absolute path is <absolute_path_to_cachefolder>/<game_name>/<platform>/<game_name_lowercase>/foo/dummy.txt
//! than the assetPath should be foo/dummy.txt
void RemoveSeedAsset(const AZStd::string& assetKey, AzFramework::PlatformFlags platformFlags);
void AddPlatformToAllSeeds(AzFramework::PlatformId platform);
void RemovePlatformFromAllSeeds(AzFramework::PlatformId platform);
//! Save the asset seed list to the destination path
bool Save(const AZStd::string& destinationFilePath);
//! Updates the seed path for all seeds.
//! If a seed is enabled for multiple platforms, it will update the path
//! with the information provided by the first asset catalog in which that seed exists.
void UpdateSeedPath();
//! Removes seed path hint for all existing seeds.
void RemoveSeedPath();
//! Loads the asset seed file from the source path and
//! adds root assets from the file to the seed list
bool Load(const AZStd::string& sourceFilePath);
const AzFramework::AssetSeedList& GetAssetSeedList() const;
AZ::Outcome<void, AZStd::string> SetSeedPlatformFlags(int index, AzFramework::PlatformFlags platformFlags);
// Using the entries in the seed list retrieves a list of product dependencies and their AssetInfo
AssetsInfoList GetDependenciesInfo(AzFramework::PlatformId platformIndex, const AZStd::unordered_set<AZ::Data::AssetId>& exclusionList, AssetFileDebugInfoList* optionalDebugList = nullptr, const AZStd::vector<AZStd::string>& wildcardPatternExclusionList = AZStd::vector<AZStd::string>()) const;
// Creates a AssetFileInfoList comprising of all known product dependencies from the seed list.
AssetFileInfoList GetDependencyList(AzFramework::PlatformId platformIndex, const AZStd::unordered_set<AZ::Data::AssetId>& exclusionList = {}, AssetFileDebugInfoList* optionalDebugList = nullptr, const AZStd::vector<AZStd::string>& wildcardPatternExclusionList = AZStd::vector<AZStd::string>()) const;
// Expands the current seed list to gather all dependencies based on the given platform. If given a debugFilePath,
// also stores information that is useful for understanding what is in the asset list info file and why, but not necessary to generate bundles.
bool SaveAssetFileInfo(const AZStd::string& destinationFilePath, AzFramework::PlatformFlags platformFlags, const AZStd::unordered_set<AZ::Data::AssetId>& exclusionList = {}, const AZStd::string& debugFilePath = AZStd::string(), const AZStd::vector<AZStd::string>& wildcardPatternExclusionList = AZStd::vector<AZStd::string>());
AZ::Outcome<AssetFileInfoList, AZStd::string> LoadAssetFileInfo(const AZStd::string& assetListFileAbsolutePath);
//! Returns the Seed List file extension
static const char* GetSeedFileExtension();
//! Validates that the input path has the proper file extension for a Seed List file.
//! Input path can be relative or absolute.
//! Returns void on success, error message on failure.
static AZ::Outcome<void, AZStd::string> ValidateSeedFileExtension(const AZStd::string& path);
//! Returns the Asset List file extension
static const char* GetAssetListFileExtension();
const AZStd::string& GetReadablePlatformList(const AzFramework::SeedInfo& seed);
static void Reflect(AZ::ReflectContext* context);
AZ::Data::AssetId FindAssetIdByPathHint(const AZStd::string& pathHint) const;
AZ::Data::AssetId GetAssetIdByPath(const AZStd::string& assetPath, const AzFramework::PlatformFlags& platformFlags) const;
AZ::Data::AssetId GetAssetIdByAssetKey(const AZStd::string& assetKey, const AzFramework::PlatformFlags& platformFlags) const;
static AZ::Data::AssetInfo GetAssetInfoById(const AZ::Data::AssetId& assetId, const AzFramework::PlatformId& platformIndex, const AZStd::string& seedListfilePath = AZStd::string(), const AZStd::string& asetHintPath = AZStd::string());
private:
AZ::Outcome<AZStd::vector<AZ::Data::ProductDependency>, AZStd::string> GetAllProductDependencies(
const AZ::Data::AssetId& assetId,
const AzFramework::PlatformId& platformIndex,
const AZStd::unordered_set<AZ::Data::AssetId>& exclusionList,
AssetFileDebugInfoList* optionalDebugList = nullptr,
AZStd::unordered_set<AZ::Data::AssetId>* cyclicalDependencySet = nullptr,
const AZStd::vector<AZStd::string>& wildcardPatternExclusionList = AZStd::vector<AZStd::string>()) const;
AZStd::string AddAssetToSeedListHelper(const AZStd::string& assetPath);
void PopulateAssetTypeMap();
AzFramework::AssetSeedList m_assetSeedList;
AZStd::unordered_map<AZStd::string, AZStd::string> m_sourceAssetTypeToRuntimeAssetTypeMap;
AZStd::unordered_map<AzFramework::PlatformFlags, AZStd::string> m_platformFlagsToReadablePlatformList;
};
/*
* Provides a mechanism to interface with the AssetSeedManager
*/
class AssetSeedManagerRequests : public AZ::EBusTraits
{
public:
using Bus = AZ::EBus<AssetSeedManagerRequests>;
using AssetTypePairs = AZStd::vector<AZStd::pair<AZStd::string, AZStd::string>>;
//! Systems may provide source and destination asset mapping by file extensions
virtual AssetTypePairs GetAssetTypeMapping()
{
return {};
}
};
} // namespace AzToolsFramework