@ -6,20 +6,16 @@
*
*/
# include "TerrainSurfaceDataSystemComponent.h"
# include <TerrainSurfaceDataSystemComponent.h>
# include <AzCore/Debug/Profiler.h>
# include <AzCore/Math/MathUtils.h>
# include <AzCore/Serialization/EditContext.h>
# include <AzCore/Serialization/SerializeContext.h>
# include <AzFramework/Terrain/TerrainDataRequestBus.h>
# include <MathConversion.h>
# include <SurfaceData/SurfaceDataSystemRequestBus.h>
# include <SurfaceData/SurfaceTag.h>
# include <SurfaceData/Utility/SurfaceDataUtility.h>
# include <ISystem.h>
namespace SurfaceData
namespace Terrain
{
//////////////////////////////////////////////////////////////////////////
// TerrainSurfaceDataSystemConfig
@ -98,26 +94,23 @@ namespace SurfaceData
void TerrainSurfaceDataSystemComponent : : Activate ( )
{
m_providerHandle = InvalidSurfaceDataRegistryHandle ;
m_system = GetISystem ( ) ;
CrySystemEventBus : : Handler : : BusConnect ( ) ;
AZ : : HeightmapUpdateNotificationBus : : Handler : : BusConnect ( ) ;
m_providerHandle = SurfaceData : : InvalidSurfaceDataRegistryHandle ;
AzFramework : : Terrain : : TerrainDataNotificationBus : : Handler : : BusConnect ( ) ;
UpdateTerrainData ( AZ : : Aabb : : CreateNull ( ) ) ;
}
void TerrainSurfaceDataSystemComponent : : Deactivate ( )
{
if ( m_providerHandle ! = InvalidSurfaceDataRegistryHandle)
if ( m_providerHandle ! = SurfaceData: : InvalidSurfaceDataRegistryHandle)
{
SurfaceDataSystemRequestBus : : Broadcast ( & SurfaceDataSystemRequestBus : : Events : : UnregisterSurfaceDataProvider , m_providerHandle ) ;
m_providerHandle = InvalidSurfaceDataRegistryHandle ;
SurfaceData : : SurfaceDataSystemRequestBus : : Broadcast (
& SurfaceData : : SurfaceDataSystemRequestBus : : Events : : UnregisterSurfaceDataProvider , m_providerHandle ) ;
m_providerHandle = SurfaceData : : InvalidSurfaceDataRegistryHandle ;
}
SurfaceDataProviderRequestBus : : Handler : : BusDisconnect ( ) ;
AZ : : HeightmapUpdateNotificationBus : : Handler : : BusDisconnect ( ) ;
CrySystemEventBus : : Handler : : BusDisconnect ( ) ;
m_system = nullptr ;
SurfaceData : : SurfaceDataProviderRequestBus : : Handler : : BusDisconnect ( ) ;
AzFramework : : Terrain : : TerrainDataNotificationBus : : Handler : : BusDisconnect ( ) ;
// Clear the cached terrain bounds data
{
@ -146,17 +139,8 @@ namespace SurfaceData
return false ;
}
void TerrainSurfaceDataSystemComponent : : OnCrySystemInitialized ( ISystem & system , [[maybe_unused]] const SSystemInitParams & systemInitParams )
{
m_system = & system ;
}
void TerrainSurfaceDataSystemComponent : : OnCrySystemShutdown ( [[maybe_unused]] ISystem & system )
{
m_system = nullptr ;
}
void TerrainSurfaceDataSystemComponent : : GetSurfacePoints ( const AZ : : Vector3 & inPosition , SurfacePointList & surfacePointList ) const
void TerrainSurfaceDataSystemComponent : : GetSurfacePoints (
const AZ : : Vector3 & inPosition , SurfaceData : : SurfacePointList & surfacePointList ) const
{
if ( m_terrainBoundsIsValid )
{
@ -168,12 +152,13 @@ namespace SurfaceData
const float terrainHeight = terrain - > GetHeight ( inPosition , AzFramework : : Terrain : : TerrainDataRequests : : Sampler : : BILINEAR , & isTerrainValidAtPoint ) ;
const bool isHole = ! isTerrainValidAtPoint ;
Surface Point point ;
Surface Data: : Surface Point point ;
point . m_entityId = GetEntityId ( ) ;
point . m_position = AZ : : Vector3 ( inPosition . GetX ( ) , inPosition . GetY ( ) , terrainHeight ) ;
point . m_normal = terrain - > GetNormal ( inPosition ) ;
const AZ : : Crc32 terrainTag = isHole ? Constants : : s_terrainHoleTagCrc : Constants : : s_terrainTagCrc ;
AddMaxValueForMasks ( point . m_masks , terrainTag , 1.0f ) ;
const AZ : : Crc32 terrainTag =
isHole ? SurfaceData : : Constants : : s_terrainHoleTagCrc : SurfaceData : : Constants : : s_terrainTagCrc ;
SurfaceData : : AddMaxValueForMasks ( point . m_masks , terrainTag , 1.0f ) ;
surfacePointList . push_back ( point ) ;
}
// Only one handler should exist.
@ -189,11 +174,11 @@ namespace SurfaceData
return terrain ? terrain - > GetTerrainAabb ( ) : AZ : : Aabb : : CreateNull ( ) ;
}
Surface TagVector TerrainSurfaceDataSystemComponent : : GetSurfaceTags ( ) const
Surface Data: : Surface TagVector TerrainSurfaceDataSystemComponent : : GetSurfaceTags ( ) const
{
Surface TagVector tags ;
tags . push_back ( Constants: : s_terrainHoleTagCrc ) ;
tags . push_back ( Constants: : s_terrainTagCrc ) ;
Surface Data: : Surface TagVector tags ;
tags . push_back ( SurfaceData: : Constants: : s_terrainHoleTagCrc ) ;
tags . push_back ( SurfaceData: : Constants: : s_terrainTagCrc ) ;
return tags ;
}
@ -203,7 +188,7 @@ namespace SurfaceData
bool terrainValidAfterUpdate = false ;
AZ : : Aabb terrainBoundsBeforeUpdate = m_terrainBounds ;
SurfaceData RegistryEntry registryEntry ;
SurfaceData : : SurfaceData RegistryEntry registryEntry ;
registryEntry . m_entityId = GetEntityId ( ) ;
registryEntry . m_bounds = GetSurfaceAabb ( ) ;
registryEntry . m_tags = GetSurfaceTags ( ) ;
@ -215,38 +200,44 @@ namespace SurfaceData
if ( terrainValidBeforeUpdate & & terrainValidAfterUpdate )
{
AZ_Assert ( ( m_providerHandle ! = InvalidSurfaceDataRegistryHandle) , " Invalid surface data handle " ) ;
AZ_Assert ( ( m_providerHandle ! = SurfaceData: : InvalidSurfaceDataRegistryHandle) , " Invalid surface data handle " ) ;
// Our terrain was valid before and after, it just changed in some way. If we have a valid dirty region passed in
// then it's possible that the heightmap has been modified in the Editor. Otherwise, just notify that the entire
// terrain has changed in some way.
if ( dirtyRegion . IsValid ( ) )
{
SurfaceDataSystemRequestBus : : Broadcast ( & SurfaceDataSystemRequestBus : : Events : : RefreshSurfaceData , dirtyRegion ) ;
SurfaceData : : SurfaceDataSystemRequestBus : : Broadcast (
& SurfaceData : : SurfaceDataSystemRequestBus : : Events : : RefreshSurfaceData , dirtyRegion ) ;
}
else
{
SurfaceDataSystemRequestBus : : Broadcast ( & SurfaceDataSystemRequestBus : : Events : : UpdateSurfaceDataProvider , m_providerHandle , registryEntry ) ;
SurfaceData : : SurfaceDataSystemRequestBus : : Broadcast (
& SurfaceData : : SurfaceDataSystemRequestBus : : Events : : UpdateSurfaceDataProvider , m_providerHandle , registryEntry ) ;
}
}
else if ( ! terrainValidBeforeUpdate & & terrainValidAfterUpdate )
{
// Our terrain has become valid, so register as a provider and save off the registry handles
AZ_Assert ( ( m_providerHandle = = InvalidSurfaceDataRegistryHandle ) , " Surface Provider data handle is initialized before our terrain became valid " ) ;
SurfaceDataSystemRequestBus : : BroadcastResult ( m_providerHandle , & SurfaceDataSystemRequestBus : : Events : : RegisterSurfaceDataProvider , registryEntry ) ;
AZ_Assert (
( m_providerHandle = = SurfaceData : : InvalidSurfaceDataRegistryHandle ) ,
" Surface Provider data handle is initialized before our terrain became valid " ) ;
SurfaceData : : SurfaceDataSystemRequestBus : : BroadcastResult (
m_providerHandle , & SurfaceData : : SurfaceDataSystemRequestBus : : Events : : RegisterSurfaceDataProvider , registryEntry ) ;
// Start listening for surface data events
AZ_Assert ( ( m_providerHandle ! = InvalidSurfaceDataRegistryHandle ) , " Invalid surface data handle " ) ;
SurfaceData ProviderRequestBus: : Handler : : BusConnect ( m_providerHandle ) ;
AZ_Assert ( ( m_providerHandle ! = SurfaceData: : InvalidSurfaceDataRegistryHandle) , " Invalid surface data handle " ) ;
SurfaceData : : SurfaceData ProviderRequestBus: : Handler : : BusConnect ( m_providerHandle ) ;
}
else if ( terrainValidBeforeUpdate & & ! terrainValidAfterUpdate )
{
// Our terrain has stopped being valid, so unregister and stop listening for surface data events
AZ_Assert ( ( m_providerHandle ! = InvalidSurfaceDataRegistryHandle ) , " Invalid surface data handle " ) ;
SurfaceDataSystemRequestBus : : Broadcast ( & SurfaceDataSystemRequestBus : : Events : : UnregisterSurfaceDataProvider , m_providerHandle ) ;
m_providerHandle = InvalidSurfaceDataRegistryHandle ;
AZ_Assert ( ( m_providerHandle ! = SurfaceData : : InvalidSurfaceDataRegistryHandle ) , " Invalid surface data handle " ) ;
SurfaceData : : SurfaceDataSystemRequestBus : : Broadcast (
& SurfaceData : : SurfaceDataSystemRequestBus : : Events : : UnregisterSurfaceDataProvider , m_providerHandle ) ;
m_providerHandle = SurfaceData : : InvalidSurfaceDataRegistryHandle ;
SurfaceData ProviderRequestBus: : Handler : : BusDisconnect ( ) ;
SurfaceData : : SurfaceData ProviderRequestBus: : Handler : : BusDisconnect ( ) ;
}
else
{
@ -255,8 +246,9 @@ namespace SurfaceData
}
void TerrainSurfaceDataSystemComponent : : HeightmapModified ( const AZ : : Aabb & bounds )
void TerrainSurfaceDataSystemComponent : : OnTerrainDataChanged (
const AZ : : Aabb & dirtyRegion , [[maybe_unused]] TerrainDataChangedMask dataChangedMask )
{
UpdateTerrainData ( bounds ) ;
UpdateTerrainData ( dirtyRegion ) ;
}
}