From 9aece3e84bcc5cc48c5af5177942b4f274c5d558 Mon Sep 17 00:00:00 2001 From: Sergey Pereslavtsev Date: Fri, 4 Feb 2022 19:57:29 +0000 Subject: [PATCH] LYN-8403 Prevent the same Surface Tag from getting reused Signed-off-by: Sergey Pereslavtsev --- .../PropertyEditorAPI_Internals.h | 10 +++++ .../PropertyEditorAPI_Internals_Impl.h | 45 ++++++++++++++----- .../PropertyEnumComboBoxCtrl.hxx | 6 +++ .../Code/Include/SurfaceData/SurfaceTag.h | 7 +-- .../TerrainPhysicsColliderComponent.cpp | 29 ++++++++++++ .../TerrainPhysicsColliderComponent.h | 5 +++ .../TerrainSurfaceGradientListComponent.cpp | 27 +++++++++++ .../TerrainSurfaceGradientListComponent.h | 8 ++++ .../EditorTerrainPhysicsColliderComponent.cpp | 34 ++++++++++++++ .../EditorTerrainPhysicsColliderComponent.h | 12 +++++ ...torTerrainSurfaceGradientListComponent.cpp | 33 ++++++++++++++ ...ditorTerrainSurfaceGradientListComponent.h | 12 +++++ .../EditorSelectableTagListProvider.cpp | 31 +++++++++++++ .../Source/EditorSelectableTagListProvider.h | 26 +++++++++++ .../Code/terrain_editor_shared_files.cmake | 2 + 15 files changed, 274 insertions(+), 13 deletions(-) create mode 100644 Gems/Terrain/Code/Source/EditorSelectableTagListProvider.cpp create mode 100644 Gems/Terrain/Code/Source/EditorSelectableTagListProvider.h diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyEditorAPI_Internals.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyEditorAPI_Internals.h index ecd27baed4..f1ddc2268d 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyEditorAPI_Internals.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyEditorAPI_Internals.h @@ -154,6 +154,16 @@ namespace AzToolsFramework (void)debugName; } + // provides an option to specify reading parent element attributes. + // This allows parent elements to override attributes of their children if needed. + virtual void ConsumeParentAttribute(WidgetType* widget, AZ::u32 attrib, PropertyAttributeReader* attrValue, const char* debugName) + { + (void)widget; + (void)attrib; + (void)attrValue; + (void)debugName; + } + // override GetFirstInTabOrder, GetLastInTabOrder in your base class to define which widget gets focus first when pressing tab, // and also what widget is last. // for example, if your widget is a compound widget and contains, say, 5 buttons diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyEditorAPI_Internals_Impl.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyEditorAPI_Internals_Impl.h index 2ebacfa558..ec428de951 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyEditorAPI_Internals_Impl.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyEditorAPI_Internals_Impl.h @@ -40,7 +40,14 @@ namespace AzToolsFramework } void* classInstance = parent->FirstInstance(); // pointer to the owner class so we can read member variables and functions - auto consumeAttributes = [&](const auto& attributes, const char* name) + + void* parentClassInstance = nullptr; + if (InstanceDataNode* parentInstanceDataNode = parent->GetParent()) + { + parentClassInstance = parentInstanceDataNode->FirstInstance(); + } + + auto consumeAttributes = [this, classInstance, wid](const auto& attributes, const char* name) { for (size_t i = 0; i < attributes.size(); ++i) { @@ -50,25 +57,43 @@ namespace AzToolsFramework } }; + auto consumeParentAttributes = [this, parentClassInstance, wid](const auto& attributes, const char* name) + { + if (parentClassInstance) + { + for (size_t i = 0; i < attributes.size(); ++i) + { + const auto& attrPair = attributes[i]; + PropertyAttributeReader reader(parentClassInstance, &*attrPair.second); + ConsumeParentAttribute(wid, attrPair.first, &reader, name); + } + } + }; + const AZ::SerializeContext::ClassElement* element = dataNode->GetElementMetadata(); if (element) { consumeAttributes(element->m_attributes, element->m_name); - const AZ::Edit::ElementData* elementEdit = dataNode->GetElementEditMetadata(); - if (elementEdit) + + if (const AZ::Edit::ElementData* elementEdit = dataNode->GetElementEditMetadata(); + elementEdit != nullptr) { consumeAttributes(elementEdit->m_attributes, elementEdit->m_name); } - } - if (dataNode->GetClassMetadata()) - { - const AZ::Edit::ClassData* classEditData = dataNode->GetClassMetadata()->m_editData; - if (classEditData) + const AZ::SerializeContext::ClassElement* parentElement = parent != dataNode ? + dataNode->GetElementMetadata() : + nullptr; + + if (parentElement != nullptr) { - for (auto it = classEditData->m_elements.begin(); it != classEditData->m_elements.end(); ++it) + // Reuse the current instance element name for the debug name + consumeParentAttributes(parentElement->m_attributes, element->m_name); + + if (const AZ::Edit::ElementData* elementEdit = parent->GetElementEditMetadata(); + elementEdit != nullptr) { - consumeAttributes(it->m_attributes, it->m_name); + consumeParentAttributes(elementEdit->m_attributes, elementEdit->m_name); } } } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyEnumComboBoxCtrl.hxx b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyEnumComboBoxCtrl.hxx index 206b972b37..fc1d24b7a5 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyEnumComboBoxCtrl.hxx +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyEnumComboBoxCtrl.hxx @@ -66,6 +66,12 @@ namespace AzToolsFramework class GenericEnumPropertyComboBoxHandler : public GenericComboBoxHandler { + virtual void ConsumeParentAttribute(GenericComboBoxCtrlBase* GUI, AZ::u32 attrib, PropertyAttributeReader* attrValue, const char* debugName) override + { + // Simply re-route to ConsumeAttribute since no special logic is needed. + ConsumeAttribute(GUI, attrib, attrValue, debugName); + } + virtual void ConsumeAttribute(GenericComboBoxCtrlBase* GUI, AZ::u32 attrib, PropertyAttributeReader* attrValue, const char* debugName) override { (void)debugName; diff --git a/Gems/SurfaceData/Code/Include/SurfaceData/SurfaceTag.h b/Gems/SurfaceData/Code/Include/SurfaceData/SurfaceTag.h index d16856995d..ab24ba09f0 100644 --- a/Gems/SurfaceData/Code/Include/SurfaceData/SurfaceTag.h +++ b/Gems/SurfaceData/Code/Include/SurfaceData/SurfaceTag.h @@ -19,7 +19,8 @@ namespace SurfaceData { public: AZ_CLASS_ALLOCATOR(SurfaceTag, AZ::SystemAllocator, 0); - AZ_RTTI(SurfaceTag, "{67C8C6ED-F32A-443E-A777-1CAE48B22CD7}"); + AZ_TYPE_INFO(SurfaceTag, "{67C8C6ED-F32A-443E-A777-1CAE48B22CD7}"); + static void Reflect(AZ::ReflectContext* context); SurfaceTag() @@ -47,6 +48,8 @@ namespace SurfaceData m_surfaceTagCrc = AZ::Crc32(value.data()); } + AZStd::string GetDisplayName() const; + static AZStd::vector> GetRegisteredTags(); private: @@ -54,8 +57,6 @@ namespace SurfaceData AZStd::vector> BuildSelectableTagList() const; - AZStd::string GetDisplayName() const; - AZ::u32 m_surfaceTagCrc; }; diff --git a/Gems/Terrain/Code/Source/Components/TerrainPhysicsColliderComponent.cpp b/Gems/Terrain/Code/Source/Components/TerrainPhysicsColliderComponent.cpp index d70915a861..23134e663d 100644 --- a/Gems/Terrain/Code/Source/Components/TerrainPhysicsColliderComponent.cpp +++ b/Gems/Terrain/Code/Source/Components/TerrainPhysicsColliderComponent.cpp @@ -17,11 +17,14 @@ #include #include #include +#include #include #include #include +#include + namespace Terrain { void TerrainPhysicsSurfaceMaterialMapping::Reflect(AZ::ReflectContext* context) @@ -45,6 +48,8 @@ namespace Terrain ->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) @@ -53,6 +58,30 @@ namespace Terrain } } + 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() { if (const auto* physicsSystem = AZ::Interface::Get()) diff --git a/Gems/Terrain/Code/Source/Components/TerrainPhysicsColliderComponent.h b/Gems/Terrain/Code/Source/Components/TerrainPhysicsColliderComponent.h index 5f79fa9103..97b5e49fca 100644 --- a/Gems/Terrain/Code/Source/Components/TerrainPhysicsColliderComponent.h +++ b/Gems/Terrain/Code/Source/Components/TerrainPhysicsColliderComponent.h @@ -25,6 +25,8 @@ namespace LmbrCentral namespace Terrain { + class EditorSelectableTagListProvider; + static const uint8_t InvalidSurfaceTagIndex = 0xFF; struct TerrainPhysicsSurfaceMaterialMapping final @@ -33,12 +35,15 @@ namespace Terrain AZ_CLASS_ALLOCATOR(TerrainPhysicsSurfaceMaterialMapping, AZ::SystemAllocator, 0); AZ_RTTI(TerrainPhysicsSurfaceMaterialMapping, "{A88B5289-DFCD-4564-8395-E2177DFE5B18}"); static void Reflect(AZ::ReflectContext* context); + AZStd::vector> BuildSelectableTagList() const; + void SetTagListProvider(const EditorSelectableTagListProvider* tagListProvider); SurfaceData::SurfaceTag m_surfaceTag; Physics::MaterialId m_materialId; private: static AZ::Data::AssetId GetMaterialLibraryId(); + const EditorSelectableTagListProvider* m_tagListProvider = nullptr; }; class TerrainPhysicsColliderConfig diff --git a/Gems/Terrain/Code/Source/Components/TerrainSurfaceGradientListComponent.cpp b/Gems/Terrain/Code/Source/Components/TerrainSurfaceGradientListComponent.cpp index 7d41b829c1..64b5d36a8f 100644 --- a/Gems/Terrain/Code/Source/Components/TerrainSurfaceGradientListComponent.cpp +++ b/Gems/Terrain/Code/Source/Components/TerrainSurfaceGradientListComponent.cpp @@ -11,9 +11,11 @@ #include #include #include +#include #include #include +#include namespace Terrain { @@ -44,6 +46,7 @@ namespace Terrain ->DataElement( AZ::Edit::UIHandlers::Default, &TerrainSurfaceGradientMapping::m_surfaceTag, "Surface Tag", "Surface type to map to this gradient.") + ->Attribute(AZ::Edit::Attributes::EnumValues, &TerrainSurfaceGradientMapping::BuildSelectableTagList) ; } } @@ -60,6 +63,30 @@ 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); diff --git a/Gems/Terrain/Code/Source/Components/TerrainSurfaceGradientListComponent.h b/Gems/Terrain/Code/Source/Components/TerrainSurfaceGradientListComponent.h index 36c16bed8f..b2f41fae88 100644 --- a/Gems/Terrain/Code/Source/Components/TerrainSurfaceGradientListComponent.h +++ b/Gems/Terrain/Code/Source/Components/TerrainSurfaceGradientListComponent.h @@ -25,6 +25,8 @@ namespace LmbrCentral namespace Terrain { + class EditorSelectableTagListProvider; + class TerrainSurfaceGradientMapping final { public: @@ -39,8 +41,14 @@ namespace Terrain { } + AZStd::vector> BuildSelectableTagList() const; + void SetTagListProvider(const EditorSelectableTagListProvider* tagListProvider); + AZ::EntityId m_gradientEntityId; SurfaceData::SurfaceTag m_surfaceTag; + + private: + const EditorSelectableTagListProvider* 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 6df6c3b440..09f99fd7fe 100644 --- a/Gems/Terrain/Code/Source/EditorComponents/EditorTerrainPhysicsColliderComponent.cpp +++ b/Gems/Terrain/Code/Source/EditorComponents/EditorTerrainPhysicsColliderComponent.cpp @@ -21,4 +21,38 @@ namespace Terrain typename BaseClassType::WrappedConfigType, 1> ); } + + void EditorTerrainPhysicsColliderComponent::Activate() + { + UpdateConfigurationTagProvider(); + BaseClassType::Activate(); + } + + AZStd::unordered_set EditorTerrainPhysicsColliderComponent::GetSurfaceTagsInUse() const + { + AZStd::unordered_set tagsInUse; + + for (const TerrainPhysicsSurfaceMaterialMapping& mapping : m_configuration.m_surfaceMaterialMappings) + { + AZ::u32 crc = mapping.m_surfaceTag; + tagsInUse.insert(crc); + } + + return AZStd::move(tagsInUse); + } + + AZ::u32 EditorTerrainPhysicsColliderComponent::ConfigurationChanged() + { + UpdateConfigurationTagProvider(); + return BaseClassType::ConfigurationChanged(); + } + + void EditorTerrainPhysicsColliderComponent::UpdateConfigurationTagProvider() + { + for (TerrainPhysicsSurfaceMaterialMapping& mapping : m_configuration.m_surfaceMaterialMappings) + { + mapping.SetTagListProvider(this); + } + } + } diff --git a/Gems/Terrain/Code/Source/EditorComponents/EditorTerrainPhysicsColliderComponent.h b/Gems/Terrain/Code/Source/EditorComponents/EditorTerrainPhysicsColliderComponent.h index 924426c262..fb724507d6 100644 --- a/Gems/Terrain/Code/Source/EditorComponents/EditorTerrainPhysicsColliderComponent.h +++ b/Gems/Terrain/Code/Source/EditorComponents/EditorTerrainPhysicsColliderComponent.h @@ -11,22 +11,34 @@ #include #include #include +#include namespace Terrain { class EditorTerrainPhysicsColliderComponent : public LmbrCentral::EditorWrappedComponentBase + , public EditorSelectableTagListProvider { public: using BaseClassType = LmbrCentral::EditorWrappedComponentBase; AZ_EDITOR_COMPONENT(EditorTerrainPhysicsColliderComponent, "{C43FAB8F-3968-46A6-920E-E84AEDED3DF5}", BaseClassType); static void Reflect(AZ::ReflectContext* context); + // AZ::Component interface implementation + void Activate() override; + static constexpr auto s_categoryName = "Terrain"; static constexpr auto s_componentName = "Terrain Physics Heightfield Collider"; static constexpr auto s_componentDescription = "Provides terrain data to a physics collider in the form of a heightfield and surface->material mapping."; static constexpr auto s_icon = "Editor/Icons/Components/TerrainPhysicsCollider.svg"; static constexpr auto s_viewportIcon = "Editor/Icons/Components/Viewport/TerrainPhysicsCollider.svg"; static constexpr auto s_helpUrl = ""; + + private: + // EditorSelectableTagListProvider 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 bc823734b4..50d45d6cf0 100644 --- a/Gems/Terrain/Code/Source/EditorComponents/EditorTerrainSurfaceGradientListComponent.cpp +++ b/Gems/Terrain/Code/Source/EditorComponents/EditorTerrainSurfaceGradientListComponent.cpp @@ -20,4 +20,37 @@ namespace Terrain typename BaseClassType::WrappedConfigType, 1> ); } + + void EditorTerrainSurfaceGradientListComponent::Activate() + { + UpdateConfigurationTagProvider(); + BaseClassType::Activate(); + } + + AZ::u32 EditorTerrainSurfaceGradientListComponent::ConfigurationChanged() + { + UpdateConfigurationTagProvider(); + return BaseClassType::ConfigurationChanged(); + } + + void EditorTerrainSurfaceGradientListComponent::UpdateConfigurationTagProvider() + { + for (TerrainSurfaceGradientMapping& mapping : m_configuration.m_gradientSurfaceMappings) + { + mapping.SetTagListProvider(this); + } + } + + AZStd::unordered_set EditorTerrainSurfaceGradientListComponent::GetSurfaceTagsInUse() const + { + AZStd::unordered_set tagsInUse; + + for (const TerrainSurfaceGradientMapping& mapping : m_configuration.m_gradientSurfaceMappings) + { + AZ::u32 crc = mapping.m_surfaceTag; + tagsInUse.insert(crc); + } + + return AZStd::move(tagsInUse); + } } diff --git a/Gems/Terrain/Code/Source/EditorComponents/EditorTerrainSurfaceGradientListComponent.h b/Gems/Terrain/Code/Source/EditorComponents/EditorTerrainSurfaceGradientListComponent.h index 58cb776823..37fafdc0a9 100644 --- a/Gems/Terrain/Code/Source/EditorComponents/EditorTerrainSurfaceGradientListComponent.h +++ b/Gems/Terrain/Code/Source/EditorComponents/EditorTerrainSurfaceGradientListComponent.h @@ -11,22 +11,34 @@ #include #include #include +#include namespace Terrain { class EditorTerrainSurfaceGradientListComponent : public LmbrCentral::EditorWrappedComponentBase + , public EditorSelectableTagListProvider { public: using BaseClassType = LmbrCentral::EditorWrappedComponentBase; AZ_EDITOR_COMPONENT(EditorTerrainSurfaceGradientListComponent, "{49831E91-A11F-4EFF-A824-6D85C284B934}", BaseClassType); static void Reflect(AZ::ReflectContext* context); + // AZ::Component interface implementation + void Activate() override; + static constexpr const char* const s_categoryName = "Terrain"; static constexpr const char* const s_componentName = "Terrain Surface Gradient List"; static constexpr const char* const s_componentDescription = "Provides a mapping between gradients and surface tags for use by the terrain system."; static constexpr const char* const s_icon = "Editor/Icons/Components/TerrainSurfaceGradientList.svg"; static constexpr const char* const s_viewportIcon = "Editor/Icons/Components/Viewport/TerrainSurfaceGradientList.svg"; 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; + + AZ::u32 ConfigurationChanged() override; + void UpdateConfigurationTagProvider(); }; } diff --git a/Gems/Terrain/Code/Source/EditorSelectableTagListProvider.cpp b/Gems/Terrain/Code/Source/EditorSelectableTagListProvider.cpp new file mode 100644 index 0000000000..82ea70158c --- /dev/null +++ b/Gems/Terrain/Code/Source/EditorSelectableTagListProvider.cpp @@ -0,0 +1,31 @@ +/* + * 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 new file mode 100644 index 0000000000..d8640bd73f --- /dev/null +++ b/Gems/Terrain/Code/Source/EditorSelectableTagListProvider.h @@ -0,0 +1,26 @@ +/* + * 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/terrain_editor_shared_files.cmake b/Gems/Terrain/Code/terrain_editor_shared_files.cmake index 09724751a9..deb70ba566 100644 --- a/Gems/Terrain/Code/terrain_editor_shared_files.cmake +++ b/Gems/Terrain/Code/terrain_editor_shared_files.cmake @@ -25,6 +25,8 @@ set(FILES Source/EditorComponents/EditorTerrainSystemComponent.h Source/EditorTerrainModule.cpp Source/EditorTerrainModule.h + Source/EditorSelectableTagListProvider.h + Source/EditorSelectableTagListProvider.cpp Source/TerrainModule.cpp Source/TerrainModule.h Source/TerrainRenderer/EditorComponents/EditorTerrainSurfaceMaterialsListComponent.cpp