3
0

TestIntermediateAssetBuilderComponent.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  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 <AssetBuilderSDK/AssetBuilderSDK.h>
  9. #include <AzCore/IO/SystemFile.h>
  10. #include <AzCore/IO/Path/Path.h>
  11. #include <AzCore/Serialization/EditContextConstants.inl>
  12. #include <AzCore/Serialization/SerializeContext.h>
  13. #include <AzFramework/IO/LocalFileIO.h>
  14. #include <Builder/TestIntermediateAssetBuilderComponent.h>
  15. namespace TestAssetBuilder
  16. {
  17. void TestIntermediateAssetBuilderComponent::Init()
  18. {
  19. }
  20. void TestIntermediateAssetBuilderComponent::Activate()
  21. {
  22. {
  23. AssetBuilderSDK::AssetBuilderDesc builderDescriptor;
  24. builderDescriptor.m_name = "Test Intermediate Asset Builder Stage 1";
  25. builderDescriptor.m_version = 1;
  26. builderDescriptor.m_patterns.emplace_back("*.intersource", AssetBuilderSDK::AssetBuilderPattern::PatternType::Wildcard);
  27. builderDescriptor.m_busId = AZ::Uuid("{6A27C79F-28F0-44EA-B1CC-4A52DADB887D}");
  28. builderDescriptor.m_createJobFunction = AZStd::bind(
  29. &TestIntermediateAssetBuilderComponent::CreateJobsStage1, this, AZStd::placeholders::_1, AZStd::placeholders::_2);
  30. builderDescriptor.m_processJobFunction = AZStd::bind(
  31. &TestIntermediateAssetBuilderComponent::ProcessJobStage1, this, AZStd::placeholders::_1, AZStd::placeholders::_2);
  32. BusConnect(builderDescriptor.m_busId);
  33. AssetBuilderSDK::AssetBuilderBus::Broadcast(&AssetBuilderSDK::AssetBuilderBusTraits::RegisterBuilderInformation, builderDescriptor);
  34. }
  35. {
  36. AssetBuilderSDK::AssetBuilderDesc builderDescriptor;
  37. builderDescriptor.m_name = "Test Intermediate Asset Builder Stage 2";
  38. builderDescriptor.m_version = 1;
  39. builderDescriptor.m_patterns.emplace_back("*.stage1output", AssetBuilderSDK::AssetBuilderPattern::PatternType::Wildcard);
  40. builderDescriptor.m_busId = AZ::Uuid("{1A1FB5D4-2F4A-434A-9D2C-9D51235C2C27}");
  41. builderDescriptor.m_createJobFunction =
  42. AZStd::bind(&TestIntermediateAssetBuilderComponent::CreateJobsStage2, this, AZStd::placeholders::_1, AZStd::placeholders::_2);
  43. builderDescriptor.m_processJobFunction =
  44. AZStd::bind(&TestIntermediateAssetBuilderComponent::ProcessJobStage2, this, AZStd::placeholders::_1, AZStd::placeholders::_2);
  45. BusConnect(builderDescriptor.m_busId);
  46. AssetBuilderSDK::AssetBuilderBus::Broadcast(&AssetBuilderSDK::AssetBuilderBusTraits::RegisterBuilderInformation, builderDescriptor);
  47. }
  48. {
  49. AssetBuilderSDK::AssetBuilderDesc builderDescriptor;
  50. builderDescriptor.m_name = "Test Intermediate Asset Builder Stage 3";
  51. builderDescriptor.m_version = 1;
  52. builderDescriptor.m_patterns.emplace_back("*.stage2output", AssetBuilderSDK::AssetBuilderPattern::PatternType::Wildcard);
  53. builderDescriptor.m_busId = AZ::Uuid("{BB935CEF-63EE-44D1-A8C5-DEF3DD799D49}");
  54. builderDescriptor.m_createJobFunction = AZStd::bind(
  55. &TestIntermediateAssetBuilderComponent::CreateJobsStage3, this, AZStd::placeholders::_1, AZStd::placeholders::_2);
  56. builderDescriptor.m_processJobFunction = AZStd::bind(
  57. &TestIntermediateAssetBuilderComponent::ProcessJobStage3, this, AZStd::placeholders::_1, AZStd::placeholders::_2);
  58. BusConnect(builderDescriptor.m_busId);
  59. AssetBuilderSDK::AssetBuilderBus::Broadcast(
  60. &AssetBuilderSDK::AssetBuilderBusTraits::RegisterBuilderInformation, builderDescriptor);
  61. }
  62. }
  63. void TestIntermediateAssetBuilderComponent::Deactivate()
  64. {
  65. BusDisconnect();
  66. }
  67. void TestIntermediateAssetBuilderComponent::Reflect(AZ::ReflectContext* context)
  68. {
  69. if (AZ::SerializeContext* serialize = azrtti_cast<AZ::SerializeContext*>(context))
  70. {
  71. serialize->Class<TestIntermediateAssetBuilderComponent, AZ::Component>()
  72. ->Version(0)
  73. ->Attribute(AZ::Edit::Attributes::SystemComponentTags, AZStd::vector<AZ::Crc32>({ AssetBuilderSDK::ComponentTags::AssetBuilder }))
  74. ;
  75. }
  76. }
  77. void TestIntermediateAssetBuilderComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
  78. {
  79. provided.push_back(AZ_CRC("TestIntermediateAssetBuilderPluginService"));
  80. }
  81. void TestIntermediateAssetBuilderComponent::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible)
  82. {
  83. incompatible.push_back(AZ_CRC("TestIntermediateAssetBuilderPluginService"));
  84. }
  85. void TestIntermediateAssetBuilderComponent::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required)
  86. {
  87. AZ_UNUSED(required);
  88. }
  89. void TestIntermediateAssetBuilderComponent::GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent)
  90. {
  91. AZ_UNUSED(dependent);
  92. }
  93. void TestIntermediateAssetBuilderComponent::CreateJobsStage1(const AssetBuilderSDK::CreateJobsRequest& request, AssetBuilderSDK::CreateJobsResponse& response)
  94. {
  95. if (m_isShuttingDown)
  96. {
  97. response.m_result = AssetBuilderSDK::CreateJobsResultCode::ShuttingDown;
  98. return;
  99. }
  100. auto commonPlatform = AZStd::find_if(request.m_enabledPlatforms.begin(), request.m_enabledPlatforms.end(), [](auto input) -> bool
  101. {
  102. return input.m_identifier == AssetBuilderSDK::CommonPlatformName;
  103. });
  104. if(commonPlatform != request.m_enabledPlatforms.end())
  105. {
  106. AZ_Error("TestIntermediateAssetBuilder", false, "Common platform was found in the list of enabled platforms."
  107. " This is not expected as it will cause all builders to output files for the common platform.");
  108. return;
  109. }
  110. AssetBuilderSDK::JobDescriptor desc{"", "Test Product Stage 1", AssetBuilderSDK::CommonPlatformName};
  111. response.m_createJobOutputs.push_back(desc);
  112. response.m_result = AssetBuilderSDK::CreateJobsResultCode::Success;
  113. }
  114. bool CopyWithExtension(const AssetBuilderSDK::ProcessJobRequest& request, AZStd::string_view extension, AZ::IO::Path& outDestinationPath)
  115. {
  116. outDestinationPath = request.m_tempDirPath;
  117. outDestinationPath /= AZ::IO::PathView(request.m_fullPath).Filename();
  118. outDestinationPath.ReplaceExtension(extension);
  119. if (auto result = AZ::IO::FileIOBase::GetInstance()->Copy(request.m_fullPath.c_str(), outDestinationPath.c_str()); !result)
  120. {
  121. AZ_Error(
  122. "TestIntermediateAssetBuilder", false, "Failed to copy input file `%s` to temp output `%s", request.m_fullPath.c_str(),
  123. outDestinationPath.c_str());
  124. return false;
  125. }
  126. return true;
  127. }
  128. void TestIntermediateAssetBuilderComponent::ProcessJobStage1(const AssetBuilderSDK::ProcessJobRequest& request, AssetBuilderSDK::ProcessJobResponse& response)
  129. {
  130. AssetBuilderSDK::JobCancelListener jobCancelListener(request.m_jobId);
  131. AZ_TracePrintf(AssetBuilderSDK::InfoWindow, "Starting Job.\n");
  132. // Check if we are cancelled or shutting down before doing intensive processing on this source file
  133. if (jobCancelListener.IsCancelled())
  134. {
  135. AZ_TracePrintf(AssetBuilderSDK::WarningWindow, "Cancel was requested for job %s.\n", request.m_fullPath.c_str());
  136. response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Cancelled;
  137. return;
  138. }
  139. if (m_isShuttingDown)
  140. {
  141. AZ_TracePrintf(AssetBuilderSDK::WarningWindow, "Cancelled job %s because shutdown was requested.\n", request.m_fullPath.c_str());
  142. response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Cancelled;
  143. return;
  144. }
  145. AZ::IO::Path destinationPath;
  146. if(!CopyWithExtension(request, ".stage1output", destinationPath))
  147. {
  148. return;
  149. }
  150. const AZ::Uuid assetType("{978D26F9-D9F4-40E5-888B-3A53E2363BEA}");
  151. AssetBuilderSDK::JobProduct jobProduct(destinationPath.c_str(), assetType, 1);
  152. jobProduct.m_outputFlags = AssetBuilderSDK::ProductOutputFlags::IntermediateAsset;
  153. jobProduct.m_dependenciesHandled = true; // This builder has no product dependencies
  154. response.m_outputProducts.push_back(jobProduct);
  155. response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Success;
  156. }
  157. void TestIntermediateAssetBuilderComponent::CreateJobsStage2(
  158. const AssetBuilderSDK::CreateJobsRequest&, AssetBuilderSDK::CreateJobsResponse& response)
  159. {
  160. if (m_isShuttingDown)
  161. {
  162. response.m_result = AssetBuilderSDK::CreateJobsResultCode::ShuttingDown;
  163. return;
  164. }
  165. AssetBuilderSDK::JobDescriptor desc{ "", "Test Product Stage 2", AssetBuilderSDK::CommonPlatformName };
  166. response.m_createJobOutputs.push_back(desc);
  167. response.m_result = AssetBuilderSDK::CreateJobsResultCode::Success;
  168. }
  169. void TestIntermediateAssetBuilderComponent::ProcessJobStage2(
  170. const AssetBuilderSDK::ProcessJobRequest& request, AssetBuilderSDK::ProcessJobResponse& response)
  171. {
  172. AssetBuilderSDK::JobCancelListener jobCancelListener(request.m_jobId);
  173. AZ_TracePrintf(AssetBuilderSDK::InfoWindow, "Starting Job.\n");
  174. const AZ::Uuid assetType("{CE426CC8-86AE-48EB-8D03-5E09DBBEAC94}");
  175. AZ::IO::Path destinationPath;
  176. if (!CopyWithExtension(request, ".stage2output", destinationPath))
  177. {
  178. return;
  179. }
  180. AssetBuilderSDK::JobProduct jobProduct(destinationPath.AsPosix().c_str(), assetType, 1);
  181. jobProduct.m_outputFlags = AssetBuilderSDK::ProductOutputFlags::IntermediateAsset;
  182. jobProduct.m_dependenciesHandled = true; // This builder has no product dependencies
  183. response.m_outputProducts.push_back(jobProduct);
  184. response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Success;
  185. }
  186. void TestIntermediateAssetBuilderComponent::CreateJobsStage3(
  187. const AssetBuilderSDK::CreateJobsRequest& request, AssetBuilderSDK::CreateJobsResponse& response)
  188. {
  189. if (m_isShuttingDown)
  190. {
  191. response.m_result = AssetBuilderSDK::CreateJobsResultCode::ShuttingDown;
  192. return;
  193. }
  194. for (const auto& platform : request.m_enabledPlatforms)
  195. {
  196. AssetBuilderSDK::JobDescriptor desc{ "", "Test Product Stage 3", platform.m_identifier.c_str() };
  197. response.m_createJobOutputs.push_back(desc);
  198. }
  199. response.m_result = AssetBuilderSDK::CreateJobsResultCode::Success;
  200. }
  201. void TestIntermediateAssetBuilderComponent::ProcessJobStage3(
  202. const AssetBuilderSDK::ProcessJobRequest& request, AssetBuilderSDK::ProcessJobResponse& response)
  203. {
  204. AssetBuilderSDK::JobCancelListener jobCancelListener(request.m_jobId);
  205. AZ_TracePrintf(AssetBuilderSDK::InfoWindow, "Starting Job.\n");
  206. const AZ::Uuid assetType("{1CC1DD34-5675-4071-8732-3E3406664ADB}");
  207. AZ::IO::Path destinationPath;
  208. if (!CopyWithExtension(request, ".stage3output", destinationPath))
  209. {
  210. return;
  211. }
  212. AssetBuilderSDK::JobProduct jobProduct(destinationPath.AsPosix().c_str(), assetType, 1);
  213. jobProduct.m_dependenciesHandled = true; // This builder has no product dependencies
  214. response.m_outputProducts.push_back(jobProduct);
  215. response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Success;
  216. }
  217. void TestIntermediateAssetBuilderComponent::ShutDown()
  218. {
  219. m_isShuttingDown = true;
  220. }
  221. } // namespace TestAssetBuilder