diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyVectorCtrl.hxx b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyVectorCtrl.hxx index e5a6b5803c..cc61593154 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyVectorCtrl.hxx +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyVectorCtrl.hxx @@ -150,10 +150,7 @@ namespace AzToolsFramework TypeBeingHandled actualValue = instance; for (int idx = 0; idx < m_common.GetElementCount(); ++idx) { - if (elements[idx]->wasValueEditedByUser()) - { - actualValue.SetElement(idx, static_cast(elements[idx]->getValue())); - } + actualValue.SetElement(idx, static_cast(elements[idx]->getValue())); } instance = actualValue; } diff --git a/Gems/Terrain/Code/Source/Components/TerrainWorldComponent.cpp b/Gems/Terrain/Code/Source/Components/TerrainWorldComponent.cpp index bd65cf6abc..8d6bf8e4b0 100644 --- a/Gems/Terrain/Code/Source/Components/TerrainWorldComponent.cpp +++ b/Gems/Terrain/Code/Source/Components/TerrainWorldComponent.cpp @@ -40,15 +40,17 @@ namespace Terrain ->DataElement(AZ::Edit::UIHandlers::Default, &TerrainWorldConfig::m_worldMin, "World Bounds (Min)", "") // Temporary constraint until the rest of the Terrain system is updated to support larger worlds. + ->Attribute(AZ::Edit::Attributes::ChangeValidate, &TerrainWorldConfig::ValidateWorldMin) ->Attribute(AZ::Edit::Attributes::Min, -2048.0f) ->Attribute(AZ::Edit::Attributes::Max, 2048.0f) ->DataElement(AZ::Edit::UIHandlers::Default, &TerrainWorldConfig::m_worldMax, "World Bounds (Max)", "") // Temporary constraint until the rest of the Terrain system is updated to support larger worlds. + ->Attribute(AZ::Edit::Attributes::ChangeValidate, &TerrainWorldConfig::ValidateWorldMax) ->Attribute(AZ::Edit::Attributes::Min, -2048.0f) ->Attribute(AZ::Edit::Attributes::Max, 2048.0f) ->DataElement( AZ::Edit::UIHandlers::Default, &TerrainWorldConfig::m_heightQueryResolution, "Height Query Resolution (m)", "") - ; + ->Attribute(AZ::Edit::Attributes::ChangeValidate, &TerrainWorldConfig::ValidateWorldHeight); } } } @@ -128,4 +130,42 @@ namespace Terrain } return false; } -} + + float TerrainWorldConfig::NumberOfSamples(AZ::Vector3* min, AZ::Vector3* max, AZ::Vector2* heightQuery) + { + float numberOfSamples = ((max->GetX() - min->GetX()) / heightQuery->GetX()) * ((max->GetY() - min->GetY()) / heightQuery->GetY()); + return numberOfSamples; + } + + AZ::Outcome TerrainWorldConfig::DetermineMessage(float numSamples) + { + const float maximumSamplesAllowed = 8.0f * 1024.0f * 1024.0f; + if (numSamples < maximumSamplesAllowed) + { + return AZ::Success(); + } + return AZ::Failure(AZStd::string("The number of samples exceeds the maximum allowed.")); + } + + AZ::Outcome TerrainWorldConfig::ValidateWorldMin(void* newValue, [[maybe_unused]]const AZ::Uuid& valueType) + { + AZ::Vector3 minValue = *static_cast(newValue); + + return DetermineMessage(NumberOfSamples(&minValue, &m_worldMax, &m_heightQueryResolution)); + } + + AZ::Outcome TerrainWorldConfig::ValidateWorldMax(void* newValue, [[maybe_unused]] const AZ::Uuid& valueType) + { + AZ::Vector3 maxValue = *static_cast(newValue); + + return DetermineMessage(NumberOfSamples(&m_worldMin, &maxValue, &m_heightQueryResolution)); + } + + AZ::Outcome TerrainWorldConfig::ValidateWorldHeight(void* newValue, [[maybe_unused]] const AZ::Uuid& valueType) + { + AZ::Vector2 heightValue = *static_cast(newValue); + + return DetermineMessage(NumberOfSamples(&m_worldMin, &m_worldMax, &heightValue)); + } + +} // namespace Terrain diff --git a/Gems/Terrain/Code/Source/Components/TerrainWorldComponent.h b/Gems/Terrain/Code/Source/Components/TerrainWorldComponent.h index 2dfe1135c8..a396bcefc8 100644 --- a/Gems/Terrain/Code/Source/Components/TerrainWorldComponent.h +++ b/Gems/Terrain/Code/Source/Components/TerrainWorldComponent.h @@ -32,6 +32,14 @@ namespace Terrain AZ::Vector3 m_worldMin{ 0.0f, 0.0f, 0.0f }; AZ::Vector3 m_worldMax{ 1024.0f, 1024.0f, 1024.0f }; AZ::Vector2 m_heightQueryResolution{ 1.0f, 1.0f }; + + private: + AZ::Outcome ValidateWorldMin(void* newValue, const AZ::Uuid& valueType); + AZ::Outcome ValidateWorldMax(void* newValue, const AZ::Uuid& valueType); + AZ::Outcome ValidateWorldHeight(void* newValue, const AZ::Uuid& valueType); + float NumberOfSamples(AZ::Vector3* min, AZ::Vector3* max, AZ::Vector2* heightQuery); + AZ::Outcome DetermineMessage(float numSamples); + };