3
0

Modifier.h 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  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 <AzCore/Component/TickBus.h>
  10. #include <AzFramework/Asset/AssetSystemBus.h>
  11. #include <Editor/View/Windows/Tools/UpgradeTool/FileSaver.h>
  12. #include <Editor/View/Windows/Tools/UpgradeTool/ModelTraits.h>
  13. #include <ScriptCanvas/Core/Core.h>
  14. namespace ScriptCanvasEditor
  15. {
  16. namespace VersionExplorer
  17. {
  18. class Modifier final
  19. : public AZ::SystemTickBus::Handler
  20. , public ModificationNotificationsBus::Handler
  21. , public AzFramework::AssetSystemInfoBus::Handler
  22. {
  23. public:
  24. AZ_CLASS_ALLOCATOR(Modifier, AZ::SystemAllocator);
  25. Modifier
  26. ( const ModifyConfiguration& modification
  27. , AZStd::vector<SourceHandle>&& assets
  28. , AZStd::function<void()> onComplete);
  29. ~Modifier();
  30. const ModificationResults& GetResult() const;
  31. ModificationResults&& TakeResult();
  32. private:
  33. friend class Sorter;
  34. struct Sorter
  35. {
  36. Modifier* modifier;
  37. AZStd::unordered_set<size_t> markedPermanent;
  38. AZStd::unordered_set<size_t> markedTemporary;
  39. void Sort();
  40. private:
  41. void Visit(size_t index);
  42. const AZStd::unordered_set<size_t>* GetDependencies(size_t index) const;
  43. };
  44. enum class State
  45. {
  46. GatheringDependencies,
  47. ModifyingGraphs
  48. };
  49. enum class ModifyState
  50. {
  51. Idle,
  52. WaitingForDependencyProcessing,
  53. StartModification,
  54. InProgress,
  55. Saving,
  56. ReportResult
  57. };
  58. AZStd::recursive_mutex m_mutex;
  59. // the two states reside in this class because the modification is only complete if the new source file saves out
  60. State m_state = State::GatheringDependencies;
  61. ModifyState m_modifyState = ModifyState::Idle;
  62. size_t m_assetIndex = 0;
  63. AZStd::function<void()> m_onComplete;
  64. // asset infos in scanned order
  65. AZStd::vector<SourceHandle> m_assets;
  66. // dependency sorted order indices into the asset vector
  67. AZStd::vector<size_t> m_dependencyOrderedAssetIndicies;
  68. // dependency indices by asset info index (only exist if graphs have them)
  69. AZStd::unordered_map<size_t, AZStd::unordered_set<size_t>> m_dependencies;
  70. AZStd::unordered_map<AZ::Uuid, size_t> m_assetInfoIndexById;
  71. ModifyConfiguration m_config;
  72. ModificationResult m_result;
  73. ModificationResults m_results;
  74. AZStd::unique_ptr<FileSaver> m_fileSaver;
  75. FileSaveResult m_fileSaveResult;
  76. // m_attemptedAssets is assets attempted to be processed by modification, as opposed to
  77. // those processed by the AP as a result of one of their dependencies being processed.
  78. AZStd::unordered_set<AZ::Uuid> m_attemptedAssets;
  79. AZStd::unordered_set<AZ::Uuid> m_assetsCompletedByAP;
  80. AZStd::unordered_set<AZ::Uuid> m_assetsFailedByAP;
  81. AZStd::chrono::steady_clock::time_point m_waitLogTimeStamp;
  82. AZStd::chrono::steady_clock::time_point m_waitTimeStamp;
  83. AZStd::unordered_set<AZStd::string> m_successNotifications;
  84. AZStd::unordered_set<AZStd::string> m_failureNotifications;
  85. bool AllDependenciesCleared(const AZStd::unordered_set<size_t>& dependencies) const;
  86. bool AnyDependenciesFailed(const AZStd::unordered_set<size_t>& dependencies) const;
  87. void AssetCompilationSuccess(const AZStd::string& assetPath) override;
  88. void AssetCompilationFailed(const AZStd::string& assetPath) override;
  89. AZStd::sys_time_t CalculateRemainingWaitTime(const AZStd::unordered_set<size_t>& dependencies) const;
  90. void CheckDependencies();
  91. void GatherDependencies();
  92. size_t GetCurrentIndex() const;
  93. const AZStd::unordered_set<size_t>* GetDependencies(size_t index) const;
  94. AZStd::unordered_set<size_t>& GetOrCreateDependencyIndexSet();
  95. void InitializeResult();
  96. void LoadAsset();
  97. void ModificationComplete(const ModificationResult& result) override;
  98. void ModifyCurrentAsset();
  99. void NextAsset();
  100. void NextModification();
  101. void OnFileSaveComplete(const FileSaveResult& result);
  102. void OnSystemTick() override;
  103. void ProcessNotifications();
  104. void ReleaseCurrentAsset();
  105. void ReportModificationError(AZStd::string_view report);
  106. void ReportModificationSuccess();
  107. void ReportSaveResult();
  108. void SaveModifiedGraph(const ModificationResult& result);
  109. void SortGraphsByDependencies();
  110. void TickGatherDependencies();
  111. void TickUpdateGraph();
  112. void WaitForDependencies();
  113. };
  114. }
  115. }