Files
UnrealEngineUWP/Engine/Source/Runtime/Foliage/Private/FoliageStatistics.cpp
aurel cordonnier e3f7878676 Merge from Release-Engine-Test @ 17462327 to UE5/Main
This represents UE4/Main @17430120 and Dev-PerfTest @17437669

[CL 17463546 by aurel cordonnier in ue5-main branch]
2021-09-08 16:42:26 -04:00

109 lines
3.1 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "FoliageStatistics.h"
#include "EngineGlobals.h"
#include "Engine/Engine.h"
#include "Engine/StaticMesh.h"
#include "EngineUtils.h"
#include "InstancedFoliageActor.h"
//////////////////////////////////////////////////////////////////////////
// UFoliageStatics
UFoliageStatistics::UFoliageStatistics(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
}
int32 UFoliageStatistics::FoliageOverlappingSphereCount(UObject* WorldContextObject, const UStaticMesh* StaticMesh, FVector CenterPosition, float Radius)
{
int32 Count = 0;
if (UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull))
{
const UObject* Source = Cast<UObject>(StaticMesh);
const FSphere Sphere(CenterPosition, Radius);
for (TActorIterator<AInstancedFoliageActor> It(World); It; ++It)
{
AInstancedFoliageActor* IFA = *It;
if (IsValid(IFA))
{
TArray<const UFoliageType*> FoliageTypes;
IFA->GetAllFoliageTypesForSource(Source, FoliageTypes);
for (const auto Type : FoliageTypes)
{
Count += IFA->GetOverlappingSphereCount(Type, Sphere);
}
}
}
}
return Count;
}
int32 UFoliageStatistics::FoliageOverlappingBoxCount(UObject* WorldContextObject, const UStaticMesh* StaticMesh, FBox Box)
{
int32 Count = 0;
const UObject* Source = Cast<UObject>(StaticMesh);
if (UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull))
{
for (TActorIterator<AInstancedFoliageActor> It(World); It; ++It)
{
AInstancedFoliageActor* IFA = *It;
if (IsValid(IFA))
{
TArray<const UFoliageType*> FoliageTypes;
IFA->GetAllFoliageTypesForSource(Source, FoliageTypes);
for (const auto Type : FoliageTypes)
{
Count += IFA->GetOverlappingBoxCount(Type, Box);
}
}
}
}
return Count;
}
void UFoliageStatistics::FoliageOverlappingBoxTransforms(UObject* WorldContextObject, const UStaticMesh* StaticMesh, FBox Box, TArray<FTransform>& OutTransforms)
{
if (UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull))
{
const UObject* Source = Cast<UObject>(StaticMesh);
for (TActorIterator<AInstancedFoliageActor> It(World); It; ++It)
{
AInstancedFoliageActor* IFA = *It;
if (IsValid(IFA))
{
TArray<const UFoliageType*> FoliageTypes;
IFA->GetAllFoliageTypesForSource(Source, FoliageTypes);
for (const auto Type : FoliageTypes)
{
IFA->GetOverlappingBoxTransforms(Type, Box, OutTransforms);
}
}
}
}
}
void UFoliageStatistics::FoliageOverlappingMeshCounts_Debug(UObject* WorldContextObject, FVector CenterPosition, float Radius, TMap<UStaticMesh*, int32>& OutMeshCounts)
{
if (UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull))
{
const FSphere Sphere(CenterPosition, Radius);
OutMeshCounts.Reset();
for (TActorIterator<AInstancedFoliageActor> It(World); It; ++It)
{
AInstancedFoliageActor* IFA = *It;
if (IsValid(IFA))
{
IFA->GetOverlappingMeshCounts(Sphere, OutMeshCounts);
}
}
}
}