AssetImportRequest.cpp 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  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 <API/EditorAssetSystemAPI.h>
  9. #include <AzCore/IO/SystemFile.h>
  10. #include <AzCore/std/smart_ptr/make_shared.h>
  11. #include <AzFramework/StringFunc/StringFunc.h>
  12. #include <AzToolsFramework/Debug/TraceContext.h>
  13. #include <SceneAPI/SceneCore/Components/LoadingComponent.h>
  14. #include <SceneAPI/SceneCore/Components/SceneSystemComponent.h>
  15. #include <SceneAPI/SceneCore/Components/Utilities/EntityConstructor.h>
  16. #include <SceneAPI/SceneCore/Containers/Scene.h>
  17. #include <SceneAPI/SceneCore/Events/AssetImportRequest.h>
  18. #include <SceneAPI/SceneCore/Events/SceneSerializationBus.h>
  19. #include <SceneAPI/SceneCore/Utilities/Reporting.h>
  20. namespace AZ
  21. {
  22. namespace SceneAPI
  23. {
  24. namespace Events
  25. {
  26. //
  27. // Loading Result Combiner
  28. //
  29. LoadingResultCombiner::LoadingResultCombiner()
  30. : m_manifestResult(ProcessingResult::Ignored)
  31. , m_assetResult(ProcessingResult::Ignored)
  32. {
  33. }
  34. void LoadingResultCombiner::operator=(LoadingResult rhs)
  35. {
  36. switch (rhs)
  37. {
  38. case LoadingResult::Ignored:
  39. return;
  40. case LoadingResult::AssetLoaded:
  41. m_assetResult = m_assetResult != ProcessingResult::Failure ? ProcessingResult::Success : ProcessingResult::Failure;
  42. return;
  43. case LoadingResult::ManifestLoaded:
  44. m_manifestResult = m_manifestResult != ProcessingResult::Failure ? ProcessingResult::Success : ProcessingResult::Failure;
  45. return;
  46. case LoadingResult::AssetFailure:
  47. m_assetResult = ProcessingResult::Failure;
  48. return;
  49. case LoadingResult::ManifestFailure:
  50. m_manifestResult = ProcessingResult::Failure;
  51. return;
  52. }
  53. }
  54. ProcessingResult LoadingResultCombiner::GetManifestResult() const
  55. {
  56. return m_manifestResult;
  57. }
  58. ProcessingResult LoadingResultCombiner::GetAssetResult() const
  59. {
  60. return m_assetResult;
  61. }
  62. //
  63. // Asset Importer Request
  64. //
  65. void AssetImportRequest::GetManifestExtension(AZStd::string& /*result*/)
  66. {
  67. }
  68. void AssetImportRequest::GetGeneratedManifestExtension(AZStd::string& /*result*/)
  69. {
  70. }
  71. void AssetImportRequest::GetSupportedFileExtensions(AZStd::unordered_set<AZStd::string>& /*extensions*/)
  72. {
  73. }
  74. ProcessingResult AssetImportRequest::PrepareForAssetLoading(Containers::Scene& /*scene*/, RequestingApplication /*requester*/)
  75. {
  76. return ProcessingResult::Ignored;
  77. }
  78. LoadingResult AssetImportRequest::LoadAsset(Containers::Scene& /*scene*/, const AZStd::string& /*path*/, const Uuid& /*guid*/,
  79. RequestingApplication /*requester*/)
  80. {
  81. return LoadingResult::Ignored;
  82. }
  83. void AssetImportRequest::FinalizeAssetLoading(Containers::Scene& /*scene*/, RequestingApplication /*requester*/)
  84. {
  85. }
  86. ProcessingResult AssetImportRequest::UpdateManifest(Containers::Scene& /*scene*/, ManifestAction /*action*/, RequestingApplication /*requester*/)
  87. {
  88. return ProcessingResult::Ignored;
  89. }
  90. void AssetImportRequest::AreCustomNormalsUsed(bool &value)
  91. {
  92. // Leave the SceneProcessingConfigSystemComponent do the job
  93. AZ_UNUSED(value);
  94. }
  95. void AssetImportRequest::GetManifestDependencyPaths(AZStd::vector<AZStd::string>&)
  96. {
  97. }
  98. AZStd::shared_ptr<Containers::Scene> AssetImportRequest::LoadSceneFromVerifiedPath(const AZStd::string& assetFilePath, const Uuid& sourceGuid,
  99. RequestingApplication requester, const Uuid& loadingComponentUuid)
  100. {
  101. AZStd::string sceneName;
  102. AzFramework::StringFunc::Path::GetFileName(assetFilePath.c_str(), sceneName);
  103. AZStd::shared_ptr<Containers::Scene> scene = AZStd::make_shared<Containers::Scene>(AZStd::move(sceneName));
  104. AZ_Assert(scene, "Unable to create new scene for asset importing.");
  105. Data::AssetInfo assetInfo;
  106. AZStd::string watchFolder;
  107. bool result = false;
  108. AzToolsFramework::AssetSystemRequestBus::BroadcastResult(result, &AzToolsFramework::AssetSystemRequestBus::Events::GetSourceInfoBySourceUUID, sourceGuid, assetInfo, watchFolder);
  109. if (result)
  110. {
  111. scene->SetWatchFolder(watchFolder);
  112. }
  113. else
  114. {
  115. AZ_Error(
  116. "AssetImportRequest", false, "Failed to get watch folder for source %s",
  117. sourceGuid.ToString<AZStd::string>().c_str());
  118. }
  119. // Unique pointer, will deactivate and clean up once going out of scope.
  120. SceneCore::EntityConstructor::EntityPointer loaders =
  121. SceneCore::EntityConstructor::BuildEntity("Scene Loading", loadingComponentUuid);
  122. ProcessingResultCombiner areAllPrepared;
  123. AssetImportRequestBus::BroadcastResult(areAllPrepared, &AssetImportRequestBus::Events::PrepareForAssetLoading, *scene, requester);
  124. if (areAllPrepared.GetResult() == ProcessingResult::Failure)
  125. {
  126. AZ_TracePrintf(Utilities::ErrorWindow, "Not all asset loaders could initialize.\n");
  127. return nullptr;
  128. }
  129. LoadingResultCombiner filesLoaded;
  130. AssetImportRequestBus::BroadcastResult(filesLoaded, &AssetImportRequestBus::Events::LoadAsset, *scene, assetFilePath, sourceGuid, requester);
  131. AssetImportRequestBus::Broadcast(&AssetImportRequestBus::Events::FinalizeAssetLoading, *scene, requester);
  132. if (filesLoaded.GetAssetResult() != ProcessingResult::Success)
  133. {
  134. AZ_TracePrintf(Utilities::ErrorWindow, "Failed to load requested scene file.\n");
  135. return nullptr;
  136. }
  137. ManifestAction action = ManifestAction::Update;
  138. // If the result for manifest is ignored it means no manifest was found.
  139. if (filesLoaded.GetManifestResult() == ProcessingResult::Failure || filesLoaded.GetManifestResult() == ProcessingResult::Ignored)
  140. {
  141. scene->GetManifest().Clear();
  142. action = ManifestAction::ConstructDefault;
  143. }
  144. ProcessingResultCombiner manifestUpdate;
  145. AssetImportRequestBus::BroadcastResult(manifestUpdate, &AssetImportRequestBus::Events::UpdateManifest, *scene, action, requester);
  146. if (manifestUpdate.GetResult() == ProcessingResult::Failure)
  147. {
  148. AZ_TracePrintf(Utilities::ErrorWindow, "Unable to %s manifest.\n", action == ManifestAction::ConstructDefault ? "create new" : "update");
  149. return nullptr;
  150. }
  151. return scene;
  152. }
  153. bool AssetImportRequest::IsManifestExtension(const char* filePath)
  154. {
  155. AZStd::string manifestExtension;
  156. AssetImportRequestBus::Broadcast(&AssetImportRequestBus::Events::GetManifestExtension, manifestExtension);
  157. AZ_Assert(!manifestExtension.empty(), "Manifest extension was not declared.");
  158. return AzFramework::StringFunc::Path::IsExtension(filePath, manifestExtension.c_str());
  159. }
  160. bool AssetImportRequest::IsSceneFileExtension(const char* filePath)
  161. {
  162. AZStd::unordered_set<AZStd::string> extensions;
  163. AssetImportRequestBus::Broadcast(&AssetImportRequestBus::Events::GetSupportedFileExtensions, extensions);
  164. AZ_Assert(!extensions.empty(), "No extensions found for source files.");
  165. for (const AZStd::string& extension : extensions)
  166. {
  167. if (AzFramework::StringFunc::Path::IsExtension(filePath, extension.c_str()))
  168. {
  169. return true;
  170. }
  171. }
  172. return false;
  173. }
  174. } // namespace Events
  175. } // namespace SceneAPI
  176. } // namespace AZ