From 701b7a55e6e308b15c4ec258efc21d774e666d4b Mon Sep 17 00:00:00 2001 From: Sergey Pereslavtsev Date: Tue, 8 Feb 2022 12:43:40 +0000 Subject: [PATCH] PR feedback addressing Signed-off-by: Sergey Pereslavtsev --- .../TerrainPhysicsColliderComponent.cpp | 61 ------------------ .../TerrainPhysicsColliderComponent.h | 10 +-- .../TerrainSurfaceGradientListComponent.cpp | 62 ------------------- .../TerrainSurfaceGradientListComponent.h | 6 +- .../EditorTerrainPhysicsColliderComponent.cpp | 54 ++++++++++++++-- .../EditorTerrainPhysicsColliderComponent.h | 8 +-- ...torTerrainSurfaceGradientListComponent.cpp | 53 ++++++++++++++-- ...ditorTerrainSurfaceGradientListComponent.h | 8 +-- .../EditorSelectableTagListProvider.cpp | 31 ---------- .../Source/EditorSelectableTagListProvider.h | 26 -------- .../Source/EditorSurfaceTagListProvider.cpp | 43 +++++++++++++ .../Source/EditorSurfaceTagListProvider.h | 29 +++++++++ .../Code/terrain_editor_shared_files.cmake | 4 +- 13 files changed, 190 insertions(+), 205 deletions(-) delete mode 100644 Gems/Terrain/Code/Source/EditorSelectableTagListProvider.cpp delete mode 100644 Gems/Terrain/Code/Source/EditorSelectableTagListProvider.h create mode 100644 Gems/Terrain/Code/Source/EditorSurfaceTagListProvider.cpp create mode 100644 Gems/Terrain/Code/Source/EditorSurfaceTagListProvider.h diff --git a/Gems/Terrain/Code/Source/Components/TerrainPhysicsColliderComponent.cpp b/Gems/Terrain/Code/Source/Components/TerrainPhysicsColliderComponent.cpp index ecc91d06ff..a0689ec23a 100644 --- a/Gems/Terrain/Code/Source/Components/TerrainPhysicsColliderComponent.cpp +++ b/Gems/Terrain/Code/Source/Components/TerrainPhysicsColliderComponent.cpp @@ -17,13 +17,11 @@ #include #include #include -#include #include #include #include -#include namespace Terrain { @@ -35,52 +33,9 @@ namespace Terrain ->Version(1) ->Field("Surface", &TerrainPhysicsSurfaceMaterialMapping::m_surfaceTag) ->Field("Material", &TerrainPhysicsSurfaceMaterialMapping::m_materialId); - - if (auto edit = serialize->GetEditContext()) - { - edit->Class( - "Terrain Surface Material Mapping", "Mapping between a surface and a physics material.") - - ->ClassElement(AZ::Edit::ClassElements::EditorData, "") - ->Attribute(AZ::Edit::Attributes::AutoExpand, true) - ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::Show) - - ->DataElement( - AZ::Edit::UIHandlers::ComboBox, &TerrainPhysicsSurfaceMaterialMapping::m_surfaceTag, "Surface Tag", - "Surface type to map to a physics material.") - ->Attribute(AZ::Edit::Attributes::EnumValues, &TerrainPhysicsSurfaceMaterialMapping::BuildSelectableTagList) - - ->DataElement(AZ::Edit::UIHandlers::Default, &TerrainPhysicsSurfaceMaterialMapping::m_materialId, "Material ID", "") - ->ElementAttribute(Physics::Attributes::MaterialLibraryAssetId, &TerrainPhysicsSurfaceMaterialMapping::GetMaterialLibraryId) - ->Attribute(AZ::Edit::Attributes::AutoExpand, true) - ->Attribute(AZ::Edit::Attributes::ShowProductAssetFileName, true); - } - } - } - - AZStd::vector> TerrainPhysicsSurfaceMaterialMapping::BuildSelectableTagList() const - { - AZ_PROFILE_FUNCTION(Entity); - - if (m_tagListProvider) - { - AZStd::vector> selectableTags = AZStd::move(m_tagListProvider->BuildSelectableTagList()); - - // Insert the tag currently in use by this mapping - selectableTags.push_back({ m_surfaceTag, m_surfaceTag.GetDisplayName() }); - - // Sorting for consistency - AZStd::sort(selectableTags.begin(), selectableTags.end(), [](const auto& lhs, const auto& rhs) {return lhs.second < rhs.second; }); - return selectableTags; } - - return SurfaceData::SurfaceTag::GetRegisteredTags(); } - void TerrainPhysicsSurfaceMaterialMapping::SetTagListProvider(const EditorSelectableTagListProvider* tagListProvider) - { - m_tagListProvider = tagListProvider; - } AZ::Data::AssetId TerrainPhysicsSurfaceMaterialMapping::GetMaterialLibraryId() { @@ -105,22 +60,6 @@ namespace Terrain ->Field("DefaultMaterial", &TerrainPhysicsColliderConfig::m_defaultMaterialSelection) ->Field("Mappings", &TerrainPhysicsColliderConfig::m_surfaceMaterialMappings) ; - - if (auto edit = serialize->GetEditContext()) - { - edit->Class( - "Terrain Physics Collider Component", - "Provides terrain data to a physics collider with configurable surface mappings.") - ->ClassElement(AZ::Edit::ClassElements::EditorData, "") - ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) - ->Attribute(AZ::Edit::Attributes::AutoExpand, true) - ->DataElement(AZ::Edit::UIHandlers::Default, &TerrainPhysicsColliderConfig::m_defaultMaterialSelection, - "Default Surface Physics Material", "Select a material to be used by unmapped surfaces by default") - ->DataElement( - AZ::Edit::UIHandlers::Default, &TerrainPhysicsColliderConfig::m_surfaceMaterialMappings, - "Surface to Material Mappings", "Maps surfaces to physics materials") - ; - } } } diff --git a/Gems/Terrain/Code/Source/Components/TerrainPhysicsColliderComponent.h b/Gems/Terrain/Code/Source/Components/TerrainPhysicsColliderComponent.h index 97b5e49fca..2bd0e95769 100644 --- a/Gems/Terrain/Code/Source/Components/TerrainPhysicsColliderComponent.h +++ b/Gems/Terrain/Code/Source/Components/TerrainPhysicsColliderComponent.h @@ -25,7 +25,7 @@ namespace LmbrCentral namespace Terrain { - class EditorSelectableTagListProvider; + class EditorSurfaceTagListProvider; static const uint8_t InvalidSurfaceTagIndex = 0xFF; @@ -35,15 +35,16 @@ namespace Terrain AZ_CLASS_ALLOCATOR(TerrainPhysicsSurfaceMaterialMapping, AZ::SystemAllocator, 0); AZ_RTTI(TerrainPhysicsSurfaceMaterialMapping, "{A88B5289-DFCD-4564-8395-E2177DFE5B18}"); static void Reflect(AZ::ReflectContext* context); + static AZ::Data::AssetId GetMaterialLibraryId(); + AZStd::vector> BuildSelectableTagList() const; - void SetTagListProvider(const EditorSelectableTagListProvider* tagListProvider); + void SetTagListProvider(const EditorSurfaceTagListProvider* tagListProvider); SurfaceData::SurfaceTag m_surfaceTag; Physics::MaterialId m_materialId; private: - static AZ::Data::AssetId GetMaterialLibraryId(); - const EditorSelectableTagListProvider* m_tagListProvider = nullptr; + const EditorSurfaceTagListProvider* m_tagListProvider = nullptr; }; class TerrainPhysicsColliderConfig @@ -53,6 +54,7 @@ namespace Terrain AZ_CLASS_ALLOCATOR(TerrainPhysicsColliderConfig, AZ::SystemAllocator, 0); AZ_RTTI(TerrainPhysicsColliderConfig, "{E9EADB8F-C3A5-4B9C-A62D-2DBC86B4CE59}", AZ::ComponentConfig); static void Reflect(AZ::ReflectContext* context); + Physics::MaterialSelection m_defaultMaterialSelection; AZStd::vector m_surfaceMaterialMappings; }; diff --git a/Gems/Terrain/Code/Source/Components/TerrainSurfaceGradientListComponent.cpp b/Gems/Terrain/Code/Source/Components/TerrainSurfaceGradientListComponent.cpp index 64b5d36a8f..a93bda1872 100644 --- a/Gems/Terrain/Code/Source/Components/TerrainSurfaceGradientListComponent.cpp +++ b/Gems/Terrain/Code/Source/Components/TerrainSurfaceGradientListComponent.cpp @@ -11,11 +11,9 @@ #include #include #include -#include #include #include -#include namespace Terrain { @@ -28,27 +26,6 @@ namespace Terrain ->Field("Gradient Entity", &TerrainSurfaceGradientMapping::m_gradientEntityId) ->Field("Surface Tag", &TerrainSurfaceGradientMapping::m_surfaceTag) ; - - if (auto edit = serialize->GetEditContext()) - { - edit->Class("Terrain Surface Gradient Mapping", "Mapping between a gradient and a surface.") - ->ClassElement(AZ::Edit::ClassElements::EditorData, "") - ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::Show) - ->Attribute(AZ::Edit::Attributes::AutoExpand, true) - - ->DataElement( - AZ::Edit::UIHandlers::Default, &TerrainSurfaceGradientMapping::m_gradientEntityId, - "Gradient Entity", "ID of Entity providing a gradient.") - ->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ::Edit::PropertyRefreshLevels::AttributesAndValues) - ->UIElement("GradientPreviewer", "Previewer") - ->Attribute(AZ::Edit::Attributes::NameLabelOverride, "") - ->Attribute(AZ_CRC_CE("GradientEntity"), &TerrainSurfaceGradientMapping::m_gradientEntityId) - ->DataElement( - AZ::Edit::UIHandlers::Default, &TerrainSurfaceGradientMapping::m_surfaceTag, "Surface Tag", - "Surface type to map to this gradient.") - ->Attribute(AZ::Edit::Attributes::EnumValues, &TerrainSurfaceGradientMapping::BuildSelectableTagList) - ; - } } if (auto behaviorContext = azrtti_cast(context)) @@ -63,30 +40,6 @@ namespace Terrain } } - AZStd::vector> TerrainSurfaceGradientMapping::BuildSelectableTagList() const - { - AZ_PROFILE_FUNCTION(Entity); - - if (m_tagListProvider) - { - AZStd::vector> selectableTags = AZStd::move(m_tagListProvider->BuildSelectableTagList()); - - // Insert the tag currently in use by this mapping - selectableTags.push_back({ m_surfaceTag, m_surfaceTag.GetDisplayName() }); - - // Sorting for consistency - AZStd::sort(selectableTags.begin(), selectableTags.end(), [](const auto& lhs, const auto& rhs) {return lhs.second < rhs.second; }); - return selectableTags; - } - - return SurfaceData::SurfaceTag::GetRegisteredTags(); - } - - void TerrainSurfaceGradientMapping::SetTagListProvider(const EditorSelectableTagListProvider* tagListProvider) - { - m_tagListProvider = tagListProvider; - } - void TerrainSurfaceGradientListConfig::Reflect(AZ::ReflectContext* context) { TerrainSurfaceGradientMapping::Reflect(context); @@ -98,21 +51,6 @@ namespace Terrain ->Version(1) ->Field("Mappings", &TerrainSurfaceGradientListConfig::m_gradientSurfaceMappings) ; - - AZ::EditContext* edit = serialize->GetEditContext(); - if (edit) - { - edit->Class( - "Terrain Surface Gradient List Component", "Provide mapping between gradients and surfaces.") - ->ClassElement(AZ::Edit::ClassElements::EditorData, "") - ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::Show) - ->Attribute(AZ::Edit::Attributes::AutoExpand, true) - - ->DataElement( - AZ::Edit::UIHandlers::Default, &TerrainSurfaceGradientListConfig::m_gradientSurfaceMappings, - "Gradient to Surface Mappings", "Maps Gradient Entities to Surfaces.") - ; - } } } diff --git a/Gems/Terrain/Code/Source/Components/TerrainSurfaceGradientListComponent.h b/Gems/Terrain/Code/Source/Components/TerrainSurfaceGradientListComponent.h index b2f41fae88..fd6c16d30d 100644 --- a/Gems/Terrain/Code/Source/Components/TerrainSurfaceGradientListComponent.h +++ b/Gems/Terrain/Code/Source/Components/TerrainSurfaceGradientListComponent.h @@ -25,7 +25,7 @@ namespace LmbrCentral namespace Terrain { - class EditorSelectableTagListProvider; + class EditorSurfaceTagListProvider; class TerrainSurfaceGradientMapping final { @@ -42,13 +42,13 @@ namespace Terrain } AZStd::vector> BuildSelectableTagList() const; - void SetTagListProvider(const EditorSelectableTagListProvider* tagListProvider); + void SetTagListProvider(const EditorSurfaceTagListProvider* tagListProvider); AZ::EntityId m_gradientEntityId; SurfaceData::SurfaceTag m_surfaceTag; private: - const EditorSelectableTagListProvider* m_tagListProvider = nullptr; + const EditorSurfaceTagListProvider* m_tagListProvider = nullptr; }; class TerrainSurfaceGradientListConfig : public AZ::ComponentConfig diff --git a/Gems/Terrain/Code/Source/EditorComponents/EditorTerrainPhysicsColliderComponent.cpp b/Gems/Terrain/Code/Source/EditorComponents/EditorTerrainPhysicsColliderComponent.cpp index 09f99fd7fe..5f76b7de6a 100644 --- a/Gems/Terrain/Code/Source/EditorComponents/EditorTerrainPhysicsColliderComponent.cpp +++ b/Gems/Terrain/Code/Source/EditorComponents/EditorTerrainPhysicsColliderComponent.cpp @@ -20,6 +20,43 @@ namespace Terrain &LmbrCentral::EditorWrappedComponentBaseVersionConverter ); + + if (auto serialize = azrtti_cast(context)) + { + if (auto edit = serialize->GetEditContext()) + { + edit->Class( + "Terrain Surface Material Mapping", "Mapping between a surface and a physics material.") + + ->ClassElement(AZ::Edit::ClassElements::EditorData, "") + ->Attribute(AZ::Edit::Attributes::AutoExpand, true) + ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::Show) + + ->DataElement( + AZ::Edit::UIHandlers::ComboBox, &TerrainPhysicsSurfaceMaterialMapping::m_surfaceTag, "Surface Tag", + "Surface type to map to a physics material.") + ->Attribute(AZ::Edit::Attributes::EnumValues, &TerrainPhysicsSurfaceMaterialMapping::BuildSelectableTagList) + + ->DataElement(AZ::Edit::UIHandlers::Default, &TerrainPhysicsSurfaceMaterialMapping::m_materialId, "Material ID", "") + ->ElementAttribute(Physics::Attributes::MaterialLibraryAssetId, &TerrainPhysicsSurfaceMaterialMapping::GetMaterialLibraryId) + ->Attribute(AZ::Edit::Attributes::AutoExpand, true) + ->Attribute(AZ::Edit::Attributes::ShowProductAssetFileName, true) + ; + + edit->Class( + "Terrain Physics Collider Component", + "Provides terrain data to a physics collider with configurable surface mappings.") + ->ClassElement(AZ::Edit::ClassElements::EditorData, "") + ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) + ->Attribute(AZ::Edit::Attributes::AutoExpand, true) + ->DataElement(AZ::Edit::UIHandlers::Default, &TerrainPhysicsColliderConfig::m_defaultMaterialSelection, + "Default Surface Physics Material", "Select a material to be used by unmapped surfaces by default") + ->DataElement( + AZ::Edit::UIHandlers::Default, &TerrainPhysicsColliderConfig::m_surfaceMaterialMappings, + "Surface to Material Mappings", "Maps surfaces to physics materials") + ; + } + } } void EditorTerrainPhysicsColliderComponent::Activate() @@ -28,14 +65,13 @@ namespace Terrain BaseClassType::Activate(); } - AZStd::unordered_set EditorTerrainPhysicsColliderComponent::GetSurfaceTagsInUse() const + AZStd::unordered_set EditorTerrainPhysicsColliderComponent::GetSurfaceTagsInUse() const { - AZStd::unordered_set tagsInUse; + AZStd::unordered_set tagsInUse; for (const TerrainPhysicsSurfaceMaterialMapping& mapping : m_configuration.m_surfaceMaterialMappings) { - AZ::u32 crc = mapping.m_surfaceTag; - tagsInUse.insert(crc); + tagsInUse.insert(mapping.m_surfaceTag); } return AZStd::move(tagsInUse); @@ -55,4 +91,14 @@ namespace Terrain } } + AZStd::vector> TerrainPhysicsSurfaceMaterialMapping::BuildSelectableTagList() const + { + AZ_PROFILE_FUNCTION(Entity); + return AZStd::move(Terrain::BuildSelectableTagList(m_tagListProvider, m_surfaceTag)); + } + + void TerrainPhysicsSurfaceMaterialMapping::SetTagListProvider(const EditorSurfaceTagListProvider* tagListProvider) + { + m_tagListProvider = tagListProvider; + } } diff --git a/Gems/Terrain/Code/Source/EditorComponents/EditorTerrainPhysicsColliderComponent.h b/Gems/Terrain/Code/Source/EditorComponents/EditorTerrainPhysicsColliderComponent.h index fb724507d6..fca8e52246 100644 --- a/Gems/Terrain/Code/Source/EditorComponents/EditorTerrainPhysicsColliderComponent.h +++ b/Gems/Terrain/Code/Source/EditorComponents/EditorTerrainPhysicsColliderComponent.h @@ -11,13 +11,13 @@ #include #include #include -#include +#include namespace Terrain { class EditorTerrainPhysicsColliderComponent : public LmbrCentral::EditorWrappedComponentBase - , public EditorSelectableTagListProvider + , public EditorSurfaceTagListProvider { public: using BaseClassType = LmbrCentral::EditorWrappedComponentBase; @@ -35,8 +35,8 @@ namespace Terrain static constexpr auto s_helpUrl = ""; private: - // EditorSelectableTagListProvider interface implementation - AZStd::unordered_set GetSurfaceTagsInUse() const override; + // EditorSurfaceTagListProvider interface implementation + AZStd::unordered_set GetSurfaceTagsInUse() const override; AZ::u32 ConfigurationChanged() override; void UpdateConfigurationTagProvider(); diff --git a/Gems/Terrain/Code/Source/EditorComponents/EditorTerrainSurfaceGradientListComponent.cpp b/Gems/Terrain/Code/Source/EditorComponents/EditorTerrainSurfaceGradientListComponent.cpp index 50d45d6cf0..0ea51f282b 100644 --- a/Gems/Terrain/Code/Source/EditorComponents/EditorTerrainSurfaceGradientListComponent.cpp +++ b/Gems/Terrain/Code/Source/EditorComponents/EditorTerrainSurfaceGradientListComponent.cpp @@ -19,6 +19,41 @@ namespace Terrain &LmbrCentral::EditorWrappedComponentBaseVersionConverter ); + + if (auto serialize = azrtti_cast(context)) + { + if (auto edit = serialize->GetEditContext()) + { + edit->Class("Terrain Surface Gradient Mapping", "Mapping between a gradient and a surface.") + ->ClassElement(AZ::Edit::ClassElements::EditorData, "") + ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::Show) + ->Attribute(AZ::Edit::Attributes::AutoExpand, true) + + ->DataElement( + AZ::Edit::UIHandlers::Default, &TerrainSurfaceGradientMapping::m_gradientEntityId, + "Gradient Entity", "ID of Entity providing a gradient.") + ->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ::Edit::PropertyRefreshLevels::AttributesAndValues) + ->UIElement("GradientPreviewer", "Previewer") + ->Attribute(AZ::Edit::Attributes::NameLabelOverride, "") + ->Attribute(AZ_CRC_CE("GradientEntity"), &TerrainSurfaceGradientMapping::m_gradientEntityId) + ->DataElement( + AZ::Edit::UIHandlers::Default, &TerrainSurfaceGradientMapping::m_surfaceTag, "Surface Tag", + "Surface type to map to this gradient.") + ->Attribute(AZ::Edit::Attributes::EnumValues, &TerrainSurfaceGradientMapping::BuildSelectableTagList) + ; + + edit->Class( + "Terrain Surface Gradient List Component", "Provide mapping between gradients and surfaces.") + ->ClassElement(AZ::Edit::ClassElements::EditorData, "") + ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::Show) + ->Attribute(AZ::Edit::Attributes::AutoExpand, true) + + ->DataElement( + AZ::Edit::UIHandlers::Default, &TerrainSurfaceGradientListConfig::m_gradientSurfaceMappings, + "Gradient to Surface Mappings", "Maps Gradient Entities to Surfaces.") + ; + } + } } void EditorTerrainSurfaceGradientListComponent::Activate() @@ -41,16 +76,26 @@ namespace Terrain } } - AZStd::unordered_set EditorTerrainSurfaceGradientListComponent::GetSurfaceTagsInUse() const + AZStd::unordered_set EditorTerrainSurfaceGradientListComponent::GetSurfaceTagsInUse() const { - AZStd::unordered_set tagsInUse; + AZStd::unordered_set tagsInUse; for (const TerrainSurfaceGradientMapping& mapping : m_configuration.m_gradientSurfaceMappings) { - AZ::u32 crc = mapping.m_surfaceTag; - tagsInUse.insert(crc); + tagsInUse.insert(mapping.m_surfaceTag); } return AZStd::move(tagsInUse); } + + AZStd::vector> TerrainSurfaceGradientMapping::BuildSelectableTagList() const + { + AZ_PROFILE_FUNCTION(Entity); + return AZStd::move(Terrain::BuildSelectableTagList(m_tagListProvider, m_surfaceTag)); + } + + void TerrainSurfaceGradientMapping::SetTagListProvider(const EditorSurfaceTagListProvider* tagListProvider) + { + m_tagListProvider = tagListProvider; + } } diff --git a/Gems/Terrain/Code/Source/EditorComponents/EditorTerrainSurfaceGradientListComponent.h b/Gems/Terrain/Code/Source/EditorComponents/EditorTerrainSurfaceGradientListComponent.h index 37fafdc0a9..bcd5d84c38 100644 --- a/Gems/Terrain/Code/Source/EditorComponents/EditorTerrainSurfaceGradientListComponent.h +++ b/Gems/Terrain/Code/Source/EditorComponents/EditorTerrainSurfaceGradientListComponent.h @@ -11,13 +11,13 @@ #include #include #include -#include +#include namespace Terrain { class EditorTerrainSurfaceGradientListComponent : public LmbrCentral::EditorWrappedComponentBase - , public EditorSelectableTagListProvider + , public EditorSurfaceTagListProvider { public: using BaseClassType = LmbrCentral::EditorWrappedComponentBase; @@ -35,8 +35,8 @@ namespace Terrain static constexpr const char* const s_helpUrl = "https://o3de.org/docs/user-guide/components/reference/terrain/surface-gradient-list/"; private: - // EditorSelectableTagListProvider interface implementation - AZStd::unordered_set GetSurfaceTagsInUse() const override; + // EditorSurfaceTagListProvider interface implementation + AZStd::unordered_set GetSurfaceTagsInUse() const override; AZ::u32 ConfigurationChanged() override; void UpdateConfigurationTagProvider(); diff --git a/Gems/Terrain/Code/Source/EditorSelectableTagListProvider.cpp b/Gems/Terrain/Code/Source/EditorSelectableTagListProvider.cpp deleted file mode 100644 index 82ea70158c..0000000000 --- a/Gems/Terrain/Code/Source/EditorSelectableTagListProvider.cpp +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - -#pragma once - -#include -#include - -namespace Terrain -{ - AZStd::vector> EditorSelectableTagListProvider::BuildSelectableTagList() const - { - AZStd::vector> availableTags = SurfaceData::SurfaceTag::GetRegisteredTags(); - - AZStd::unordered_set tagsInUse = AZStd::move(GetSurfaceTagsInUse()); - - // Filter out all tags in use from the list of registered tags - availableTags.erase(std::remove_if(availableTags.begin(), availableTags.end(), - [&tagsInUse](const auto& tag)-> bool - { - return tagsInUse.contains(tag.first); - }), availableTags.end()); - - return AZStd::move(availableTags); - } -} diff --git a/Gems/Terrain/Code/Source/EditorSelectableTagListProvider.h b/Gems/Terrain/Code/Source/EditorSelectableTagListProvider.h deleted file mode 100644 index d8640bd73f..0000000000 --- a/Gems/Terrain/Code/Source/EditorSelectableTagListProvider.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - -#pragma once -#include -#include -#include - -namespace Terrain -{ - //! Interface for a class providing information about surface tags available for selecting in Editor components. - class EditorSelectableTagListProvider - { - public: - //! Returns a list of available tags to be selected in the component. - virtual AZStd::vector> BuildSelectableTagList() const; - - //! Returns a set of CRC of all surface tags currently in use and not available for selecting. - virtual AZStd::unordered_set GetSurfaceTagsInUse() const = 0; - }; -} diff --git a/Gems/Terrain/Code/Source/EditorSurfaceTagListProvider.cpp b/Gems/Terrain/Code/Source/EditorSurfaceTagListProvider.cpp new file mode 100644 index 0000000000..aa4a666d1b --- /dev/null +++ b/Gems/Terrain/Code/Source/EditorSurfaceTagListProvider.cpp @@ -0,0 +1,43 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#pragma once + +#include +#include + + +namespace Terrain +{ + AZStd::vector> BuildSelectableTagList(const EditorSurfaceTagListProvider* tagListProvider, + const SurfaceData::SurfaceTag& currentTag) + { + AZStd::vector> availableTags = SurfaceData::SurfaceTag::GetRegisteredTags(); + + AZStd::unordered_set tagsInUse; + + if (tagListProvider) + { + tagsInUse = AZStd::move(tagListProvider->GetSurfaceTagsInUse()); + + // Filter out all tags in use from the list of registered tags + AZStd::erase_if(availableTags, [&tagsInUse](const auto& tag)-> bool + { + return tagsInUse.contains(SurfaceData::SurfaceTag(tag.first)); + }); + } + + // Insert the current tag back if it was removed via tagsInUse + availableTags.emplace_back({ AZ::u32(currentTag), currentTag.GetDisplayName() }); + + // Sorting for consistency + AZStd::sort(availableTags.begin(), availableTags.end(), [](const auto& lhs, const auto& rhs) {return lhs.second < rhs.second; }); + + return AZStd::move(availableTags); + } +} diff --git a/Gems/Terrain/Code/Source/EditorSurfaceTagListProvider.h b/Gems/Terrain/Code/Source/EditorSurfaceTagListProvider.h new file mode 100644 index 0000000000..ed5a5c1c0a --- /dev/null +++ b/Gems/Terrain/Code/Source/EditorSurfaceTagListProvider.h @@ -0,0 +1,29 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#pragma once +#include +#include +#include +#include + +namespace Terrain +{ + //! Interface for a class providing information about surface tags available for selecting in Editor components. + class EditorSurfaceTagListProvider + { + public: + //! Returns a set of all surface tags currently in use that won't be available for selecting. + virtual AZStd::unordered_set GetSurfaceTagsInUse() const = 0; + }; + + //! Returns a list of available tags to be selected in the component. + AZStd::vector> BuildSelectableTagList( + const EditorSurfaceTagListProvider* tagListProvider, + const SurfaceData::SurfaceTag& currentTag); +} diff --git a/Gems/Terrain/Code/terrain_editor_shared_files.cmake b/Gems/Terrain/Code/terrain_editor_shared_files.cmake index deb70ba566..ed64b7c4fc 100644 --- a/Gems/Terrain/Code/terrain_editor_shared_files.cmake +++ b/Gems/Terrain/Code/terrain_editor_shared_files.cmake @@ -25,8 +25,8 @@ set(FILES Source/EditorComponents/EditorTerrainSystemComponent.h Source/EditorTerrainModule.cpp Source/EditorTerrainModule.h - Source/EditorSelectableTagListProvider.h - Source/EditorSelectableTagListProvider.cpp + Source/EditorSurfaceTagListProvider.h + Source/EditorSurfaceTagListProvider.cpp Source/TerrainModule.cpp Source/TerrainModule.h Source/TerrainRenderer/EditorComponents/EditorTerrainSurfaceMaterialsListComponent.cpp