TerrainFeatureProcessor.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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/Asset/AssetCommon.h>
  10. #include <AzFramework/Terrain/TerrainDataRequestBus.h>
  11. #include <TerrainRenderer/Passes/TerrainClipmapComputePass.h>
  12. #include <TerrainRenderer/TerrainDetailMaterialManager.h>
  13. #include <TerrainRenderer/TerrainMacroMaterialManager.h>
  14. #include <TerrainRenderer/TerrainClipmapManager.h>
  15. #include <TerrainRenderer/TerrainMeshManager.h>
  16. #include <Atom/RPI.Public/FeatureProcessor.h>
  17. #include <Atom/RPI.Public/Image/AttachmentImage.h>
  18. namespace AZ::RPI
  19. {
  20. namespace AssetUtils
  21. {
  22. class AsyncAssetLoader;
  23. }
  24. class Material;
  25. class RenderPass;
  26. }
  27. namespace Terrain
  28. {
  29. class TerrainFeatureProcessor final
  30. : public AZ::RPI::FeatureProcessor
  31. , public AZ::Data::AssetBus::Handler
  32. , private AzFramework::Terrain::TerrainDataNotificationBus::Handler
  33. {
  34. public:
  35. AZ_CLASS_ALLOCATOR(TerrainFeatureProcessor, AZ::SystemAllocator)
  36. AZ_RTTI(TerrainFeatureProcessor, "{D7DAC1F9-4A9F-4D3C-80AE-99579BF8AB1C}", AZ::RPI::FeatureProcessor);
  37. AZ_DISABLE_COPY_MOVE(TerrainFeatureProcessor);
  38. AZ_FEATURE_PROCESSOR(TerrainFeatureProcessor);
  39. static void Reflect(AZ::ReflectContext* context);
  40. TerrainFeatureProcessor() = default;
  41. ~TerrainFeatureProcessor() = default;
  42. // AZ::RPI::FeatureProcessor overrides...
  43. void Activate() override;
  44. void Deactivate() override;
  45. void Render(const AZ::RPI::FeatureProcessor::RenderPacket& packet) override;
  46. void SetDetailMaterialConfiguration(const DetailMaterialConfiguration& config);
  47. void SetMeshConfiguration(const MeshConfiguration& config);
  48. void SetClipmapConfiguration(const ClipmapConfiguration& config);
  49. const AZ::Data::Instance<AZ::RPI::ShaderResourceGroup> GetTerrainShaderResourceGroup() const;
  50. const AZ::Data::Instance<AZ::RPI::Material> GetMaterial() const;
  51. const TerrainClipmapManager& GetClipmapManager() const;
  52. private:
  53. using MaterialInstance = AZ::Data::Instance<AZ::RPI::Material>;
  54. struct WorldShaderData
  55. {
  56. float m_zMin;
  57. float m_zMax;
  58. float m_zExtents;
  59. float m_padding;
  60. };
  61. //! AZ::Data::AssetBus overrides...
  62. void OnAssetReady(AZ::Data::Asset<AZ::Data::AssetData> asset) override;
  63. void OnAssetReloaded(AZ::Data::Asset<AZ::Data::AssetData> asset) override;
  64. // AzFramework::Terrain::TerrainDataNotificationBus overrides...
  65. void OnTerrainDataDestroyBegin() override;
  66. void OnTerrainDataChanged(const AZ::Aabb& dirtyRegion, TerrainDataChangedMask dataChangedMask) override;
  67. // AZ::RPI::SceneNotificationBus overrides...
  68. void OnRenderPipelineChanged(AZ::RPI::RenderPipeline* pipeline, AZ::RPI::SceneNotification::RenderPipelineChangeType changeType) override;
  69. // AZ::RPI::FeatureProcessor overrides...
  70. void AddRenderPasses(AZ::RPI::RenderPipeline* renderPipeline) override;
  71. void Initialize();
  72. void PrepareMaterialData();
  73. void ProcessSurfaces(const FeatureProcessor::RenderPacket& process);
  74. void CachePasses();
  75. TerrainMeshManager m_meshManager;
  76. TerrainMacroMaterialManager m_macroMaterialManager;
  77. TerrainDetailMaterialManager m_detailMaterialManager;
  78. TerrainClipmapManager m_clipmapManager;
  79. AZ::Data::Asset<AZ::RPI::MaterialAsset> m_materialAsset;
  80. MaterialInstance m_materialInstance;
  81. AZ::Data::Instance<AZ::RPI::ShaderResourceGroup> m_terrainSrg;
  82. AZ::RHI::ShaderInputNameIndex m_worldDataIndex = "m_terrainWorldData";
  83. AzFramework::Terrain::FloatRange m_zBounds;
  84. AZ::Aabb m_dirtyRegion{ AZ::Aabb::CreateNull() };
  85. bool m_terrainBoundsNeedUpdate{ false };
  86. AZStd::vector<AZ::RPI::RenderPass*> m_passes;
  87. };
  88. }