2019-12-26 14:45:42 -05:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
2019-07-10 13:31:21 -04:00
|
|
|
|
|
|
|
|
#include "NavigationDirtyAreasController.h"
|
|
|
|
|
#include "NavigationData.h"
|
|
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------//
|
|
|
|
|
// FNavigationDirtyAreasController
|
|
|
|
|
//----------------------------------------------------------------------//
|
|
|
|
|
FNavigationDirtyAreasController::FNavigationDirtyAreasController()
|
|
|
|
|
: bCanAccumulateDirtyAreas(true)
|
2019-07-10 13:40:29 -04:00
|
|
|
#if !UE_BUILD_SHIPPING
|
2019-07-10 13:31:21 -04:00
|
|
|
, bDirtyAreasReportedWhileAccumulationLocked(false)
|
2019-07-10 13:40:29 -04:00
|
|
|
#endif // !UE_BUILD_SHIPPING
|
2019-07-10 13:31:21 -04:00
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2019-11-12 16:04:24 -05:00
|
|
|
void FNavigationDirtyAreasController::ForceRebuildOnNextTick()
|
|
|
|
|
{
|
|
|
|
|
float MinTimeForUpdate = (DirtyAreasUpdateFreq != 0.f ? (1.0f / DirtyAreasUpdateFreq) : 0.f);
|
|
|
|
|
DirtyAreasUpdateTime = FMath::Max(DirtyAreasUpdateTime, MinTimeForUpdate);
|
|
|
|
|
}
|
|
|
|
|
|
2019-07-10 13:31:21 -04:00
|
|
|
void FNavigationDirtyAreasController::Tick(const float DeltaSeconds, const TArray<ANavigationData*>& NavDataSet, bool bForceRebuilding)
|
|
|
|
|
{
|
|
|
|
|
DirtyAreasUpdateTime += DeltaSeconds;
|
|
|
|
|
const bool bCanRebuildNow = bForceRebuilding || (DirtyAreasUpdateFreq != 0.f && DirtyAreasUpdateTime >= (1.0f / DirtyAreasUpdateFreq));
|
|
|
|
|
|
|
|
|
|
if (DirtyAreas.Num() > 0 && bCanRebuildNow)
|
|
|
|
|
{
|
|
|
|
|
for (ANavigationData* NavData : NavDataSet)
|
|
|
|
|
{
|
|
|
|
|
if (NavData)
|
|
|
|
|
{
|
|
|
|
|
NavData->RebuildDirtyAreas(DirtyAreas);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DirtyAreasUpdateTime = 0.f;
|
|
|
|
|
DirtyAreas.Reset();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FNavigationDirtyAreasController::AddArea(const FBox& NewArea, int32 Flags)
|
|
|
|
|
{
|
|
|
|
|
if (Flags > 0 && bCanAccumulateDirtyAreas && NewArea.IsValid)
|
|
|
|
|
{
|
|
|
|
|
DirtyAreas.Add(FNavigationDirtyArea(NewArea, Flags));
|
|
|
|
|
}
|
|
|
|
|
#if !UE_BUILD_SHIPPING
|
|
|
|
|
bDirtyAreasReportedWhileAccumulationLocked = bDirtyAreasReportedWhileAccumulationLocked || (Flags > 0 && !bCanAccumulateDirtyAreas);
|
|
|
|
|
#endif // !UE_BUILD_SHIPPING
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FNavigationDirtyAreasController::Reset()
|
|
|
|
|
{
|
|
|
|
|
// discard all pending dirty areas, we are going to rebuild navmesh anyway
|
|
|
|
|
DirtyAreas.Reset();
|
|
|
|
|
#if !UE_BUILD_SHIPPING
|
|
|
|
|
bDirtyAreasReportedWhileAccumulationLocked = false;
|
|
|
|
|
#endif // !UE_BUILD_SHIPPING
|
|
|
|
|
}
|