pool now enables the actors also based on distance

This commit is contained in:
LuisPoveda 2022-10-26 23:33:00 +02:00 committed by bernat
parent 7a64bae1b5
commit dc69873710
4 changed files with 37 additions and 9 deletions
Unreal/CarlaUE4/Plugins/Carla/Source/Carla

View File

@ -85,10 +85,14 @@ void FPooledActor::DisableActor()
Actor->SetActorHiddenInGame(true);
Actor->SetActorEnableCollision(false);
Actor->SetActorTickEnabled(false);
Actor->SetTickableWhenPaused(false);
USpringBasedVegetationComponent* Component = Actor->FindComponentByClass<USpringBasedVegetationComponent>();
if (Component)
{
Component->SetComponentTickEnabled(false);
Component->SetTickableWhenPaused(false);
}
}
/********************************************************************************/
@ -204,12 +208,9 @@ void AVegetationManager::Tick(float DeltaTime)
}
if (!LargeMap)
return;
HeroVehicle = LargeMap->GetHeroVehicle();
if (!IsValid(HeroVehicle))
{
HeroVehicle = LargeMap->GetHeroVehicle();
if (!IsValid(HeroVehicle))
return;
}
HeroVehicle->UpdateDetectionBox();
TArray<FString> TilesInUse = GetTilesInUse();
@ -452,6 +453,7 @@ TArray<FElementsToSpawn> AVegetationManager::GetElementsToSpawn(FTileData* Tile)
TRACE_CPUPROFILER_EVENT_SCOPE(AVegetationManager::GetElementsToSpawn);
TArray<FElementsToSpawn> Results;
int32 i = -1;
for (FTileMeshComponent& Element : Tile->TileMeshesCache)
{
TRACE_CPUPROFILER_EVENT_SCOPE(Update Foliage Usage);
@ -480,8 +482,7 @@ TArray<FElementsToSpawn> AVegetationManager::GetElementsToSpawn(FTileData* Tile)
{
FTransform Transform;
InstancedStaticMeshComponent->GetInstanceTransform(Index, Transform, true);
FTransform GlobalTransform = LargeMap->LocalToGlobalTransform(Transform);
NewElement.TransformIndex.Emplace(TPair<FTransform, int32>(GlobalTransform, Index));
NewElement.TransformIndex.Emplace(TPair<FTransform, int32>(Transform, Index));
}
if (NewElement.TransformIndex.Num() > 0)
Results.Emplace(NewElement);
@ -492,6 +493,9 @@ TArray<FElementsToSpawn> AVegetationManager::GetElementsToSpawn(FTileData* Tile)
void AVegetationManager::SpawnSkeletalFoliages(TArray<FElementsToSpawn>& ElementsToSpawn)
{
TRACE_CPUPROFILER_EVENT_SCOPE(AVegetationManager::SpawnSkeletalFoliages);
const FTransform HeroTransform = LargeMap->LocalToGlobalTransform(HeroVehicle->GetActorTransform());
const FVector HeroLocation = HeroTransform.GetLocation();
for (FElementsToSpawn& Element : ElementsToSpawn)
{
TArray<FPooledActor>* Pool = ActorPool.Find(Element.BP.BPFullClassName);
@ -503,6 +507,9 @@ void AVegetationManager::SpawnSkeletalFoliages(TArray<FElementsToSpawn>& Element
int32 Index = TransformIndex.Value;
if (Element.TileMeshComponent->IndicesInUse.Contains(Index))
continue;
const float Distance = FMath::Abs(FVector::Dist(Transform.GetLocation(), HeroLocation));
if (Distance > (HideMaterialDistance * 2.0f))
continue;
bool Ok = EnableActorFromPool(Transform, Index, Element.TileMeshComponent, *Pool);
if (Ok)
{
@ -525,6 +532,9 @@ void AVegetationManager::SpawnSkeletalFoliages(TArray<FElementsToSpawn>& Element
void AVegetationManager::DestroySkeletalFoliages()
{
TRACE_CPUPROFILER_EVENT_SCOPE(AVegetationManager::DestroySkeletalFoliages);
const FTransform HeroTransform = LargeMap->LocalToGlobalTransform(HeroVehicle->GetActorTransform());
const FVector HeroLocation = HeroTransform.GetLocation();
for (TPair<FString, TArray<FPooledActor>>& Element : ActorPool)
{
TArray<FPooledActor>& Pool = Element.Value;
@ -533,7 +543,8 @@ void AVegetationManager::DestroySkeletalFoliages()
if (!Actor.InUse)
continue;
const FVector Location = Actor.GlobalTransform.GetLocation();
if (!HeroVehicle->IsInVehicleRange(Location))
const float Distance = FMath::Abs(FVector::Dist(Location, HeroLocation));
if (Distance > (HideMaterialDistance * 4.0f))
{
Actor.DisableActor();
}

View File

@ -109,7 +109,7 @@ public:
float SpawnScale {1.0f};
UPROPERTY(Category = "CARLA Vegetation Spwaner", EditDefaultsOnly)
int32 InitialPoolSize {10};
int32 InitialPoolSize {5};
/// @}
// ===========================================================================

View File

@ -224,7 +224,18 @@ void ACarlaWheeledVehicle::UpdateDetectionBox()
const TArray<int32> ACarlaWheeledVehicle::GetFoliageInstancesCloseToVehicle(const UInstancedStaticMeshComponent* Component) const
{
TRACE_CPUPROFILER_EVENT_SCOPE(ACarlaWheeledVehicle::GetFoliageInstancesCloseToVehicle);
return Component->GetInstancesOverlappingBox(FoliageBoundingBox);
return Component->GetInstancesOverlappingSphere(FoliageBoundingBox.GetCenter(), DetectionSize, true);
}
FBox ACarlaWheeledVehicle::GetDetectionBox() const
{
TRACE_CPUPROFILER_EVENT_SCOPE(ACarlaWheeledVehicle::GetDetectionBox);
return FoliageBoundingBox;
}
float ACarlaWheeledVehicle::GetDetectionSize() const
{
return DetectionSize;
}
void ACarlaWheeledVehicle::DrawFoliageBoundingBox() const

View File

@ -362,6 +362,12 @@ public:
UPROPERTY(Category = "CARLA Wheeled Vehicle", EditAnywhere)
UBoxComponent *VehicleBounds;
UFUNCTION()
FBox GetDetectionBox() const;
UFUNCTION()
float GetDetectionSize() const;
UFUNCTION()
void UpdateDetectionBox();