Files
UnrealEngine/Engine/Plugins/AI/MassAI/Source/MassNavMeshNavigation/Public/MassNavMeshNavigationFragments.h
2025-05-18 13:04:45 +08:00

136 lines
3.4 KiB
C

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "MassEntityTypes.h"
#include "MassCommonTypes.h"
#include "MassNavigationTypes.h"
#include "AI/Navigation/NavigationTypes.h"
#include "Containers/StaticArray.h"
#include "MassNavMeshNavigationFragments.generated.h"
#define UE_API MASSNAVMESHNAVIGATION_API
struct FNavCorridor;
/** Navmesh path point data */
USTRUCT()
struct FMassNavMeshPathPoint
{
GENERATED_BODY()
/** Portal left limit. */
FVector Left = FVector::ZeroVector;
/** Portal right limit. */
FVector Right = FVector::ZeroVector;
/** Position of the path. */
FVector Position = FVector::ZeroVector;
/** Tangent direction of the path. */
FMassSnorm8Vector2D Tangent;
/** Distance along the path from first point. */
FMassInt16Real Distance = FMassInt16Real(0.f);
};
/** Short path used for navmesh navigation */
USTRUCT()
struct FMassNavMeshShortPathFragment : public FMassFragment
{
GENERATED_BODY()
FMassNavMeshShortPathFragment() = default;
/* Maximum number of points on the short path */
static constexpr uint8 MaxPoints = 8;
/* Number of points beyond the update point */
static constexpr uint8 NumPointsBeyondUpdate = 3;
void Reset()
{
MoveTargetProgressDistance = 0.f;
EndReachedDistance = 20.f;
NumPoints = 0;
EndOfPathIntent = EMassMovementAction::Stand;
bPartialResult = false;
bDone = false;
bInitialized = false;
}
/** Returns true if we are done progressing on the short path. */
bool IsDone() const
{
return NumPoints == 0 || bDone;
}
/** Fill Points from Corridor. */
UE_API bool RequestShortPath(const TSharedPtr<FNavCorridor>& InCorridor, const int32 InNavCorridorStartIndex, const uint8 InNumLeadingPoints, const float InEndReachedDistance);
/** Portal points */
TStaticArray<FMassNavMeshPathPoint, MaxPoints> Points;
/** Current progress distance along the short path. */
float MoveTargetProgressDistance = 0.f;
/** Distance from the end of path used to confirm that the destination is reached. */
float EndReachedDistance = 20.f;
/** Number of points on path. */
uint8 NumPoints = 0;
/** Intent at the end of the path. */
EMassMovementAction EndOfPathIntent = EMassMovementAction::Stand;
/** True if the path was partial. */
uint8 bPartialResult : 1 = false;
/** True when path follow is completed. */
uint8 bDone : 1 = false;
/** True when the path has been initalized. */
uint8 bInitialized : 1 = false;
};
enum class EMassNavigationPathSource : uint8
{
NavMesh,
Spline,
Unset
};
/** Current navmesh path */
USTRUCT()
struct FMassNavMeshCachedPathFragment : public FMassFragment
{
GENERATED_BODY()
/** Reference to a FNavigationPath. */
FNavPathSharedPtr NavPath;
/** Reference to an FNavCorridor. Built out of a navigation path. */
TSharedPtr<FNavCorridor> Corridor;
/** Index used to keep track of progression on the navmesh path. */
uint16 NavPathNextStartIndex = 0;
/** Source of the path, navmesh or else. */
EMassNavigationPathSource PathSource = EMassNavigationPathSource::Unset;
/** Number of points before the starting point. */
static constexpr uint8 NumLeadingPoints = 1;
};
USTRUCT()
struct FMassNavMeshBoundaryFragment : public FMassFragment
{
GENERATED_BODY()
/** MovementTarget position when UMassNavMeshNavigationBoundaryProcessor was last updated. Used to identify when a new update is needed. */
FVector LastUpdatePosition = FVector::ZeroVector;
};
#undef UE_API