pool now enables the actors also based on distance
This commit is contained in:
parent
7a64bae1b5
commit
dc69873710
Unreal/CarlaUE4/Plugins/Carla/Source/Carla
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -109,7 +109,7 @@ public:
|
|||
float SpawnScale {1.0f};
|
||||
|
||||
UPROPERTY(Category = "CARLA Vegetation Spwaner", EditDefaultsOnly)
|
||||
int32 InitialPoolSize {10};
|
||||
int32 InitialPoolSize {5};
|
||||
|
||||
/// @}
|
||||
// ===========================================================================
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -362,6 +362,12 @@ public:
|
|||
UPROPERTY(Category = "CARLA Wheeled Vehicle", EditAnywhere)
|
||||
UBoxComponent *VehicleBounds;
|
||||
|
||||
UFUNCTION()
|
||||
FBox GetDetectionBox() const;
|
||||
|
||||
UFUNCTION()
|
||||
float GetDetectionSize() const;
|
||||
|
||||
UFUNCTION()
|
||||
void UpdateDetectionBox();
|
||||
|
||||
|
|
Loading…
Reference in New Issue