Merge branch 'development' into terrain/sphrose/SurfaceDataConstants
This commit is contained in:
@@ -48,6 +48,15 @@ namespace Terrain
|
||||
->Attribute(AZ::Edit::Attributes::RequiredService, AZ_CRC_CE("GradientService"))
|
||||
;
|
||||
}
|
||||
|
||||
if (auto behaviorContext = azrtti_cast<AZ::BehaviorContext*>(context))
|
||||
{
|
||||
behaviorContext->Class<TerrainHeightGradientListConfig>()
|
||||
->Attribute(AZ::Script::Attributes::Category, "Terrain")
|
||||
->Constructor()
|
||||
->Property("gradientEntities", BehaviorValueProperty(&TerrainHeightGradientListConfig::m_gradientEntities))
|
||||
;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -44,6 +44,7 @@ namespace Terrain
|
||||
AZStd::vector<AZ::EntityId> m_gradientEntities;
|
||||
};
|
||||
|
||||
static const AZ::Uuid TerrainHeightGradientListComponentTypeId = "{1BB3BA6C-6D4A-4636-B542-F23ECBA8F2AB}";
|
||||
|
||||
class TerrainHeightGradientListComponent
|
||||
: public AZ::Component
|
||||
@@ -54,7 +55,7 @@ namespace Terrain
|
||||
public:
|
||||
template<typename, typename>
|
||||
friend class LmbrCentral::EditorWrappedComponentBase;
|
||||
AZ_COMPONENT(TerrainHeightGradientListComponent, "{1BB3BA6C-6D4A-4636-B542-F23ECBA8F2AB}");
|
||||
AZ_COMPONENT(TerrainHeightGradientListComponent, TerrainHeightGradientListComponentTypeId);
|
||||
static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& services);
|
||||
static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& services);
|
||||
static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& services);
|
||||
@@ -64,6 +65,8 @@ namespace Terrain
|
||||
TerrainHeightGradientListComponent() = default;
|
||||
~TerrainHeightGradientListComponent() = default;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// TerrainAreaHeightRequestBus
|
||||
void GetHeight(const AZ::Vector3& inPosition, AZ::Vector3& outPosition, bool& terrainExists) override;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -54,6 +54,17 @@ namespace Terrain
|
||||
->DataElement(AZ::Edit::UIHandlers::Default, &TerrainLayerSpawnerConfig::m_useGroundPlane, "Use Ground Plane", "Determines whether or not to provide a default ground plane")
|
||||
;
|
||||
}
|
||||
|
||||
if (auto behaviorContext = azrtti_cast<AZ::BehaviorContext*>(context))
|
||||
{
|
||||
behaviorContext->Class<TerrainLayerSpawnerConfig>()
|
||||
->Attribute(AZ::Script::Attributes::Category, "Terrain")
|
||||
->Constructor()
|
||||
->Property("layer", BehaviorValueProperty(&TerrainLayerSpawnerConfig::m_layer))
|
||||
->Property("priority", BehaviorValueProperty(&TerrainLayerSpawnerConfig::m_priority))
|
||||
->Property("useGroundPlane", BehaviorValueProperty(&TerrainLayerSpawnerConfig::m_useGroundPlane))
|
||||
->Method("GetSelectableLayers", &TerrainLayerSpawnerConfig::GetSelectableLayers);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -52,6 +52,7 @@ namespace Terrain
|
||||
bool m_useGroundPlane = true;
|
||||
};
|
||||
|
||||
static const AZ::Uuid TerrainLayerSpawnerComponentTypeId = "{3848605F-A4EA-478C-B710-84AB8DCA9EC5}";
|
||||
|
||||
class TerrainLayerSpawnerComponent
|
||||
: public AZ::Component
|
||||
@@ -61,7 +62,7 @@ namespace Terrain
|
||||
public:
|
||||
template<typename, typename>
|
||||
friend class LmbrCentral::EditorWrappedComponentBase;
|
||||
AZ_COMPONENT(TerrainLayerSpawnerComponent, "{3848605F-A4EA-478C-B710-84AB8DCA9EC5}");
|
||||
AZ_COMPONENT(TerrainLayerSpawnerComponent, TerrainLayerSpawnerComponentTypeId);
|
||||
static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& services);
|
||||
static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& services);
|
||||
static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& services);
|
||||
|
||||
@@ -16,16 +16,47 @@
|
||||
#include <AzCore/Serialization/EditContext.h>
|
||||
#include <AzCore/Serialization/SerializeContext.h>
|
||||
|
||||
#include <AzFramework/Physics/Material.h>
|
||||
#include <AzFramework/Terrain/TerrainDataRequestBus.h>
|
||||
|
||||
namespace Terrain
|
||||
{
|
||||
void TerrainPhysicsColliderConfig::Reflect(AZ::ReflectContext* context)
|
||||
void TerrainPhysicsSurfaceMaterialMapping::Reflect(AZ::ReflectContext* context)
|
||||
{
|
||||
if (auto serialize = azrtti_cast<AZ::SerializeContext*>(context))
|
||||
{
|
||||
serialize->Class<TerrainPhysicsColliderConfig, AZ::ComponentConfig>()
|
||||
serialize->Class<TerrainPhysicsSurfaceMaterialMapping>()
|
||||
->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.")
|
||||
->DataElement(AZ::Edit::UIHandlers::Default, &TerrainPhysicsSurfaceMaterialMapping::m_materialId, "Material ID", "")
|
||||
->Attribute(AZ::Edit::Attributes::AutoExpand, true)
|
||||
->Attribute(AZ::Edit::Attributes::ShowProductAssetFileName, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
void TerrainPhysicsColliderConfig::Reflect(AZ::ReflectContext* context)
|
||||
{
|
||||
TerrainPhysicsSurfaceMaterialMapping::Reflect(context);
|
||||
|
||||
if (auto serialize = azrtti_cast<AZ::SerializeContext*>(context))
|
||||
{
|
||||
serialize->Class<TerrainPhysicsColliderConfig, AZ::ComponentConfig>()
|
||||
->Version(2)->Field(
|
||||
"Mappings", &TerrainPhysicsColliderConfig::m_surfaceMaterialMappings)
|
||||
;
|
||||
|
||||
if (auto edit = serialize->GetEditContext())
|
||||
@@ -35,7 +66,11 @@ namespace Terrain
|
||||
"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);
|
||||
->Attribute(AZ::Edit::Attributes::AutoExpand, true)
|
||||
->DataElement(
|
||||
AZ::Edit::UIHandlers::Default, &TerrainPhysicsColliderConfig::m_surfaceMaterialMappings,
|
||||
"Surface to Material Mappings", "Maps surfaces to physics materials")
|
||||
;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -249,6 +284,34 @@ namespace Terrain
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t TerrainPhysicsColliderComponent::GetMaterialIdIndex(const Physics::MaterialId& materialId, const AZStd::vector<Physics::MaterialId>& materialList) const
|
||||
{
|
||||
const auto& materialIter = AZStd::find(materialList.begin(), materialList.end(), materialId);
|
||||
if (materialIter != materialList.end())
|
||||
{
|
||||
return static_cast<uint8_t>(materialIter - materialList.begin());
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Physics::MaterialId TerrainPhysicsColliderComponent::FindMaterialIdForSurfaceTag(const SurfaceData::SurfaceTag tag) const
|
||||
{
|
||||
uint8_t index = 0;
|
||||
|
||||
for (auto& mapping : m_configuration.m_surfaceMaterialMappings)
|
||||
{
|
||||
if (mapping.m_surfaceTag == tag)
|
||||
{
|
||||
return mapping.m_materialId;
|
||||
}
|
||||
index++;
|
||||
}
|
||||
|
||||
// If this surface isn't mapped, use the default material.
|
||||
return Physics::MaterialId();
|
||||
}
|
||||
|
||||
void TerrainPhysicsColliderComponent::GenerateHeightsAndMaterialsInBounds(
|
||||
AZStd::vector<Physics::HeightMaterialPoint>& heightMaterials) const
|
||||
{
|
||||
@@ -266,6 +329,8 @@ namespace Terrain
|
||||
heightMaterials.clear();
|
||||
heightMaterials.reserve(gridWidth * gridHeight);
|
||||
|
||||
AZStd::vector<Physics::MaterialId> materialList = GetMaterialList();
|
||||
|
||||
for (int32_t row = 0; row < gridHeight; row++)
|
||||
{
|
||||
const float y = row * gridResolution.GetY() + worldSize.GetMin().GetY();
|
||||
@@ -286,9 +351,19 @@ namespace Terrain
|
||||
terrainExists = false;
|
||||
}
|
||||
|
||||
// Find the best surface tag at this point.
|
||||
AzFramework::SurfaceData::SurfaceTagWeight surfaceWeight;
|
||||
AzFramework::Terrain::TerrainDataRequestBus::BroadcastResult(
|
||||
surfaceWeight, &AzFramework::Terrain::TerrainDataRequests::GetMaxSurfaceWeightFromFloats, x, y,
|
||||
AzFramework::Terrain::TerrainDataRequests::Sampler::DEFAULT, nullptr);
|
||||
|
||||
Physics::HeightMaterialPoint point;
|
||||
point.m_height = height - worldCenterZ;
|
||||
point.m_quadMeshType = terrainExists ? Physics::QuadMeshType::SubdivideUpperLeftToBottomRight : Physics::QuadMeshType::Hole;
|
||||
|
||||
Physics::MaterialId materialId = FindMaterialIdForSurfaceTag(surfaceWeight.m_surfaceType);
|
||||
point.m_materialIndex = GetMaterialIdIndex(materialId, materialList);
|
||||
|
||||
heightMaterials.emplace_back(point);
|
||||
}
|
||||
}
|
||||
@@ -332,7 +407,21 @@ namespace Terrain
|
||||
|
||||
AZStd::vector<Physics::MaterialId> TerrainPhysicsColliderComponent::GetMaterialList() const
|
||||
{
|
||||
return AZStd::vector<Physics::MaterialId>();
|
||||
AZStd::vector<Physics::MaterialId> materialList;
|
||||
|
||||
// Ensure the list contains the default material as the first entry.
|
||||
materialList.emplace_back(Physics::MaterialId());
|
||||
|
||||
for (auto& mapping : m_configuration.m_surfaceMaterialMappings)
|
||||
{
|
||||
const auto& existingInstance = AZStd::find(materialList.begin(), materialList.end(), mapping.m_materialId);
|
||||
if (existingInstance == materialList.end())
|
||||
{
|
||||
materialList.emplace_back(mapping.m_materialId);
|
||||
}
|
||||
}
|
||||
|
||||
return materialList;
|
||||
}
|
||||
|
||||
AZStd::vector<float> TerrainPhysicsColliderComponent::GetHeights() const
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
|
||||
#include <AzFramework/Physics/HeightfieldProviderBus.h>
|
||||
#include <AzFramework/Physics/Material.h>
|
||||
#include <SurfaceData/SurfaceTag.h>
|
||||
#include <TerrainSystem/TerrainSystemBus.h>
|
||||
|
||||
#include <LmbrCentral/Shape/ShapeComponentBus.h>
|
||||
@@ -24,6 +25,19 @@ namespace LmbrCentral
|
||||
|
||||
namespace Terrain
|
||||
{
|
||||
static const uint8_t InvalidSurfaceTagIndex = 0xFF;
|
||||
|
||||
struct TerrainPhysicsSurfaceMaterialMapping final
|
||||
{
|
||||
public:
|
||||
AZ_CLASS_ALLOCATOR(TerrainPhysicsSurfaceMaterialMapping, AZ::SystemAllocator, 0);
|
||||
AZ_RTTI(TerrainPhysicsSurfaceMaterialMapping, "{A88B5289-DFCD-4564-8395-E2177DFE5B18}");
|
||||
static void Reflect(AZ::ReflectContext* context);
|
||||
|
||||
SurfaceData::SurfaceTag m_surfaceTag;
|
||||
Physics::MaterialId m_materialId;
|
||||
};
|
||||
|
||||
class TerrainPhysicsColliderConfig
|
||||
: public AZ::ComponentConfig
|
||||
{
|
||||
@@ -32,6 +46,7 @@ namespace Terrain
|
||||
AZ_RTTI(TerrainPhysicsColliderConfig, "{E9EADB8F-C3A5-4B9C-A62D-2DBC86B4CE59}", AZ::ComponentConfig);
|
||||
static void Reflect(AZ::ReflectContext* context);
|
||||
|
||||
AZStd::vector<TerrainPhysicsSurfaceMaterialMapping> m_surfaceMaterialMappings;
|
||||
};
|
||||
|
||||
|
||||
@@ -77,6 +92,9 @@ namespace Terrain
|
||||
bool ReadInConfig(const AZ::ComponentConfig* baseConfig) override;
|
||||
bool WriteOutConfig(AZ::ComponentConfig* outBaseConfig) const override;
|
||||
|
||||
uint8_t GetMaterialIdIndex(const Physics::MaterialId& materialId, const AZStd::vector<Physics::MaterialId>& materialList) const;
|
||||
Physics::MaterialId FindMaterialIdForSurfaceTag(const SurfaceData::SurfaceTag tag) const;
|
||||
|
||||
void GenerateHeightsInBounds(AZStd::vector<float>& heights) const;
|
||||
void GenerateHeightsAndMaterialsInBounds(AZStd::vector<Physics::HeightMaterialPoint>& heightMaterials) const;
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
#include <Components/TerrainSurfaceGradientListComponent.h>
|
||||
|
||||
#include <AzCore/RTTI/BehaviorContext.h>
|
||||
#include <AzCore/Serialization/EditContext.h>
|
||||
#include <AzCore/Serialization/SerializeContext.h>
|
||||
|
||||
@@ -46,6 +47,17 @@ namespace Terrain
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
if (auto behaviorContext = azrtti_cast<AZ::BehaviorContext*>(context))
|
||||
{
|
||||
behaviorContext->Class<TerrainSurfaceGradientMapping>()
|
||||
->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common)
|
||||
->Attribute(AZ::Script::Attributes::Category, "Terrain")
|
||||
->Attribute(AZ::Script::Attributes::Module, "terrain")
|
||||
->Constructor()
|
||||
->Property("gradientEntityId", BehaviorValueProperty(&TerrainSurfaceGradientMapping::m_gradientEntityId))
|
||||
->Property("surfaceTag", BehaviorValueProperty(&TerrainSurfaceGradientMapping::m_surfaceTag));
|
||||
}
|
||||
}
|
||||
|
||||
void TerrainSurfaceGradientListConfig::Reflect(AZ::ReflectContext* context)
|
||||
|
||||
Reference in New Issue
Block a user