From 0495d26d72284dc95d1d51363ca603eef8311213 Mon Sep 17 00:00:00 2001
From: AMZN-AlexOteiza <82234181+AMZN-AlexOteiza@users.noreply.github.com>
Date: Fri, 28 May 2021 22:11:15 +0100
Subject: [PATCH] Added template for creation of default material library
(#1040)
---
.../TemplateMaterialLibrary.physmaterial | 158 ++++++++++++++++++
.../Components/EditorSystemComponent.cpp | 83 +++++++--
2 files changed, 223 insertions(+), 18 deletions(-)
create mode 100644 Gems/PhysX/Assets/PhysX/TemplateMaterialLibrary.physmaterial
diff --git a/Gems/PhysX/Assets/PhysX/TemplateMaterialLibrary.physmaterial b/Gems/PhysX/Assets/PhysX/TemplateMaterialLibrary.physmaterial
new file mode 100644
index 0000000000..481cd2fbfa
--- /dev/null
+++ b/Gems/PhysX/Assets/PhysX/TemplateMaterialLibrary.physmaterial
@@ -0,0 +1,158 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Gems/PhysX/Code/Editor/Source/Components/EditorSystemComponent.cpp b/Gems/PhysX/Code/Editor/Source/Components/EditorSystemComponent.cpp
index c3f0411d58..b28bf6ab4a 100644
--- a/Gems/PhysX/Code/Editor/Source/Components/EditorSystemComponent.cpp
+++ b/Gems/PhysX/Code/Editor/Source/Components/EditorSystemComponent.cpp
@@ -31,6 +31,36 @@
namespace PhysX
{
constexpr const char* DefaultAssetFilename = "SurfaceTypeMaterialLibrary";
+ constexpr const char* TemplateAssetFilename = "PhysX/TemplateMaterialLibrary";
+
+ static AZStd::optional> GetMaterialLibraryTemplate()
+ {
+ const auto& assetType = AZ::AzTypeInfo::Uuid();
+
+ AZStd::vector assetTypeExtensions;
+ AZ::AssetTypeInfoBus::Event(assetType, &AZ::AssetTypeInfo::GetAssetTypeExtensions, assetTypeExtensions);
+
+ if (assetTypeExtensions.size() == 1)
+ {
+ // Constructing the path to the library asset
+ const AZStd::string& assetExtension = assetTypeExtensions[0];
+
+ // Use the path relative to the asset root to avoid hardcoding full path in the configuration
+ AZStd::string relativePath = TemplateAssetFilename;
+ AzFramework::StringFunc::Path::ReplaceExtension(relativePath, assetExtension.c_str());
+
+ AZ::Data::AssetId assetId;
+ AZ::Data::AssetCatalogRequestBus::BroadcastResult(
+ assetId, &AZ::Data::AssetCatalogRequestBus::Events::GetAssetIdByPath, relativePath.c_str(), assetType, false /*autoRegisterIfNotFound*/);
+
+ if (assetId.IsValid())
+ {
+ return AZ::Data::AssetManager::Instance().GetAsset(assetId, AZ::Data::AssetLoadBehavior::NoLoad);
+ }
+ }
+
+ return AZStd::nullopt;
+ }
static AZStd::optional> CreateMaterialLibrary(const AZStd::string& fullTargetFilePath, const AZStd::string& relativePath)
{
@@ -41,29 +71,45 @@ namespace PhysX
AZ::Data::AssetId assetId;
AZ::Data::AssetCatalogRequestBus::BroadcastResult(
- assetId, &AZ::Data::AssetCatalogRequestBus::Events::GetAssetIdByPath, relativePath.c_str(), assetType, true);
+ assetId, &AZ::Data::AssetCatalogRequestBus::Events::GetAssetIdByPath, relativePath.c_str(), assetType, true /*autoRegisterIfNotFound*/);
AZ::Data::Asset newAsset =
AZ::Data::AssetManager::Instance().GetAsset(assetId, assetType, AZ::Data::AssetLoadBehavior::Default);
- if (Physics::MaterialLibraryAsset* materialLibraryAsset = azrtti_cast(newAsset.GetData()))
+ if (auto* newMaterialLibraryData = azrtti_cast(newAsset.GetData()))
{
- // check it out in the source control system
- AzToolsFramework::SourceControlCommandBus::Broadcast(
- &AzToolsFramework::SourceControlCommandBus::Events::RequestEdit, fullTargetFilePath.c_str(), true,
- [](bool /*success*/, const AzToolsFramework::SourceControlFileInfo& /*info*/) {});
-
- // Save the material library asset into a file
- auto assetHandler = AZ::Data::AssetManager::Instance().GetHandler(assetType);
- if (assetHandler->SaveAssetData(newAsset, &fileStream))
+ if (auto templateLibraryOpt = GetMaterialLibraryTemplate())
{
- return newAsset;
- }
- else
- {
- AZ_Error("PhysX", false,
- "CreateSurfaceTypeMaterialLibrary: Unable to save Surface Types Material Library Asset to %s",
- fullTargetFilePath.c_str());
+ if (const auto* templateMaterialLibData = azrtti_cast(templateLibraryOpt->GetData()))
+ {
+ templateLibraryOpt->QueueLoad();
+ templateLibraryOpt->BlockUntilLoadComplete();
+
+ // Fill the newly created material library using the template data
+ for (const auto& materialData : templateMaterialLibData->GetMaterialsData())
+ {
+ newMaterialLibraryData->AddMaterialData(materialData);
+ }
+
+ // check it out in the source control system
+ AzToolsFramework::SourceControlCommandBus::Broadcast(
+ &AzToolsFramework::SourceControlCommandBus::Events::RequestEdit, fullTargetFilePath.c_str(), true /*allowMultiCheckout*/,
+ [](bool /*success*/, const AzToolsFramework::SourceControlFileInfo& /*info*/) {});
+
+ // Save the material library asset into a file
+ auto assetHandler = AZ::Data::AssetManager::Instance().GetHandler(assetType);
+ if (assetHandler->SaveAssetData(newAsset, &fileStream))
+ {
+ return newAsset;
+ }
+ else
+ {
+ AZ_Error(
+ "PhysX", false,
+ "CreateSurfaceTypeMaterialLibrary: Unable to save Surface Types Material Library Asset to %s",
+ fullTargetFilePath.c_str());
+ }
+ }
}
}
}
@@ -189,7 +235,8 @@ namespace PhysX
AzFramework::StringFunc::Path::ReplaceExtension(relativePath, assetExtension.c_str());
// Try to find an already existing material library
- AZ::Data::AssetCatalogRequestBus::BroadcastResult(resultAssetId, &AZ::Data::AssetCatalogRequests::GetAssetIdByPath, relativePath.c_str(), azrtti_typeid(), false);
+ AZ::Data::AssetCatalogRequestBus::BroadcastResult(resultAssetId,
+ &AZ::Data::AssetCatalogRequests::GetAssetIdByPath, relativePath.c_str(), azrtti_typeid(), false /*autoRegisterIfNotFound*/);
if (!resultAssetId.IsValid())
{