3
0

MeshComponentController.h 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  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 <Atom/Feature/Mesh/MeshFeatureProcessorInterface.h>
  10. #include <Atom/RPI.Public/Model/Model.h>
  11. #include <AtomCore/Instance/InstanceDatabase.h>
  12. #include <AtomLyIntegration/AtomImGuiTools/AtomImGuiToolsBus.h>
  13. #include <AtomLyIntegration/CommonFeatures/Material/MaterialAssignment.h>
  14. #include <AtomLyIntegration/CommonFeatures/Material/MaterialComponentBus.h>
  15. #include <AtomLyIntegration/CommonFeatures/Mesh/MeshComponentBus.h>
  16. #include <AtomLyIntegration/CommonFeatures/Mesh/MeshHandleStateBus.h>
  17. #include <AzCore/Component/Component.h>
  18. #include <AzCore/Component/ComponentBus.h>
  19. #include <AzCore/Component/NonUniformScaleBus.h>
  20. #include <AzCore/Component/TransformBus.h>
  21. #include <AzFramework/Render/GeometryIntersectionBus.h>
  22. #include <AzFramework/Visibility/BoundsBus.h>
  23. #include <AzFramework/Visibility/VisibleGeometryBus.h>
  24. namespace AZ
  25. {
  26. namespace Render
  27. {
  28. //! A configuration structure for the MeshComponentController
  29. class MeshComponentConfig final
  30. : public AZ::ComponentConfig
  31. {
  32. public:
  33. AZ_RTTI(AZ::Render::MeshComponentConfig, "{63737345-51B1-472B-9355-98F99993909B}", ComponentConfig);
  34. AZ_CLASS_ALLOCATOR(MeshComponentConfig, SystemAllocator);
  35. static void Reflect(AZ::ReflectContext* context);
  36. // Editor helper functions
  37. bool IsAssetSet();
  38. bool LodTypeIsScreenCoverage();
  39. bool LodTypeIsSpecificLOD();
  40. bool ShowLodConfig();
  41. AZStd::vector<AZStd::pair<RPI::Cullable::LodOverride, AZStd::string>> GetLodOverrideValues();
  42. Data::Asset<RPI::ModelAsset> m_modelAsset = { AZ::Data::AssetLoadBehavior::QueueLoad };
  43. RHI::DrawItemSortKey m_sortKey = 0;
  44. bool m_excludeFromReflectionCubeMaps = false;
  45. bool m_isAlwaysDynamic = false;
  46. bool m_useForwardPassIblSpecular = false;
  47. bool m_isRayTracingEnabled = true;
  48. RPI::Cullable::LodType m_lodType = RPI::Cullable::LodType::Default;
  49. RPI::Cullable::LodOverride m_lodOverride = aznumeric_cast<RPI::Cullable::LodOverride>(0);
  50. float m_minimumScreenCoverage = 1.0f / 1080.0f;
  51. float m_qualityDecayRate = 0.5f;
  52. };
  53. class MeshComponentController final
  54. : private MeshComponentRequestBus::Handler
  55. , private MeshHandleStateRequestBus::Handler
  56. , private AtomImGuiTools::AtomImGuiMeshCallbackBus::Handler
  57. , public AzFramework::BoundsRequestBus::Handler
  58. , public AzFramework::VisibleGeometryRequestBus::Handler
  59. , public AzFramework::RenderGeometry::IntersectionRequestBus::Handler
  60. , private TransformNotificationBus::Handler
  61. , private MaterialConsumerRequestBus::Handler
  62. , private MaterialComponentNotificationBus::Handler
  63. {
  64. public:
  65. friend class EditorMeshComponent;
  66. AZ_CLASS_ALLOCATOR(MeshComponentController, AZ::SystemAllocator);
  67. AZ_RTTI(AZ::Render::MeshComponentController, "{D0F35FAC-4194-4C89-9487-D000DDB8B272}");
  68. ~MeshComponentController();
  69. static void Reflect(AZ::ReflectContext* context);
  70. static void GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent);
  71. static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided);
  72. static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible);
  73. MeshComponentController() = default;
  74. MeshComponentController(const MeshComponentConfig& config);
  75. void Activate(const AZ::EntityComponentIdPair& entityComponentIdPair);
  76. void Deactivate();
  77. void SetConfiguration(const MeshComponentConfig& config);
  78. const MeshComponentConfig& GetConfiguration() const;
  79. private:
  80. AZ_DISABLE_COPY(MeshComponentController);
  81. // MeshComponentRequestBus overrides ...
  82. void SetModelAsset(Data::Asset<RPI::ModelAsset> modelAsset) override;
  83. Data::Asset<const RPI::ModelAsset> GetModelAsset() const override;
  84. void SetModelAssetId(Data::AssetId modelAssetId) override;
  85. Data::AssetId GetModelAssetId() const override;
  86. void SetModelAssetPath(const AZStd::string& modelAssetPath) override;
  87. AZStd::string GetModelAssetPath() const override;
  88. AZ::Data::Instance<RPI::Model> GetModel() const override;
  89. // AtomImGuiTools::AtomImGuiMeshCallbackBus::Handler overrides ...
  90. const RPI::MeshDrawPacketLods* GetDrawPackets() const override;
  91. // AtomMeshRequestBus overrides ...
  92. const MeshFeatureProcessorInterface::MeshHandle* GetMeshHandle() const override;
  93. void SetSortKey(RHI::DrawItemSortKey sortKey) override;
  94. RHI::DrawItemSortKey GetSortKey() const override;
  95. void SetIsAlwaysDynamic(bool isAlwaysDynamic) override;
  96. bool GetIsAlwaysDynamic() const override;
  97. void SetLodType(RPI::Cullable::LodType lodType) override;
  98. RPI::Cullable::LodType GetLodType() const override;
  99. void SetLodOverride(RPI::Cullable::LodOverride lodOverride) override;
  100. RPI::Cullable::LodOverride GetLodOverride() const override;
  101. void SetMinimumScreenCoverage(float minimumScreenCoverage) override;
  102. float GetMinimumScreenCoverage() const override;
  103. void SetQualityDecayRate(float qualityDecayRate) override;
  104. float GetQualityDecayRate() const override;
  105. void SetVisibility(bool visible) override;
  106. bool GetVisibility() const override;
  107. void SetRayTracingEnabled(bool enabled) override;
  108. bool GetRayTracingEnabled() const override;
  109. void SetExcludeFromReflectionCubeMaps(bool excludeFromReflectionCubeMaps) override;
  110. bool GetExcludeFromReflectionCubeMaps() const override;
  111. // AzFramework::BoundsRequestBus::Handler overrides ...
  112. AZ::Aabb GetWorldBounds() override;
  113. AZ::Aabb GetLocalBounds() override;
  114. // AzFramework::VisibleGeometryRequestBus::Handler overrides ...
  115. void GetVisibleGeometry(const AZ::Aabb& bounds, AzFramework::VisibleGeometryContainer& geometryContainer) const override;
  116. // IntersectionRequestBus overrides ...
  117. AzFramework::RenderGeometry::RayResult RenderGeometryIntersect(const AzFramework::RenderGeometry::RayRequest& ray) override;
  118. // TransformNotificationBus::Handler overrides ...
  119. void OnTransformChanged(const AZ::Transform& local, const AZ::Transform& world) override;
  120. // MaterialConsumerRequestBus::Handler overrides ...
  121. MaterialAssignmentId FindMaterialAssignmentId(
  122. const MaterialAssignmentLodIndex lod, const AZStd::string& label) const override;
  123. MaterialAssignmentLabelMap GetMaterialLabels() const override;
  124. MaterialAssignmentMap GetDefaultMaterialMap() const override;
  125. AZStd::unordered_set<AZ::Name> GetModelUvNames() const override;
  126. // MaterialComponentNotificationBus::Handler overrides ...
  127. void OnMaterialsUpdated(const MaterialAssignmentMap& materials) override;
  128. void OnMaterialPropertiesUpdated(const MaterialAssignmentMap& materials) override;
  129. //! Check if the model asset requires to be cloned (e.g. cloth) for unique model instances.
  130. //! @param modelAsset The model asset to check.
  131. //! @result True in case the model asset needs to be cloned before creating the model. False if there is a 1:1 relationship between
  132. //! the model asset and the model and it is static and shared. In the second case the m_originalModelAsset of the mesh handle is
  133. //! equal to the model asset that the model is linked to.
  134. static bool RequiresCloning(const Data::Asset<RPI::ModelAsset>& modelAsset);
  135. void HandleModelChange(Data::Instance<RPI::Model> model);
  136. void HandleObjectSrgCreate(const Data::Instance<RPI::ShaderResourceGroup>& objectSrg);
  137. void RegisterModel();
  138. void UnregisterModel();
  139. void RefreshModelRegistration();
  140. RPI::Cullable::LodConfiguration GetMeshLodConfiguration() const;
  141. void HandleNonUniformScaleChange(const AZ::Vector3& nonUniformScale);
  142. Render::MeshFeatureProcessorInterface* m_meshFeatureProcessor = nullptr;
  143. Render::MeshFeatureProcessorInterface::MeshHandle m_meshHandle;
  144. TransformInterface* m_transformInterface = nullptr;
  145. AZ::EntityComponentIdPair m_entityComponentIdPair;
  146. bool m_isVisible = true;
  147. MeshComponentConfig m_configuration;
  148. AZ::Vector3 m_cachedNonUniformScale = AZ::Vector3::CreateOne();
  149. //! Cached bus to use to notify RenderGeometry::Intersector the entity/component has changed.
  150. AzFramework::RenderGeometry::IntersectionNotificationBus::BusPtr m_intersectionNotificationBus;
  151. MeshFeatureProcessorInterface::ModelChangedEvent::Handler m_changeEventHandler
  152. {
  153. [&](Data::Instance<RPI::Model> model) { HandleModelChange(model); }
  154. };
  155. MeshFeatureProcessorInterface::ObjectSrgCreatedEvent::Handler m_objectSrgCreatedHandler
  156. {
  157. [&](const Data::Instance<RPI::ShaderResourceGroup>& objectSrg) { HandleObjectSrgCreate(objectSrg); }
  158. };
  159. AZ::NonUniformScaleChangedEvent::Handler m_nonUniformScaleChangedHandler
  160. {
  161. [&](const AZ::Vector3& nonUniformScale) { HandleNonUniformScaleChange(nonUniformScale); }
  162. };
  163. };
  164. } // namespace Render
  165. } // namespace AZ