ScriptCanvasBuilderWorker.h 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  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. #pragma once
  9. #include <AssetBuilderSDK/AssetBuilderBusses.h>
  10. #include <AssetBuilderSDK/AssetBuilderSDK.h>
  11. #include <AzCore/Outcome/Outcome.h>
  12. #include <AzCore/std/smart_ptr/unique_ptr.h>
  13. #include <AzCore/Asset/AssetCommon.h>
  14. #include <ScriptCanvas/Asset/RuntimeAsset.h>
  15. #include <ScriptCanvas/Asset/RuntimeAssetHandler.h>
  16. #include <ScriptCanvas/Core/Core.h>
  17. #include <ScriptCanvas/Translation/Translation.h>
  18. namespace AZ
  19. {
  20. class ScriptAsset;
  21. namespace Data
  22. {
  23. class AssetHandler;
  24. }
  25. }
  26. namespace ScriptCanvas
  27. {
  28. struct SubgraphInterfaceData;
  29. }
  30. namespace ScriptCanvasEditor
  31. {
  32. class EditorGraph;
  33. }
  34. namespace ScriptCanvasBuilder
  35. {
  36. using SourceHandle = ScriptCanvas::SourceHandle;
  37. constexpr const char* s_scriptCanvasBuilder = "ScriptCanvasBuilder";
  38. constexpr const char* s_scriptCanvasProcessJobKey = "Script Canvas Process Job";
  39. constexpr const char* s_unitTestParseErrorPrefix = "LY_SC_UnitTest";
  40. enum class BuilderVersion : int
  41. {
  42. SplitCopyFromCompileJobs = 9,
  43. ChangeScriptRequirementToAsset,
  44. RemoveDebugVariablesFromRelease,
  45. FailJobsOnMissingLKG,
  46. QuantumLeap,
  47. DependencyArguments,
  48. DependencyRequirementsData,
  49. AddAssetDependencySearch,
  50. PrefabIntegration,
  51. CorrectGraphVariableVersion,
  52. ReflectEntityIdNodes,
  53. FixExecutionStateNodeableConstruction,
  54. SwitchAssetsToBinary,
  55. ReinforcePreloadBehavior,
  56. SeparateFromEntityComponentSystem,
  57. DistinguishEntityScriptFromScript,
  58. ExecutionStateAsLightUserdata,
  59. UpdateDependencyHandling,
  60. AddExplicitDestructCallForMemberVariables,
  61. DoNotLoadScriptEventsDuringCreateJobs,
  62. FixEntityIdReturnValuesInEvents,
  63. // add new entries above
  64. Current,
  65. };
  66. using HandlerOwnership = AZStd::pair<AZ::Data::AssetHandler*, bool>;
  67. struct SharedHandlers;
  68. struct AssetHandlers
  69. {
  70. AZ::Data::AssetHandler* m_editorFunctionAssetHandler = nullptr;
  71. AZ::Data::AssetHandler* m_runtimeAssetHandler = nullptr;
  72. AZ::Data::AssetHandler* m_subgraphInterfaceHandler = nullptr;
  73. AssetHandlers() = default;
  74. explicit AssetHandlers(SharedHandlers& source);
  75. };
  76. struct SharedHandlers
  77. {
  78. HandlerOwnership m_editorFunctionAssetHandler{};
  79. HandlerOwnership m_runtimeAssetHandler{};
  80. HandlerOwnership m_subgraphInterfaceHandler{};
  81. void DeleteOwnedHandlers();
  82. private:
  83. void DeleteIfOwned(HandlerOwnership& handler);
  84. };
  85. struct ProcessTranslationJobInput
  86. {
  87. AZ::Data::AssetId assetID;
  88. const AssetBuilderSDK::ProcessJobRequest* request = nullptr;
  89. AssetBuilderSDK::ProcessJobResponse* response = nullptr;
  90. AZStd::string runtimeScriptCanvasOutputPath;
  91. AZ::Data::AssetHandler* assetHandler = nullptr;
  92. AZ::Entity* buildEntity = nullptr;
  93. AZStd::string fullPath;
  94. AZStd::string fileNameOnly;
  95. AZStd::string namespacePath;
  96. bool saveRawLua = false;
  97. ScriptCanvas::RuntimeData runtimeDataOut;
  98. ScriptCanvas::Grammar::SubgraphInterface interfaceOut;
  99. };
  100. class JobDependencyVerificationHandler : public ScriptCanvas::RuntimeAssetHandler
  101. {
  102. public:
  103. AZ_CLASS_ALLOCATOR(JobDependencyVerificationHandler, AZ::SystemAllocator);
  104. AZ_RTTI(JobDependencyVerificationHandler, "{3997EF50-350A-46F0-9D84-7FA403855CC5}", ScriptCanvas::RuntimeAssetHandler);
  105. void InitAsset(const AZ::Data::Asset<AZ::Data::AssetData>& asset, bool loadStageSucceeded, bool isReload) override
  106. {
  107. AZ_UNUSED(asset);
  108. AZ_UNUSED(loadStageSucceeded);
  109. AZ_UNUSED(isReload);
  110. // do nothing, this just verifies the asset existed
  111. }
  112. };
  113. AZ::Outcome<AZ::Data::Asset<ScriptCanvas::RuntimeAsset>, AZStd::string> CreateRuntimeAsset(const SourceHandle& asset);
  114. AZ::Outcome<ScriptCanvas::Translation::LuaAssetResult, AZStd::string> CreateLuaAsset(const SourceHandle& editAsset, AZStd::string_view rawLuaFilePath);
  115. int GetBuilderVersion();
  116. AZ::Outcome<ScriptCanvas::Grammar::AbstractCodeModelConstPtr, AZStd::string> ParseGraph(AZ::Entity& buildEntity, AZStd::string_view graphPath);
  117. AZ::Outcome<void, AZStd::string> ProcessTranslationJob(ProcessTranslationJobInput& input);
  118. ScriptCanvasEditor::EditorGraph* PrepareSourceGraph(AZ::Entity* const buildEntity);
  119. AZ::Outcome<void, AZStd::string> SaveSubgraphInterface(ProcessTranslationJobInput& input, ScriptCanvas::SubgraphInterfaceData& subgraphInterface);
  120. AZ::Outcome<void, AZStd::string> SaveRuntimeAsset(ProcessTranslationJobInput& input, ScriptCanvas::RuntimeData& runtimeData);
  121. ScriptCanvas::Translation::Result TranslateToLua(ScriptCanvas::Grammar::Request& request);
  122. class Worker
  123. : public AssetBuilderSDK::AssetBuilderCommandBus::Handler
  124. {
  125. public:
  126. static AZ::Uuid GetUUID();
  127. Worker() = default;
  128. Worker(const Worker&) = delete;
  129. void Activate(const AssetHandlers& handlers);
  130. //! Asset Builder Callback Functions
  131. void CreateJobs(const AssetBuilderSDK::CreateJobsRequest& request, AssetBuilderSDK::CreateJobsResponse& response) const;
  132. const char* GetFingerprintString() const;
  133. int GetVersionNumber() const;
  134. void ProcessJob(const AssetBuilderSDK::ProcessJobRequest& request, AssetBuilderSDK::ProcessJobResponse& response) const;
  135. void ShutDown() override {};
  136. private:
  137. AZ::Data::AssetHandler* m_runtimeAssetHandler = nullptr;
  138. AZ::Data::AssetHandler* m_subgraphInterfaceHandler = nullptr;
  139. AZ::Uuid m_sourceUuid;
  140. mutable AZStd::vector<AZ::Data::AssetFilterInfo> m_processEditorAssetDependencies;
  141. // cached on first time query
  142. mutable AZStd::string m_fingerprintString;
  143. };
  144. }