3
0

ModelAssetCreator.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <Atom/RPI.Reflect/Model/ModelAssetCreator.h>
  9. #include <Atom/RPI.Reflect/Model/ModelLodAssetCreator.h>
  10. #include <AzCore/Asset/AssetManager.h>
  11. namespace AZ
  12. {
  13. namespace RPI
  14. {
  15. void ModelAssetCreator::Begin(const Data::AssetId& assetId)
  16. {
  17. BeginCommon(assetId);
  18. m_modelAabb = Aabb::CreateNull();
  19. }
  20. void ModelAssetCreator::SetName(AZStd::string_view name)
  21. {
  22. if (ValidateIsReady())
  23. {
  24. m_asset->m_name = name;
  25. }
  26. }
  27. void ModelAssetCreator::AddMaterialSlot(const ModelMaterialSlot& materialSlot)
  28. {
  29. if (ValidateIsReady())
  30. {
  31. auto iter = m_asset->m_materialSlots.find(materialSlot.m_stableId);
  32. if (iter == m_asset->m_materialSlots.end())
  33. {
  34. m_asset->m_materialSlots[materialSlot.m_stableId] = materialSlot;
  35. }
  36. else
  37. {
  38. if (materialSlot.m_displayName != iter->second.m_displayName)
  39. {
  40. ReportWarning("Material slot %u was already added with a different name.", materialSlot.m_stableId);
  41. }
  42. if (materialSlot.m_defaultMaterialAsset != iter->second.m_defaultMaterialAsset)
  43. {
  44. ReportWarning("Material slot %u was already added with a different default MaterialAsset.", materialSlot.m_stableId);
  45. }
  46. iter->second = materialSlot;
  47. }
  48. }
  49. }
  50. void ModelAssetCreator::AddLodAsset(Data::Asset<ModelLodAsset>&& lodAsset)
  51. {
  52. if (ValidateIsReady())
  53. {
  54. m_asset->m_lodAssets.push_back(AZStd::move(lodAsset));
  55. m_modelAabb.AddAabb(m_asset->m_lodAssets.back()->GetAabb());
  56. }
  57. }
  58. bool ModelAssetCreator::End(Data::Asset<ModelAsset>& result)
  59. {
  60. if (!ValidateIsReady())
  61. {
  62. return false;
  63. }
  64. if (m_asset->GetLodCount() == 0)
  65. {
  66. ReportError("No valid ModelLodAssets have been added to this ModelAsset.");
  67. return false;
  68. }
  69. // Create Model Aabb as it wraps all ModelLod Aabbs
  70. for (const auto& modelLodAsset : m_asset->GetLodAssets())
  71. {
  72. m_asset->m_aabb.AddAabb(modelLodAsset->GetAabb());
  73. }
  74. m_asset->SetReady();
  75. return EndCommon(result);
  76. }
  77. void ModelAssetCreator::AddTag(AZ::Name tag)
  78. {
  79. if (ValidateIsReady())
  80. {
  81. // add tag if it doesn't already exist
  82. if (auto it = AZStd::find(m_asset->m_tags.begin(), m_asset->m_tags.end(), tag); it == m_asset->m_tags.end())
  83. {
  84. m_asset->m_tags.push_back(AZStd::move(tag));
  85. }
  86. }
  87. }
  88. bool ModelAssetCreator::Clone(const Data::Asset<ModelAsset>& sourceAsset, Data::Asset<ModelAsset>& clonedResult, const Data::AssetId& cloneAssetId)
  89. {
  90. if (!sourceAsset.IsReady())
  91. {
  92. return false;
  93. }
  94. ModelAssetCreator creator;
  95. creator.Begin(cloneAssetId);
  96. creator.SetName(sourceAsset->GetName().GetStringView());
  97. AZ::Data::AssetId lastUsedId = cloneAssetId;
  98. const AZStd::span<const Data::Asset<ModelLodAsset>> sourceLodAssets = sourceAsset->GetLodAssets();
  99. for (const Data::Asset<ModelLodAsset>& sourceLodAsset : sourceLodAssets)
  100. {
  101. Data::Asset<ModelLodAsset> lodAsset;
  102. if (!ModelLodAssetCreator::Clone(sourceLodAsset, lodAsset, lastUsedId))
  103. {
  104. AZ_Error("ModelAssetCreator", false,
  105. "Cannot clone model lod asset for '%s'.", sourceLodAsset.GetHint().c_str());
  106. return false;
  107. }
  108. if (lodAsset.IsReady())
  109. {
  110. creator.AddLodAsset(AZStd::move(lodAsset));
  111. }
  112. }
  113. const ModelMaterialSlotMap &sourceMaterialSlotMap = sourceAsset->GetMaterialSlots();
  114. for (const auto& sourceMaterialSlot : sourceMaterialSlotMap)
  115. {
  116. creator.AddMaterialSlot(sourceMaterialSlot.second);
  117. }
  118. return creator.End(clonedResult);
  119. }
  120. } // namespace RPI
  121. } // namespace AZ