void ANavModifierVolume::GetNavigationData(FNavigationRelevantData& Data) const { if (Brush && AreaClass && AreaClass != UNavigationSystem::GetDefaultWalkableArea()) { FAreaNavModifier AreaMod(GetBrushComponent(), AreaClass); Data.Modifiers.Add(AreaMod); } }
void UNavCollision::GetNavigationModifier(FCompositeNavModifier& Modifier, const FTransform& LocalToWorld) { QUICK_SCOPE_CYCLE_COUNTER(STAT_NavCollision_GetNavigationModifier); const TSubclassOf<UNavArea> UseAreaClass = AreaClass ? AreaClass : UNavigationSystem::GetDefaultObstacleArea(); Modifier.ReserveForAdditionalAreas(CylinderCollision.Num() + BoxCollision.Num() + (ConvexCollision.VertexBuffer.Num() > 0 ? ConvexShapeIndices.Num() : 0)); for (int32 i = 0; i < CylinderCollision.Num(); i++) { FTransform CylinderToWorld = LocalToWorld; const FVector Origin = CylinderToWorld.TransformPosition(CylinderCollision[i].Offset); CylinderToWorld.SetTranslation(Origin); FAreaNavModifier AreaMod(CylinderCollision[i].Radius, CylinderCollision[i].Height, CylinderToWorld, UseAreaClass); AreaMod.SetIncludeAgentHeight(true); Modifier.Add(AreaMod); } for (int32 i = 0; i < BoxCollision.Num(); i++) { FTransform BoxToWorld = LocalToWorld; const FVector Origin = BoxToWorld.TransformPosition(BoxCollision[i].Offset); BoxToWorld.SetTranslation(Origin); FAreaNavModifier AreaMod(BoxCollision[i].Extent, BoxToWorld, UseAreaClass); AreaMod.SetIncludeAgentHeight(true); Modifier.Add(AreaMod); } if (ShouldUseConvexCollision()) { // rebuild collision data if needed if (!bHasConvexGeometry) { GatherCollision(); } if (ConvexCollision.VertexBuffer.Num() > 0) { int32 LastVertIndex = 0; TArray<FVector> Verts(ConvexCollision.VertexBuffer); for (int32 i = 0; i < ConvexShapeIndices.Num(); i++) { int32 FirstVertIndex = LastVertIndex; LastVertIndex = ConvexShapeIndices.IsValidIndex(i + 1) ? ConvexShapeIndices[i + 1] : ConvexCollision.VertexBuffer.Num(); FAreaNavModifier AreaMod(Verts, FirstVertIndex, LastVertIndex, ENavigationCoordSystem::Unreal, LocalToWorld, UseAreaClass); AreaMod.SetIncludeAgentHeight(true); Modifier.Add(AreaMod); } } } }