TestDependencyBuilderComponent.cpp 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  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 <AssetBuilderSDK/SerializationDependencies.h>
  10. #include <AzCore/IO/SystemFile.h>
  11. #include <AzCore/IO/Path/Path.h>
  12. #include <AzCore/Serialization/EditContextConstants.inl>
  13. #include <AzCore/Serialization/SerializeContext.h>
  14. #include <AzFramework/Asset/GenericAssetHandler.h>
  15. #include <AzFramework/IO/LocalFileIO.h>
  16. #include <Builder/TestDependencyBuilderComponent.h>
  17. #include <AzCore/Asset/AssetSerializer.h>
  18. #include <AzCore/Serialization/Json/JsonUtils.h>
  19. namespace TestAssetBuilder
  20. {
  21. namespace Details
  22. {
  23. AzFramework::GenericAssetHandler<TestAsset>* s_testAssetHandler = nullptr;
  24. void RegisterAssethandlers()
  25. {
  26. s_testAssetHandler =
  27. aznew AzFramework::GenericAssetHandler<TestAsset>("Automated Test Asset", "Other", "auto_test_asset");
  28. s_testAssetHandler->Register();
  29. }
  30. void UnregisterAssethandlers()
  31. {
  32. if (s_testAssetHandler)
  33. {
  34. s_testAssetHandler->Unregister();
  35. delete s_testAssetHandler;
  36. s_testAssetHandler = nullptr;
  37. }
  38. }
  39. } // namespace Details
  40. void TestAsset::Reflect(AZ::ReflectContext* context)
  41. {
  42. auto serialize = azrtti_cast<AZ::SerializeContext*>(context);
  43. if (serialize)
  44. {
  45. serialize->Class<TestAsset, AZ::Data::AssetData>()
  46. ->Version(1)
  47. ->Field("ReferencedAssets", &TestAsset::m_referencedAssets);
  48. }
  49. }
  50. void TestDependencyBuilderComponent::Init()
  51. {
  52. }
  53. void TestDependencyBuilderComponent::Activate()
  54. {
  55. Details::RegisterAssethandlers();
  56. AssetBuilderSDK::AssetBuilderDesc builderDescriptor;
  57. builderDescriptor.m_name = "Test Dependency Builder";
  58. builderDescriptor.m_version = 1;
  59. builderDescriptor.m_patterns.emplace_back("*.auto_test_input", AssetBuilderSDK::AssetBuilderPattern::PatternType::Wildcard);
  60. builderDescriptor.m_busId = AZ::Uuid("{13D338AD-745F-442C-B0AA-48EFA6F3F044}");
  61. builderDescriptor.m_createJobFunction = AZStd::bind(
  62. &TestDependencyBuilderComponent::CreateJobs, this, AZStd::placeholders::_1, AZStd::placeholders::_2);
  63. builderDescriptor.m_processJobFunction = AZStd::bind(
  64. &TestDependencyBuilderComponent::ProcessJob, this, AZStd::placeholders::_1, AZStd::placeholders::_2);
  65. BusConnect(builderDescriptor.m_busId);
  66. AssetBuilderSDK::AssetBuilderBus::Broadcast(&AssetBuilderSDK::AssetBuilderBusTraits::RegisterBuilderInformation, builderDescriptor);
  67. }
  68. void TestDependencyBuilderComponent::Deactivate()
  69. {
  70. BusDisconnect();
  71. Details::UnregisterAssethandlers();
  72. }
  73. void TestDependencyBuilderComponent::Reflect(AZ::ReflectContext* context)
  74. {
  75. TestAsset::Reflect(context);
  76. if (AZ::SerializeContext* serialize = azrtti_cast<AZ::SerializeContext*>(context))
  77. {
  78. serialize->Class<TestDependencyBuilderComponent, AZ::Component>()
  79. ->Version(0)
  80. ->Attribute(AZ::Edit::Attributes::SystemComponentTags, AZStd::vector<AZ::Crc32>({ AssetBuilderSDK::ComponentTags::AssetBuilder }))
  81. ;
  82. }
  83. }
  84. void TestDependencyBuilderComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
  85. {
  86. provided.push_back(AZ_CRC("TestDependencyBuilderComponentPluginService"));
  87. }
  88. void TestDependencyBuilderComponent::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible)
  89. {
  90. incompatible.push_back(AZ_CRC("TestDependencyBuilderComponentPluginService"));
  91. }
  92. void TestDependencyBuilderComponent::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required)
  93. {
  94. AZ_UNUSED(required);
  95. }
  96. void TestDependencyBuilderComponent::GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent)
  97. {
  98. AZ_UNUSED(dependent);
  99. }
  100. AZStd::string ReadFile(const char* path)
  101. {
  102. AZStd::string buffer;
  103. auto fileSize = AZ::IO::SystemFile::Length(path);
  104. if (fileSize > 0)
  105. {
  106. buffer.resize_no_construct(AZ::IO::SystemFile::Length(path));
  107. AZ::IO::SystemFile::Read(path, buffer.data(), buffer.size());
  108. }
  109. return buffer;
  110. }
  111. void TestDependencyBuilderComponent::CreateJobs(const AssetBuilderSDK::CreateJobsRequest& request, AssetBuilderSDK::CreateJobsResponse& response)
  112. {
  113. if (m_isShuttingDown)
  114. {
  115. response.m_result = AssetBuilderSDK::CreateJobsResultCode::ShuttingDown;
  116. return;
  117. }
  118. for (const auto& platform : request.m_enabledPlatforms)
  119. {
  120. AssetBuilderSDK::JobDescriptor desc{ "", "Auto Test Builder", platform.m_identifier.c_str() };
  121. response.m_createJobOutputs.push_back(desc);
  122. }
  123. response.m_result = AssetBuilderSDK::CreateJobsResultCode::Success;
  124. }
  125. void TestDependencyBuilderComponent::ProcessJob(const AssetBuilderSDK::ProcessJobRequest& request, AssetBuilderSDK::ProcessJobResponse& response)
  126. {
  127. TestAsset outputAsset;
  128. AZStd::string buffer = ReadFile(request.m_fullPath.c_str());
  129. if (!buffer.empty())
  130. {
  131. AZStd::vector<AZStd::string> tokens;
  132. AZ::StringFunc::Tokenize(buffer, tokens, "|");
  133. for (const AZStd::string& path : tokens)
  134. {
  135. bool result = false;
  136. AZ::Data::AssetInfo assetInfo;
  137. AZStd::string watchFolder;
  138. AzToolsFramework::AssetSystemRequestBus::BroadcastResult(
  139. result,
  140. &AzToolsFramework::AssetSystemRequestBus::Events::GetSourceInfoBySourcePath,
  141. path.c_str(),
  142. assetInfo,
  143. watchFolder);
  144. if (!result || !assetInfo.m_assetId.IsValid())
  145. {
  146. AZ_Error("TestDependencyBuilderComponent", false, "GetSourceInfoBySourcePath failed for %s", path.c_str());
  147. return;
  148. }
  149. // It's not technically correct to use the source AssetId as a product asset reference, however we know the output will have
  150. // a subId of 0 (the default) so we don't actually need that bit of data, we just need the UUID
  151. auto assetRef = AZ::Data::Asset<TestAsset>(assetInfo.m_assetId, azrtti_typeid<TestAsset>(), path);
  152. assetRef.SetAutoLoadBehavior(AZ::Data::PreLoad);
  153. outputAsset.m_referencedAssets.push_back(AZStd::move(assetRef));
  154. }
  155. }
  156. auto outputPath = AZ::IO::Path(request.m_tempDirPath) / request.m_sourceFile;
  157. outputPath.ReplaceExtension("auto_test_asset");
  158. AZ::JsonSerializationUtils::SaveObjectToFile(&outputAsset, outputPath.StringAsPosix());
  159. AssetBuilderSDK::JobProduct jobProduct;
  160. AssetBuilderSDK::OutputObject(&outputAsset, outputPath.FixedMaxPathStringAsPosix(), azrtti_typeid<TestAsset>(), 0, jobProduct);
  161. response.m_outputProducts.push_back(jobProduct);
  162. response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Success;
  163. }
  164. void TestDependencyBuilderComponent::ShutDown()
  165. {
  166. m_isShuttingDown = true;
  167. }
  168. } // namespace TestAssetBuilder