LYN-8403 Prevent the same Surface Tag from getting reused

Signed-off-by: Sergey Pereslavtsev <pereslav@amazon.com>
This commit is contained in:
Sergey Pereslavtsev
2022-02-04 19:57:29 +00:00
parent 02b13ca7f1
commit 9aece3e84b
15 changed files with 274 additions and 13 deletions
@@ -21,4 +21,38 @@ namespace Terrain
typename BaseClassType::WrappedConfigType, 1>
);
}
void EditorTerrainPhysicsColliderComponent::Activate()
{
UpdateConfigurationTagProvider();
BaseClassType::Activate();
}
AZStd::unordered_set<AZ::u32> EditorTerrainPhysicsColliderComponent::GetSurfaceTagsInUse() const
{
AZStd::unordered_set<AZ::u32> 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);
}
}
}
@@ -11,22 +11,34 @@
#include <Components/TerrainPhysicsColliderComponent.h>
#include <AzToolsFramework/ToolsComponents/EditorComponentBase.h>
#include <LmbrCentral/Component/EditorWrappedComponentBase.h>
#include <EditorSelectableTagListProvider.h>
namespace Terrain
{
class EditorTerrainPhysicsColliderComponent
: public LmbrCentral::EditorWrappedComponentBase<TerrainPhysicsColliderComponent, TerrainPhysicsColliderConfig>
, public EditorSelectableTagListProvider
{
public:
using BaseClassType = LmbrCentral::EditorWrappedComponentBase<TerrainPhysicsColliderComponent, TerrainPhysicsColliderConfig>;
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<AZ::u32> GetSurfaceTagsInUse() const override;
AZ::u32 ConfigurationChanged() override;
void UpdateConfigurationTagProvider();
};
}
@@ -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<AZ::u32> EditorTerrainSurfaceGradientListComponent::GetSurfaceTagsInUse() const
{
AZStd::unordered_set<AZ::u32> tagsInUse;
for (const TerrainSurfaceGradientMapping& mapping : m_configuration.m_gradientSurfaceMappings)
{
AZ::u32 crc = mapping.m_surfaceTag;
tagsInUse.insert(crc);
}
return AZStd::move(tagsInUse);
}
}
@@ -11,22 +11,34 @@
#include <Components/TerrainSurfaceGradientListComponent.h>
#include <AzToolsFramework/ToolsComponents/EditorComponentBase.h>
#include <LmbrCentral/Component/EditorWrappedComponentBase.h>
#include <EditorSelectableTagListProvider.h>
namespace Terrain
{
class EditorTerrainSurfaceGradientListComponent
: public LmbrCentral::EditorWrappedComponentBase<TerrainSurfaceGradientListComponent, TerrainSurfaceGradientListConfig>
, public EditorSelectableTagListProvider
{
public:
using BaseClassType = LmbrCentral::EditorWrappedComponentBase<TerrainSurfaceGradientListComponent, TerrainSurfaceGradientListConfig>;
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<AZ::u32> GetSurfaceTagsInUse() const override;
AZ::u32 ConfigurationChanged() override;
void UpdateConfigurationTagProvider();
};
}