3
0

ApplicationManagerBase.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  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. #if !defined(Q_MOC_RUN)
  10. #include <AzCore/std/string/string.h>
  11. #include <AzCore/std/smart_ptr/unique_ptr.h>
  12. #include <AzCore/std/containers/vector.h>
  13. #include <AzCore/Debug/TraceMessageBus.h>
  14. #include <AzToolsFramework/API/AssetDatabaseBus.h>
  15. #include <native/FileWatcher/FileWatcherBase.h>
  16. #include <native/utilities/ApplicationManager.h>
  17. #include <native/utilities/AssetBuilderInfo.h>
  18. #include <native/utilities/BuilderManager.h>
  19. #include <native/utilities/UuidManager.h>
  20. #include <QtGui/qwindowdefs.h>
  21. #endif
  22. namespace AzToolsFramework
  23. {
  24. class ProcessWatcher;
  25. class Ticker;
  26. }
  27. namespace AssetProcessor
  28. {
  29. class AssetCatalog;
  30. class AssetProcessorManager;
  31. class AssetRequestHandler;
  32. class AssetScanner;
  33. class AssetServerHandler;
  34. class BuilderConfigurationManager;
  35. class BuilderManager;
  36. class ExternalModuleAssetBuilderInfo;
  37. class FileProcessor;
  38. class FileStateBase;
  39. class FileStateCache;
  40. class InternalAssetBuilderInfo;
  41. class PlatformConfiguration;
  42. class RCController;
  43. class SettingsRegistryBuilder;
  44. }
  45. class ApplicationServer;
  46. class ConnectionManager;
  47. class ControlRequestHandler;
  48. class ApplicationManagerBase
  49. : public ApplicationManager
  50. , public AssetBuilderSDK::AssetBuilderBus::Handler
  51. , public AssetProcessor::AssetBuilderInfoBus::Handler
  52. , public AssetProcessor::AssetBuilderRegistrationBus::Handler
  53. , public AZ::Debug::TraceMessageBus::Handler
  54. , protected AzToolsFramework::AssetDatabase::AssetDatabaseRequests::Bus::Handler
  55. , public AZ::Interface<AssetProcessor::IDiskSpaceInfo>::Registrar
  56. , protected AzToolsFramework::SourceControlNotificationBus::Handler
  57. , public AssetProcessor::MessageInfoBus::Handler
  58. {
  59. Q_OBJECT
  60. public:
  61. explicit ApplicationManagerBase(int* argc, char*** argv, QObject* parent = 0);
  62. virtual ~ApplicationManagerBase();
  63. ApplicationManager::BeforeRunStatus BeforeRun() override;
  64. void Destroy() override;
  65. bool Run() override;
  66. void HandleFileRelocation() const;
  67. bool Activate() override;
  68. bool PostActivate() override;
  69. void Reflect() override;
  70. AssetProcessor::PlatformConfiguration* GetPlatformConfiguration() const;
  71. AssetProcessor::AssetProcessorManager* GetAssetProcessorManager() const;
  72. AssetProcessor::AssetScanner* GetAssetScanner() const;
  73. AssetProcessor::RCController* GetRCController() const;
  74. ConnectionManager* GetConnectionManager() const;
  75. ApplicationServer* GetApplicationServer() const;
  76. int ProcessedAssetCount() const;
  77. int FailedAssetsCount() const;
  78. void ResetProcessedAssetCount();
  79. void ResetFailedAssetCount();
  80. //! AssetBuilderSDK::AssetBuilderBus Interface
  81. void RegisterBuilderInformation(const AssetBuilderSDK::AssetBuilderDesc& builderDesc) override;
  82. void RegisterComponentDescriptor(AZ::ComponentDescriptor* descriptor) override;
  83. void BuilderLog(const AZ::Uuid& builderId, const char* message, ...) override;
  84. void BuilderLogV(const AZ::Uuid& builderId, const char* message, va_list list) override;
  85. bool FindBuilderInformation(const AZ::Uuid& builderGuid, AssetBuilderSDK::AssetBuilderDesc& descriptionOut) override;
  86. //! AssetBuilderSDK::InternalAssetBuilderBus Interface
  87. void UnRegisterBuilderDescriptor(const AZ::Uuid& builderId) override;
  88. //! AssetProcessor::AssetBuilderInfoBus Interface
  89. void GetMatchingBuildersInfo(const AZStd::string& assetPath, AssetProcessor::BuilderInfoList& builderInfoList) override;
  90. void GetAllBuildersInfo(AssetProcessor::BuilderInfoList& builderInfoList) override;
  91. //! TraceMessageBus Interface
  92. bool OnError(const char* window, const char* message) override;
  93. //! IDiskSpaceInfo Interface
  94. bool CheckSufficientDiskSpace(qint64 requiredSpace, bool shutdownIfInsufficient) override;
  95. //! AzFramework::SourceControlNotificationBus::Handler
  96. void ConnectivityStateChanged(const AzToolsFramework::SourceControlState newState) override;
  97. //! MessageInfoBus::Handler
  98. void OnBuilderRegistrationFailure() override;
  99. void RemoveOldTempFolders();
  100. void Rescan();
  101. void FastScan();
  102. bool IsAssetProcessorManagerIdle() const override;
  103. bool CheckFullIdle();
  104. // Used to track AP command line checks, so the help can be easily printed.
  105. struct APCommandLineSwitch
  106. {
  107. APCommandLineSwitch(AZStd::vector<APCommandLineSwitch>& commandLineInfo, const char* switchTitle, const char* helpText)
  108. : m_switch(switchTitle)
  109. , m_helpText(helpText)
  110. {
  111. commandLineInfo.push_back(*this);
  112. }
  113. const char* m_switch;
  114. const char* m_helpText;
  115. };
  116. virtual WId GetWindowId() const;
  117. Q_SIGNALS:
  118. void CheckAssetProcessorManagerIdleState();
  119. void ConnectionStatusMsg(QString message);
  120. void SourceControlReady();
  121. void OnBuildersRegistered();
  122. void AssetProcesserManagerIdleStateChange(bool isIdle);
  123. void FullIdle(bool isIdle);
  124. public Q_SLOTS:
  125. void OnAssetProcessorManagerIdleState(bool isIdle);
  126. protected:
  127. virtual void InitAssetProcessorManager(AZStd::vector<APCommandLineSwitch>& commandLineInfo);//Deletion of assetProcessor Manager will be handled by the ThreadController
  128. virtual void InitAssetCatalog(); // Deletion of AssetCatalog will be handled when the ThreadController is deleted by the base ApplicationManager
  129. virtual void ConnectAssetCatalog();
  130. virtual void InitRCController();
  131. virtual void DestroyRCController();
  132. virtual void InitAssetScanner();
  133. virtual void DestroyAssetScanner();
  134. virtual bool InitPlatformConfiguration();
  135. virtual void DestroyPlatformConfiguration();
  136. virtual void InitFileMonitor(AZStd::unique_ptr<FileWatcherBase> fileWatcher);
  137. virtual void DestroyFileMonitor();
  138. virtual bool InitBuilderConfiguration();
  139. virtual void InitControlRequestHandler();
  140. virtual void DestroyControlRequestHandler();
  141. virtual bool InitApplicationServer() = 0;
  142. void DestroyApplicationServer();
  143. virtual void InitConnectionManager();
  144. void DestroyConnectionManager();
  145. void InitAssetRequestHandler(AssetProcessor::AssetRequestHandler* assetRequestHandler);
  146. virtual void InitFileStateCache();
  147. virtual void InitUuidManager();
  148. void CreateQtApplication() override;
  149. bool InitializeInternalBuilders();
  150. void InitBuilderManager();
  151. void ShutdownBuilderManager();
  152. bool InitAssetDatabase(bool ignoreFutureAssetDBVersionError);
  153. void ShutDownAssetDatabase();
  154. void InitAssetServerHandler();
  155. void DestroyAssetServerHandler();
  156. void InitFileProcessor();
  157. void ShutDownFileProcessor();
  158. virtual void InitSourceControl() = 0;
  159. void InitInputThread();
  160. void InputThread();
  161. void HandleCommandLineHelp(AZStd::vector<APCommandLineSwitch>& commandLineInfo);
  162. // Give an opportunity to derived classes to make connections before the application server starts listening
  163. virtual void MakeActivationConnections() {}
  164. virtual bool GetShouldExitOnIdle() const = 0;
  165. virtual void TryScanProductDependencies() {}
  166. virtual void TryHandleFileRelocation() {}
  167. // IMPLEMENTATION OF -------------- AzToolsFramework::AssetDatabase::AssetDatabaseRequests::Bus::Listener
  168. bool GetAssetDatabaseLocation(AZStd::string& location) override;
  169. // ------------------------------------------------------------
  170. AssetProcessor::AssetCatalog* GetAssetCatalog() const { return m_assetCatalog; }
  171. bool CheckReprocessFileList();
  172. ApplicationServer* m_applicationServer = nullptr;
  173. ConnectionManager* m_connectionManager = nullptr;
  174. // keep track of the critical loading point where we are loading other dlls so the error messages can be better.
  175. bool m_isCurrentlyLoadingGems = false;
  176. public Q_SLOTS:
  177. void OnActiveJobsCountChanged(unsigned int count);
  178. protected Q_SLOTS:
  179. void CheckForIdle();
  180. protected:
  181. int m_processedAssetCount = 0;
  182. int m_warningCount = 0;
  183. int m_errorCount = 0;
  184. int m_remainingAssetsToFinalize = 0;
  185. AZStd::set<AZStd::string> m_failedAssets;
  186. bool m_AssetProcessorManagerIdleState = false;
  187. bool m_sourceControlReady = false;
  188. bool m_fullIdle = false;
  189. AZStd::unique_ptr<FileWatcherBase> m_fileWatcher;
  190. AssetProcessor::PlatformConfiguration* m_platformConfiguration = nullptr;
  191. AssetProcessor::AssetProcessorManager* m_assetProcessorManager = nullptr;
  192. AssetProcessor::AssetCatalog* m_assetCatalog = nullptr;
  193. AssetProcessor::AssetScanner* m_assetScanner = nullptr;
  194. AssetProcessor::RCController* m_rcController = nullptr;
  195. AssetProcessor::AssetRequestHandler* m_assetRequestHandler = nullptr;
  196. AssetProcessor::BuilderManager* m_builderManager = nullptr;
  197. AssetProcessor::AssetServerHandler* m_assetServerHandler = nullptr;
  198. ControlRequestHandler* m_controlRequestHandler = nullptr;
  199. AZStd::unique_ptr<AssetProcessor::FileStateBase> m_fileStateCache;
  200. AZStd::unique_ptr<AssetProcessor::FileProcessor> m_fileProcessor;
  201. AZStd::unique_ptr<AssetProcessor::BuilderConfigurationManager> m_builderConfig;
  202. AZStd::unique_ptr<AssetProcessor::UuidManager> m_uuidManager;
  203. // The internal builders
  204. AZStd::shared_ptr<AssetProcessor::InternalRecognizerBasedBuilder> m_internalBuilder;
  205. AZStd::shared_ptr<AssetProcessor::SettingsRegistryBuilder> m_settingsRegistryBuilder;
  206. bool m_builderRegistrationComplete = false;
  207. // Builder description map based on the builder id
  208. AZStd::unordered_map<AZ::Uuid, AssetBuilderSDK::AssetBuilderDesc> m_builderDescMap;
  209. // Lookup for builder ids based on the name. The builder name must be unique
  210. AZStd::unordered_map<AZStd::string, AZ::Uuid> m_builderNameToId;
  211. // Builder pattern matchers to used to locate the builder descriptors that match a pattern
  212. AZStd::list<AssetUtilities::BuilderFilePatternMatcher> m_matcherBuilderPatterns;
  213. // Collection of all the external module builders
  214. AZStd::list<AssetProcessor::ExternalModuleAssetBuilderInfo*> m_externalAssetBuilders;
  215. AssetProcessor::ExternalModuleAssetBuilderInfo* m_currentExternalAssetBuilder = nullptr;
  216. QAtomicInt m_connectionsAwaitingAssetCatalogSave = 0;
  217. int m_remainingAPMJobs = 0;
  218. bool m_assetProcessorManagerIsReady = false;
  219. unsigned int m_highestConnId = 0;
  220. AzToolsFramework::Ticker* m_ticker = nullptr; // for ticking the tickbus.
  221. QList<QMetaObject::Connection> m_connectionsToRemoveOnShutdown;
  222. QString m_dependencyScanPattern;
  223. QString m_fileDependencyScanPattern;
  224. QString m_reprocessFileList;
  225. QStringList m_filesToReprocess;
  226. AZStd::vector<AZStd::string> m_dependencyAddtionalScanFolders;
  227. int m_dependencyScanMaxIteration = AssetProcessor::MissingDependencyScanner::DefaultMaxScanIteration; // The maximum number of times to recurse when scanning a file for missing dependencies.
  228. };