TerrainSurfaceMaterialsListComponent.h 4.9 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 <AzCore/Component/Component.h>
  11. #include <AzCore/Component/TickBus.h>
  12. #include <AzCore/Serialization/EditContext.h>
  13. #include <Atom/RPI.Reflect/Material/MaterialAsset.h>
  14. #include <LmbrCentral/Shape/ShapeComponentBus.h>
  15. #include <SurfaceData/SurfaceDataTypes.h>
  16. #include <TerrainRenderer/TerrainAreaMaterialRequestBus.h>
  17. namespace LmbrCentral
  18. {
  19. template<typename, typename>
  20. class EditorWrappedComponentBase;
  21. }
  22. namespace Terrain
  23. {
  24. struct TerrainSurfaceMaterialMapping final
  25. {
  26. AZ_CLASS_ALLOCATOR(TerrainSurfaceMaterialMapping, AZ::SystemAllocator);
  27. AZ_RTTI(TerrainSurfaceMaterialMapping, "{37D2A586-CDDD-4FB7-A7D6-0B4CC575AB8C}");
  28. static void Reflect(AZ::ReflectContext* context);
  29. AZ::Data::Asset<AZ::RPI::MaterialAsset> m_materialAsset;
  30. AZ::Data::Instance<AZ::RPI::Material> m_materialInstance;
  31. // Surface tags not used by default material
  32. SurfaceData::SurfaceTag m_surfaceTag;
  33. SurfaceData::SurfaceTag m_previousTag;
  34. };
  35. class TerrainSurfaceMaterialsListConfig : public AZ::ComponentConfig
  36. {
  37. public:
  38. AZ_CLASS_ALLOCATOR(TerrainSurfaceMaterialsListConfig, AZ::SystemAllocator);
  39. AZ_RTTI(TerrainSurfaceMaterialsListConfig, "{68A1CB1B-C835-4C3A-8D1C-08692E07711A}", AZ::ComponentConfig);
  40. static void Reflect(AZ::ReflectContext* context);
  41. TerrainSurfaceMaterialsListConfig();
  42. TerrainSurfaceMaterialMapping m_defaultSurfaceMaterial;
  43. AZStd::vector<TerrainSurfaceMaterialMapping> m_surfaceMaterials;
  44. private:
  45. static const AZ::Edit::ElementData* GetDynamicData(const void* handlerPtr, const void* elementPtr, const AZ::Uuid& elementType);
  46. AZ::Edit::ElementData m_hideSurfaceTagData;
  47. static inline AZ::Edit::AttributeData<AZ::Crc32> m_hideAttribute{AZ::Edit::PropertyVisibility::Hide};
  48. };
  49. class TerrainSurfaceMaterialsListComponent
  50. : public AZ::Component
  51. , private TerrainAreaMaterialRequestBus::Handler
  52. , private AZ::Data::AssetBus::MultiHandler
  53. , private AZ::TickBus::Handler
  54. , private LmbrCentral::ShapeComponentNotificationsBus::Handler
  55. {
  56. public:
  57. template<typename, typename>
  58. friend class LmbrCentral::EditorWrappedComponentBase;
  59. AZ_COMPONENT(TerrainSurfaceMaterialsListComponent, "{93CF3938-FBC3-4E55-B825-27BA94A5CD35}");
  60. static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& services);
  61. static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& services);
  62. static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& services);
  63. static void Reflect(AZ::ReflectContext* context);
  64. TerrainSurfaceMaterialsListComponent(const TerrainSurfaceMaterialsListConfig& configuration);
  65. TerrainSurfaceMaterialsListComponent() = default;
  66. ~TerrainSurfaceMaterialsListComponent() = default;
  67. //////////////////////////////////////////////////////////////////////////
  68. // AZ::Component interface implementation
  69. void Activate() override;
  70. void Deactivate() override;
  71. bool ReadInConfig(const AZ::ComponentConfig* baseConfig) override;
  72. bool WriteOutConfig(AZ::ComponentConfig* outBaseConfig) const override;
  73. private:
  74. ////////////////////////////////////////////////////////////////////////
  75. // ShapeComponentNotificationsBus
  76. void OnShapeChanged(ShapeComponentNotifications::ShapeChangeReasons reasons) override;
  77. //////////////////////////////////////////////////////////////////////////
  78. // TerrainAreaMaterialRequestBus
  79. const AZ::Aabb& GetTerrainSurfaceMaterialRegion() const override;
  80. const AZStd::vector<TerrainSurfaceMaterialMapping>& GetSurfaceMaterialMappings() const override;
  81. const TerrainSurfaceMaterialMapping& GetDefaultMaterial() const override;
  82. //////////////////////////////////////////////////////////////////////////
  83. // AZ::TickBus::Handler
  84. void OnTick(float deltaTime, AZ::ScriptTimePoint time) override;
  85. //////////////////////////////////////////////////////////////////////////
  86. // AZ::Data::AssetBus::Handler
  87. void OnAssetReady(AZ::Data::Asset<AZ::Data::AssetData> asset) override;
  88. void OnAssetReloaded(AZ::Data::Asset<AZ::Data::AssetData> asset) override;
  89. void OnAssetReadyPostTick(AZ::Data::Asset<AZ::Data::AssetData> asset);
  90. void OnAssetReloadedPostTick(AZ::Data::Asset<AZ::Data::AssetData> asset);
  91. TerrainSurfaceMaterialsListConfig m_configuration;
  92. AZ::Aabb m_cachedAabb{ AZ::Aabb::CreateNull() };
  93. };
  94. } // namespace Terrain