RCBuilder.h 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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 "../utilities/ApplicationManagerAPI.h"
  10. #include "native/AssetManager/assetProcessorManager.h"
  11. #include "native/utilities/PlatformConfiguration.h"
  12. namespace AssetProcessor
  13. {
  14. //! Internal structure that consolidates a internal builder id, its name, and its custom fixed rc param match
  15. class BuilderIdAndName
  16. {
  17. public:
  18. enum class Type
  19. {
  20. REGISTERED_BUILDER,
  21. UNREGISTERED_BUILDER
  22. };
  23. BuilderIdAndName() = default;
  24. BuilderIdAndName(QString builderName, QString builderId, Type type, QString rcParam = QString(""));
  25. BuilderIdAndName(const BuilderIdAndName& src) = default;
  26. BuilderIdAndName& operator=(const AssetProcessor::BuilderIdAndName& src);
  27. const QString& GetName() const;
  28. bool GetUuid(AZ::Uuid& builderUuid) const;
  29. const QString& GetRcParam() const;
  30. const QString& GetId() const;
  31. const Type GetType() const;
  32. private:
  33. Type m_type = Type::UNREGISTERED_BUILDER;
  34. QString m_builderName;
  35. QString m_builderId;
  36. QString m_rcParam;
  37. };
  38. extern const BuilderIdAndName BUILDER_ID_COPY;
  39. extern const BuilderIdAndName BUILDER_ID_SKIP;
  40. extern const QHash<QString, BuilderIdAndName> INTERNAL_BUILDER_BY_ID;
  41. //! Internal Builder version of the asset recognizer structure that is read in from the platform configuration class
  42. struct InternalAssetRecognizer
  43. : public AssetRecognizer
  44. {
  45. AZ_CLASS_ALLOCATOR(InternalAssetRecognizer, AZ::SystemAllocator)
  46. InternalAssetRecognizer(const AssetRecognizer& src, const AZStd::string& builderId, const AZStd::unordered_map<AZStd::string, AssetInternalSpec>& assetPlatformSpecByPlatform);
  47. InternalAssetRecognizer(const InternalAssetRecognizer& src) = default;
  48. AZ::u32 CalculateCRC() const;
  49. //! Map of platform specs based on the identifier of the platform
  50. AZStd::unordered_map<AZStd::string, AssetInternalSpec> m_platformSpecsByPlatform;
  51. //! unique id that is generated for each unique internal asset recognizer
  52. //! which can be used as the key for the job parameter map (see AssetBuilderSDK::JobParameterMap)
  53. AZ::u32 m_paramID;
  54. //! Keep track which internal builder type this recognizer is for
  55. const AZStd::string m_builderId;
  56. };
  57. typedef QHash<AZ::u32, InternalAssetRecognizer*> InternalRecognizerContainer;
  58. typedef QList<const InternalAssetRecognizer*> InternalRecognizerPointerContainer;
  59. typedef AZStd::function<void(const AssetBuilderSDK::AssetBuilderDesc& builderDesc)> RegisterBuilderDescCallback;
  60. typedef AZStd::list<InternalAssetRecognizer*> InternalAssetRecognizerList;
  61. class InternalRecognizerBasedBuilder
  62. : public AssetBuilderSDK::AssetBuilderCommandBus::Handler
  63. {
  64. public:
  65. //! Constructor to initialize the internal based builder to a present set of internal builders and fixed bus id
  66. InternalRecognizerBasedBuilder();
  67. virtual ~InternalRecognizerBasedBuilder();
  68. AssetBuilderSDK::AssetBuilderDesc CreateBuilderDesc(const QString& builderId, const AZStd::vector<AssetBuilderSDK::AssetBuilderPattern>& builderPatterns);
  69. void ShutDown() override;
  70. virtual bool Initialize(const RecognizerConfiguration& recognizerConfig);
  71. virtual void InitializeAssetRecognizers(const RecognizerContainer& assetRecognizers);
  72. virtual void UnInitialize();
  73. //! Returns false if there were no matches, otherwise returns true
  74. virtual bool GetMatchingRecognizers(const AZStd::vector<AssetBuilderSDK::PlatformInfo>& platformInfos, const QString& fileName, InternalRecognizerPointerContainer& output) const;
  75. void CreateJobs(const AssetBuilderSDK::CreateJobsRequest& request, AssetBuilderSDK::CreateJobsResponse& response);
  76. void ProcessJob(const AssetBuilderSDK::ProcessJobRequest& request, AssetBuilderSDK::ProcessJobResponse& response);
  77. static bool MatchTempFileToSkip(const QString& outputFilename);
  78. protected:
  79. //! Constructor to initialize the internal builders and a general internal builder uuid that is used for bus
  80. //! registration. This constructor is helpful for deriving other classes from this builder for purposes like
  81. //! unit testing.
  82. InternalRecognizerBasedBuilder(QHash<QString, BuilderIdAndName> inputBuilderByIdMap, AZ::Uuid internalBuilderUuid);
  83. void ProcessCopyJob(
  84. const AssetBuilderSDK::ProcessJobRequest& request,
  85. AZ::Uuid productAssetType,
  86. bool outputProductDependencies,
  87. const AssetBuilderSDK::JobCancelListener& jobCancelListener,
  88. AssetBuilderSDK::ProcessJobResponse& response);
  89. // overridable so we can unit-test override it.
  90. virtual QFileInfoList GetFilesInDirectory(const QString& directoryPath);
  91. volatile bool m_isShuttingDown;
  92. InternalRecognizerContainer m_assetRecognizerDictionary;
  93. QHash<QString, BuilderIdAndName> m_builderById;
  94. //! UUid for the internal recognizer for logging purposes since the this
  95. //! class manages multiple internal build uuids
  96. AZ::Uuid m_internalRecognizerBuilderUuid;
  97. };
  98. } // namespace AssetProcessor