Files
UnrealEngine/Engine/Source/Runtime/NavigationSystem/Private/NavigationOctreeController.cpp
2025-05-18 13:04:45 +08:00

121 lines
3.8 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "NavigationOctreeController.h"
#include "NavigationSystem.h"
//----------------------------------------------------------------------//
// FNavigationOctreeController
//----------------------------------------------------------------------//
void FNavigationOctreeController::Reset()
{
if (NavOctree.IsValid())
{
NavOctree->Destroy();
NavOctree = nullptr;
}
PendingUpdates.Empty(32);
}
bool FNavigationOctreeController::HasPendingUpdateForElement(const FNavigationElementHandle Element) const
{
return PendingUpdates.Contains(Element);
}
void FNavigationOctreeController::SetNavigableGeometryStoringMode(FNavigationOctree::ENavGeometryStoringMode NavGeometryMode)
{
check(NavOctree.IsValid());
NavOctree->SetNavigableGeometryStoringMode(NavGeometryMode);
}
bool FNavigationOctreeController::GetNavOctreeElementData(const FNavigationElementHandle Element, ENavigationDirtyFlag& OutDirtyFlags, FBox& OutDirtyBounds)
{
const FOctreeElementId2* ElementId = GetNavOctreeIdForElement(Element);
if (ElementId != nullptr && IsValidElement(*ElementId))
{
// mark area occupied by given actor as dirty
const FNavigationOctreeElement& ElementData = NavOctree->GetElementById(*ElementId);
OutDirtyFlags = ElementData.Data->GetDirtyFlag();
OutDirtyBounds = ElementData.Bounds.GetBox();
return true;
}
return false;
}
// Deprecated
bool FNavigationOctreeController::GetNavOctreeElementData(const UObject& NodeOwner, int32& DirtyFlags, FBox& DirtyBounds)
{
ENavigationDirtyFlag TmpDirtyFlags = ENavigationDirtyFlag::None;
const bool bSuccess = GetNavOctreeElementData(FNavigationElementHandle(&NodeOwner), TmpDirtyFlags, DirtyBounds);
DirtyFlags = static_cast<int32>(TmpDirtyFlags);
return bSuccess;
}
// Deprecated
const FNavigationRelevantData* FNavigationOctreeController::GetDataForObject(const UObject& Object) const
{
return GetDataForElement(FNavigationElementHandle(&Object));
}
const FNavigationRelevantData* FNavigationOctreeController::GetDataForElement(const FNavigationElementHandle Element) const
{
if (const FOctreeElementId2* ElementId = GetNavOctreeIdForElement(Element); IsValidElement(ElementId))
{
return NavOctree->GetDataForID(*ElementId);
}
return nullptr;
}
// Deprecated
FNavigationRelevantData* FNavigationOctreeController::GetMutableDataForObject(const UObject& Object)
{
return GetMutableDataForElement(FNavigationElementHandle(&Object));
}
FNavigationRelevantData* FNavigationOctreeController::GetMutableDataForElement(const FNavigationElementHandle Element)
{
if (const FOctreeElementId2* ElementId = GetNavOctreeIdForElement(Element); IsValidElement(ElementId))
{
return NavOctree->GetMutableDataForID(*ElementId);
}
return nullptr;
}
//----------------------------------------------------------------------//
// Deprecated methods
//----------------------------------------------------------------------//
PRAGMA_DISABLE_DEPRECATION_WARNINGS
// Deprecated
bool FNavigationOctreeController::HasPendingObjectNavOctreeId(UObject& Object) const
{
return HasPendingUpdateForElement(FNavigationElementHandle(&Object));
}
// Deprecated
bool FNavigationOctreeController::HasObjectsNavOctreeId(const UObject& Object) const
{
return HasElementNavOctreeId(FNavigationElementHandle(&Object));
}
// Deprecated
const FOctreeElementId2* FNavigationOctreeController::GetObjectsNavOctreeId(const UObject& Object) const
{
return GetNavOctreeIdForElement(FNavigationElementHandle(&Object));
}
// Deprecated
void FNavigationOctreeController::RemoveObjectsNavOctreeId(const UObject& Object)
{
const FNavigationElementHandle ElementHandle(&Object);
if (const FOctreeElementId2* ElementId = GetNavOctreeIdForElement(ElementHandle); IsValidElement(ElementId))
{
RemoveNode(*ElementId, ElementHandle);
}
}
PRAGMA_ENABLE_DEPRECATION_WARNINGS