PR feedback addressing
Signed-off-by: Sergey Pereslavtsev <pereslav@amazon.com>
This commit is contained in:
@@ -17,13 +17,11 @@
|
||||
#include <AzCore/RTTI/BehaviorContext.h>
|
||||
#include <AzCore/Serialization/EditContext.h>
|
||||
#include <AzCore/Serialization/SerializeContext.h>
|
||||
#include <AzCore/std/sort.h>
|
||||
|
||||
#include <AzFramework/Physics/Material.h>
|
||||
#include <AzFramework/Physics/PhysicsSystem.h>
|
||||
#include <AzFramework/Terrain/TerrainDataRequestBus.h>
|
||||
|
||||
#include <EditorSelectableTagListProvider.h>
|
||||
|
||||
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<TerrainPhysicsSurfaceMaterialMapping>(
|
||||
"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<AZStd::pair<AZ::u32, AZStd::string>> TerrainPhysicsSurfaceMaterialMapping::BuildSelectableTagList() const
|
||||
{
|
||||
AZ_PROFILE_FUNCTION(Entity);
|
||||
|
||||
if (m_tagListProvider)
|
||||
{
|
||||
AZStd::vector<AZStd::pair<AZ::u32, AZStd::string>> 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<TerrainPhysicsColliderConfig>(
|
||||
"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")
|
||||
;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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<AZStd::pair<AZ::u32, AZStd::string>> 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<TerrainPhysicsSurfaceMaterialMapping> m_surfaceMaterialMappings;
|
||||
};
|
||||
|
||||
@@ -11,11 +11,9 @@
|
||||
#include <AzCore/RTTI/BehaviorContext.h>
|
||||
#include <AzCore/Serialization/EditContext.h>
|
||||
#include <AzCore/Serialization/SerializeContext.h>
|
||||
#include <AzCore/std/sort.h>
|
||||
|
||||
#include <GradientSignal/Ebuses/GradientRequestBus.h>
|
||||
#include <TerrainSystem/TerrainSystemBus.h>
|
||||
#include <EditorSelectableTagListProvider.h>
|
||||
|
||||
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<TerrainSurfaceGradientMapping>("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<AZ::BehaviorContext*>(context))
|
||||
@@ -63,30 +40,6 @@ namespace Terrain
|
||||
}
|
||||
}
|
||||
|
||||
AZStd::vector<AZStd::pair<AZ::u32, AZStd::string>> TerrainSurfaceGradientMapping::BuildSelectableTagList() const
|
||||
{
|
||||
AZ_PROFILE_FUNCTION(Entity);
|
||||
|
||||
if (m_tagListProvider)
|
||||
{
|
||||
AZStd::vector<AZStd::pair<AZ::u32, AZStd::string>> 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<TerrainSurfaceGradientListConfig>(
|
||||
"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.")
|
||||
;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ namespace LmbrCentral
|
||||
|
||||
namespace Terrain
|
||||
{
|
||||
class EditorSelectableTagListProvider;
|
||||
class EditorSurfaceTagListProvider;
|
||||
|
||||
class TerrainSurfaceGradientMapping final
|
||||
{
|
||||
@@ -42,13 +42,13 @@ namespace Terrain
|
||||
}
|
||||
|
||||
AZStd::vector<AZStd::pair<AZ::u32, AZStd::string>> 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
|
||||
|
||||
+50
-4
@@ -20,6 +20,43 @@ namespace Terrain
|
||||
&LmbrCentral::EditorWrappedComponentBaseVersionConverter<typename BaseClassType::WrappedComponentType,
|
||||
typename BaseClassType::WrappedConfigType, 1>
|
||||
);
|
||||
|
||||
if (auto serialize = azrtti_cast<AZ::SerializeContext*>(context))
|
||||
{
|
||||
if (auto edit = serialize->GetEditContext())
|
||||
{
|
||||
edit->Class<TerrainPhysicsSurfaceMaterialMapping>(
|
||||
"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<TerrainPhysicsColliderConfig>(
|
||||
"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<AZ::u32> EditorTerrainPhysicsColliderComponent::GetSurfaceTagsInUse() const
|
||||
AZStd::unordered_set<SurfaceData::SurfaceTag> EditorTerrainPhysicsColliderComponent::GetSurfaceTagsInUse() const
|
||||
{
|
||||
AZStd::unordered_set<AZ::u32> tagsInUse;
|
||||
AZStd::unordered_set<SurfaceData::SurfaceTag> 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<AZStd::pair<AZ::u32, AZStd::string>> 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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,13 +11,13 @@
|
||||
#include <Components/TerrainPhysicsColliderComponent.h>
|
||||
#include <AzToolsFramework/ToolsComponents/EditorComponentBase.h>
|
||||
#include <LmbrCentral/Component/EditorWrappedComponentBase.h>
|
||||
#include <EditorSelectableTagListProvider.h>
|
||||
#include <EditorSurfaceTagListProvider.h>
|
||||
|
||||
namespace Terrain
|
||||
{
|
||||
class EditorTerrainPhysicsColliderComponent
|
||||
: public LmbrCentral::EditorWrappedComponentBase<TerrainPhysicsColliderComponent, TerrainPhysicsColliderConfig>
|
||||
, public EditorSelectableTagListProvider
|
||||
, public EditorSurfaceTagListProvider
|
||||
{
|
||||
public:
|
||||
using BaseClassType = LmbrCentral::EditorWrappedComponentBase<TerrainPhysicsColliderComponent, TerrainPhysicsColliderConfig>;
|
||||
@@ -35,8 +35,8 @@ namespace Terrain
|
||||
static constexpr auto s_helpUrl = "";
|
||||
|
||||
private:
|
||||
// EditorSelectableTagListProvider interface implementation
|
||||
AZStd::unordered_set<AZ::u32> GetSurfaceTagsInUse() const override;
|
||||
// EditorSurfaceTagListProvider interface implementation
|
||||
AZStd::unordered_set<SurfaceData::SurfaceTag> GetSurfaceTagsInUse() const override;
|
||||
|
||||
AZ::u32 ConfigurationChanged() override;
|
||||
void UpdateConfigurationTagProvider();
|
||||
|
||||
+49
-4
@@ -19,6 +19,41 @@ namespace Terrain
|
||||
&LmbrCentral::EditorWrappedComponentBaseVersionConverter<typename BaseClassType::WrappedComponentType,
|
||||
typename BaseClassType::WrappedConfigType, 1>
|
||||
);
|
||||
|
||||
if (auto serialize = azrtti_cast<AZ::SerializeContext*>(context))
|
||||
{
|
||||
if (auto edit = serialize->GetEditContext())
|
||||
{
|
||||
edit->Class<TerrainSurfaceGradientMapping>("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<TerrainSurfaceGradientListConfig>(
|
||||
"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<AZ::u32> EditorTerrainSurfaceGradientListComponent::GetSurfaceTagsInUse() const
|
||||
AZStd::unordered_set<SurfaceData::SurfaceTag> EditorTerrainSurfaceGradientListComponent::GetSurfaceTagsInUse() const
|
||||
{
|
||||
AZStd::unordered_set<AZ::u32> tagsInUse;
|
||||
AZStd::unordered_set<SurfaceData::SurfaceTag> 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<AZStd::pair<AZ::u32, AZStd::string>> 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;
|
||||
}
|
||||
}
|
||||
|
||||
+4
-4
@@ -11,13 +11,13 @@
|
||||
#include <Components/TerrainSurfaceGradientListComponent.h>
|
||||
#include <AzToolsFramework/ToolsComponents/EditorComponentBase.h>
|
||||
#include <LmbrCentral/Component/EditorWrappedComponentBase.h>
|
||||
#include <EditorSelectableTagListProvider.h>
|
||||
#include <EditorSurfaceTagListProvider.h>
|
||||
|
||||
namespace Terrain
|
||||
{
|
||||
class EditorTerrainSurfaceGradientListComponent
|
||||
: public LmbrCentral::EditorWrappedComponentBase<TerrainSurfaceGradientListComponent, TerrainSurfaceGradientListConfig>
|
||||
, public EditorSelectableTagListProvider
|
||||
, public EditorSurfaceTagListProvider
|
||||
{
|
||||
public:
|
||||
using BaseClassType = LmbrCentral::EditorWrappedComponentBase<TerrainSurfaceGradientListComponent, TerrainSurfaceGradientListConfig>;
|
||||
@@ -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<AZ::u32> GetSurfaceTagsInUse() const override;
|
||||
// EditorSurfaceTagListProvider interface implementation
|
||||
AZStd::unordered_set<SurfaceData::SurfaceTag> GetSurfaceTagsInUse() const override;
|
||||
|
||||
AZ::u32 ConfigurationChanged() override;
|
||||
void UpdateConfigurationTagProvider();
|
||||
|
||||
@@ -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 <EditorSelectableTagListProvider.h>
|
||||
#include <SurfaceData/SurfaceTag.h>
|
||||
|
||||
namespace Terrain
|
||||
{
|
||||
AZStd::vector<AZStd::pair<AZ::u32, AZStd::string>> EditorSelectableTagListProvider::BuildSelectableTagList() const
|
||||
{
|
||||
AZStd::vector<AZStd::pair<AZ::u32, AZStd::string>> availableTags = SurfaceData::SurfaceTag::GetRegisteredTags();
|
||||
|
||||
AZStd::unordered_set<AZ::u32> 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);
|
||||
}
|
||||
}
|
||||
@@ -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 <AzCore/std/containers/vector.h>
|
||||
#include <AzCore/std/string/string.h>
|
||||
#include <AzCore/std/containers/unordered_set.h>
|
||||
|
||||
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<AZStd::pair<AZ::u32, AZStd::string>> BuildSelectableTagList() const;
|
||||
|
||||
//! Returns a set of CRC of all surface tags currently in use and not available for selecting.
|
||||
virtual AZStd::unordered_set<AZ::u32> GetSurfaceTagsInUse() const = 0;
|
||||
};
|
||||
}
|
||||
@@ -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 <EditorSurfaceTagListProvider.h>
|
||||
#include <AzCore/std/sort.h>
|
||||
|
||||
|
||||
namespace Terrain
|
||||
{
|
||||
AZStd::vector<AZStd::pair<AZ::u32, AZStd::string>> BuildSelectableTagList(const EditorSurfaceTagListProvider* tagListProvider,
|
||||
const SurfaceData::SurfaceTag& currentTag)
|
||||
{
|
||||
AZStd::vector<AZStd::pair<AZ::u32, AZStd::string>> availableTags = SurfaceData::SurfaceTag::GetRegisteredTags();
|
||||
|
||||
AZStd::unordered_set<SurfaceData::SurfaceTag> 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);
|
||||
}
|
||||
}
|
||||
@@ -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 <AzCore/std/containers/vector.h>
|
||||
#include <AzCore/std/string/string.h>
|
||||
#include <AzCore/std/containers/unordered_set.h>
|
||||
#include <SurfaceData/SurfaceTag.h>
|
||||
|
||||
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<SurfaceData::SurfaceTag> GetSurfaceTagsInUse() const = 0;
|
||||
};
|
||||
|
||||
//! Returns a list of available tags to be selected in the component.
|
||||
AZStd::vector<AZStd::pair<AZ::u32, AZStd::string>> BuildSelectableTagList(
|
||||
const EditorSurfaceTagListProvider* tagListProvider,
|
||||
const SurfaceData::SurfaceTag& currentTag);
|
||||
}
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user