Add a GetNumSamplesFromRegion function which returns the number of samples given a region and step size. Update Terrain Feature Processor to use this function to get the number of samples instead of computing num samples independently.

Signed-off-by: amzn-sj <srikkant@amazon.com>
This commit is contained in:
amzn-sj
2022-01-19 18:04:56 -08:00
parent 4b5f4042f2
commit 7bba4172ec
5 changed files with 34 additions and 10 deletions
@@ -161,6 +161,10 @@ namespace AzFramework
SurfacePointListFillCallback perPositionCallback,
Sampler sampleFilter = Sampler::DEFAULT) const = 0;
//! Returns the number of samples for a given region and step size.
virtual AZStd::pair<size_t, size_t> GetNumSamplesFromRegion(const AZ::Aabb& inRegion,
const AZ::Vector2& stepSize) const = 0;
//! Given a region(aabb) and a step size, call the provided callback function with surface data corresponding to the
//! coordinates in the region.
virtual void ProcessHeightsFromRegion(const AZ::Aabb& inRegion,
@@ -92,6 +92,8 @@ namespace UnitTest
ProcessSurfaceWeightsFromListOfVector2, void(const AZStd::span<AZ::Vector2>&, AzFramework::Terrain::SurfacePointListFillCallback, Sampler));
MOCK_CONST_METHOD3(
ProcessSurfacePointsFromListOfVector2, void(const AZStd::span<AZ::Vector2>&, AzFramework::Terrain::SurfacePointListFillCallback, Sampler));
MOCK_CONST_METHOD2(
GetNumSamplesFromRegion, AZStd::pair<size_t, size_t>(const AZ::Aabb&, const AZ::Vector2&));
MOCK_CONST_METHOD4(
ProcessHeightsFromRegion, void(const AZ::Aabb&, const AZ::Vector2&, AzFramework::Terrain::SurfacePointRegionFillCallback, Sampler));
MOCK_CONST_METHOD4(
@@ -208,12 +208,21 @@ namespace Terrain
}
int32_t xStart = aznumeric_cast<int32_t>(AZStd::ceilf(m_dirtyRegion.GetMin().GetX() / m_sampleSpacing));
int32_t xEnd = aznumeric_cast<int32_t>(AZStd::floorf(m_dirtyRegion.GetMax().GetX() / m_sampleSpacing)) + 1;
int32_t yStart = aznumeric_cast<int32_t>(AZStd::ceilf(m_dirtyRegion.GetMin().GetY() / m_sampleSpacing));
int32_t yEnd = aznumeric_cast<int32_t>(AZStd::floorf(m_dirtyRegion.GetMax().GetY() / m_sampleSpacing)) + 1;
uint32_t updateWidth = xEnd - xStart;
uint32_t updateHeight = yEnd - yStart;
AZ::Vector2 stepSize(m_sampleSpacing);
AZ::Vector3 maxBound(
m_dirtyRegion.GetMax().GetX() + m_sampleSpacing, m_dirtyRegion.GetMax().GetY() + m_sampleSpacing, 0.0f);
AZ::Aabb region;
region.Set(m_dirtyRegion.GetMin(), maxBound);
AZStd::pair<size_t, size_t> numSamples;
AzFramework::Terrain::TerrainDataRequestBus::BroadcastResult(
numSamples, &AzFramework::Terrain::TerrainDataRequests::GetNumSamplesFromRegion,
region, stepSize);
uint32_t updateWidth = numSamples.first;
uint32_t updateHeight = numSamples.second;
AZStd::vector<uint16_t> pixels;
pixels.reserve(updateWidth * updateHeight);
{
@@ -238,14 +247,9 @@ namespace Terrain
pixels.push_back(uint16Height);
};
AZ::Vector2 stepSize(m_sampleSpacing);
AZ::Vector3 maxBound(
m_dirtyRegion.GetMax().GetX() + m_sampleSpacing, m_dirtyRegion.GetMax().GetY() + m_sampleSpacing, 0.0f);
AZ::Aabb region;
region.Set(m_dirtyRegion.GetMin(), maxBound);
AzFramework::Terrain::TerrainDataRequestBus::Broadcast(
&AzFramework::Terrain::TerrainDataRequests::ProcessHeightsFromRegion,
region, stepSize, perPositionCallback,AzFramework::Terrain::TerrainDataRequests::Sampler::EXACT);
region, stepSize, perPositionCallback, AzFramework::Terrain::TerrainDataRequests::Sampler::EXACT);
}
if (m_heightmapImage)
@@ -690,6 +690,16 @@ void TerrainSystem::ProcessSurfacePointsFromListOfVector2(
}
}
AZStd::pair<size_t, size_t> TerrainSystem::GetNumSamplesFromRegion(
const AZ::Aabb& inRegion,
const AZ::Vector2& stepSize) const
{
const size_t numSamplesX = aznumeric_cast<size_t>(ceil(inRegion.GetExtents().GetX() / stepSize.GetX()));
const size_t numSamplesY = aznumeric_cast<size_t>(ceil(inRegion.GetExtents().GetY() / stepSize.GetY()));
return AZStd::make_pair(numSamplesX, numSamplesY);
}
void TerrainSystem::ProcessHeightsFromRegion(
const AZ::Aabb& inRegion,
const AZ::Vector2& stepSize,
@@ -163,6 +163,10 @@ namespace Terrain
AzFramework::Terrain::SurfacePointListFillCallback perPositionCallback,
Sampler sampleFilter = Sampler::DEFAULT) const override;
//! Returns the number of samples for a given region and step size.
virtual AZStd::pair<size_t, size_t> GetNumSamplesFromRegion(const AZ::Aabb& inRegion,
const AZ::Vector2& stepSize) const override;
//! Given a region(aabb) and a step size, call the provided callback function with surface data corresponding to the
//! coordinates in the region.
virtual void ProcessHeightsFromRegion(const AZ::Aabb& inRegion,