From 9aece3e84bcc5cc48c5af5177942b4f274c5d558 Mon Sep 17 00:00:00 2001 From: Sergey Pereslavtsev Date: Fri, 4 Feb 2022 19:57:29 +0000 Subject: [PATCH 1/4] 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 From 701b7a55e6e308b15c4ec258efc21d774e666d4b Mon Sep 17 00:00:00 2001 From: Sergey Pereslavtsev Date: Tue, 8 Feb 2022 12:43:40 +0000 Subject: [PATCH 2/4] 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 From 5dfbddd0cf21e982072a83f84d28cd326e8c4af8 Mon Sep 17 00:00:00 2001 From: Sergey Pereslavtsev Date: Tue, 8 Feb 2022 14:48:52 +0000 Subject: [PATCH 3/4] Build fix Signed-off-by: Sergey Pereslavtsev --- Gems/Terrain/Code/Source/EditorSurfaceTagListProvider.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gems/Terrain/Code/Source/EditorSurfaceTagListProvider.cpp b/Gems/Terrain/Code/Source/EditorSurfaceTagListProvider.cpp index aa4a666d1b..12a371fc49 100644 --- a/Gems/Terrain/Code/Source/EditorSurfaceTagListProvider.cpp +++ b/Gems/Terrain/Code/Source/EditorSurfaceTagListProvider.cpp @@ -33,7 +33,7 @@ namespace Terrain } // Insert the current tag back if it was removed via tagsInUse - availableTags.emplace_back({ AZ::u32(currentTag), currentTag.GetDisplayName() }); + 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; }); From c964d2085f4d0732d9b23cc5bbedc0181bc551be Mon Sep 17 00:00:00 2001 From: Sergey Pereslavtsev Date: Thu, 10 Feb 2022 10:45:25 +0000 Subject: [PATCH 4/4] Removed pragma once from cpp Signed-off-by: Sergey Pereslavtsev --- Gems/Terrain/Code/Source/EditorSurfaceTagListProvider.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/Gems/Terrain/Code/Source/EditorSurfaceTagListProvider.cpp b/Gems/Terrain/Code/Source/EditorSurfaceTagListProvider.cpp index 12a371fc49..bb4dcb6afe 100644 --- a/Gems/Terrain/Code/Source/EditorSurfaceTagListProvider.cpp +++ b/Gems/Terrain/Code/Source/EditorSurfaceTagListProvider.cpp @@ -6,8 +6,6 @@ * */ -#pragma once - #include #include