30 template<
class TraverseLogic,
class EdgeIntersector>
31 class BestFirstSearchEdgeCollisionVisitor
36 BestFirstSearchEdgeCollisionVisitor(
void* traverseLogicUserData, const
CellBox& cellBox, EdgeIntersector& edgeIntersector);
38 bool IsSearchFinished();
40 bool ShouldVisitNeighborTriangle(const NavTriangleRawPtr& triangleRawPtr,
KyUInt32 indexOfNeighborTriangle);
41 bool ShouldVisitTriangle(const NavTriangleRawPtr& triangleRawPtr);
42 void ComputeTriangleCost(const NavTriangleRawPtr& triangleRawPtr,
KyFloat32& cost);
44 NavTriangleRawPtr GetNeighborTriangle(const NavTriangleRawPtr& triangleRawPtr,
KyUInt32 indexOfNeighborTriangle);
46 void Visit(const NavTriangleRawPtr& triangleRawPtr,
KyFloat32 cost, const TriangleStatusInGrid& triangleStatus);
49 EdgeIntersector* m_edgeIntersector;
50 void* m_traverseLogicUserData;
51 bool m_collisionFound;
55 NavHalfEdgeRawPtr m_intersectedHalfEdgeRawPtr;
60 bool m_shouldVisitNeighborTriangle[3];
61 NavTriangleRawPtr m_neighborTriangle[3];
64 template<class TraverseLogic, class EdgeIntersector>
65 KY_INLINE BestFirstSearchEdgeCollisionVisitor<TraverseLogic, EdgeIntersector>::BestFirstSearchEdgeCollisionVisitor(
void* traverseLogicUserData, const
CellBox& cellBox, EdgeIntersector& edgeIntersector)
66 : m_edgeIntersector(&edgeIntersector)
67 , m_traverseLogicUserData(traverseLogicUserData)
68 , m_collisionFound(false)
71 , m_lastCost(KyFloat32MAXVAL)
73 m_shouldVisitNeighborTriangle[0] =
true;
74 m_shouldVisitNeighborTriangle[1] =
true;
75 m_shouldVisitNeighborTriangle[2] =
true;
78 template<
class TraverseLogic,
class EdgeIntersector>
79 KY_INLINE
bool BestFirstSearchEdgeCollisionVisitor<TraverseLogic, EdgeIntersector>::IsSearchFinished() {
return m_lastCost > m_squareDistToCollisionPos; }
81 template<
class TraverseLogic,
class EdgeIntersector>
82 KY_INLINE
bool BestFirstSearchEdgeCollisionVisitor<TraverseLogic, EdgeIntersector>::ShouldVisitNeighborTriangle(
const NavTriangleRawPtr& ,
KyUInt32 indexOfNeighborTriangle)
84 return m_shouldVisitNeighborTriangle[indexOfNeighborTriangle];
87 template<
class TraverseLogic,
class EdgeIntersector>
88 KY_INLINE
bool BestFirstSearchEdgeCollisionVisitor<TraverseLogic, EdgeIntersector>::ShouldVisitTriangle(
const NavTriangleRawPtr& triangleRawPtr)
90 return m_cellBox.DoesContain(triangleRawPtr.GetCellPos());
93 template<
class TraverseLogic,
class EdgeIntersector>
94 KY_INLINE NavTriangleRawPtr BestFirstSearchEdgeCollisionVisitor<TraverseLogic, EdgeIntersector>::GetNeighborTriangle(
const NavTriangleRawPtr& ,
KyUInt32 indexOfNeighborTriangle)
96 return m_neighborTriangle[indexOfNeighborTriangle];
99 template<
class TraverseLogic,
class EdgeIntersector>
100 void BestFirstSearchEdgeCollisionVisitor<TraverseLogic, EdgeIntersector>::ComputeTriangleCost(
const NavTriangleRawPtr& triangleRawPtr,
KyFloat32& cost)
103 triangleRawPtr.GetVerticesCoordPos64(v0, v1, v2);
104 m_edgeIntersector->ComputeTriangleCost(v0, v1, v2, cost);
107 template<
class TraverseLogic,
class EdgeIntersector>
108 void BestFirstSearchEdgeCollisionVisitor<TraverseLogic, EdgeIntersector>::Visit(
const NavTriangleRawPtr& triangleRawPtr,
const KyFloat32 triangleCost,
109 const TriangleStatusInGrid& triangleStatus)
112 CoordPos64* vertex[4] = { &v0, &v1, &v2, &v0};
113 NavHalfEdgeRawPtr halfEdgeRawPtr[3];
114 NavHalfEdge halfEdge[3];
115 bool isACrossableEdges[3];
116 bool neighborTriangleAlreadyVisited[3];
117 bool doesIntersectsEdges[3];
118 bool isNeighborInCellBox[3];
121 NavFloor* navFloor = triangleRawPtr.GetNavFloor();
124 halfEdgeRawPtr[i].Set(navFloor, firstNavHalfEdgeIdx + i);
126 triangleRawPtr.GetVerticesCoordPos64(v0, v1, v2);
128 const NavFloorBlob& navFloorBlob = *navFloor->GetNavFloorBlob();
129 const NavHalfEdge* m_navHalfEdges = navFloorBlob.m_navHalfEdges.GetValues();
132 halfEdge[i] = m_navHalfEdges[firstNavHalfEdgeIdx + i];
136 NavHalfEdgeRawPtr pairHalfEdgeRawPtr;
137 isACrossableEdges[i] = halfEdgeRawPtr[i].IsHalfEdgeCrossable<TraverseLogic>(m_traverseLogicUserData, halfEdge[i], &navFloorBlob, pairHalfEdgeRawPtr);
139 if (isACrossableEdges[i])
141 isNeighborInCellBox[i] = m_cellBox.DoesContain(pairHalfEdgeRawPtr.GetCellPos());
147 neighborTriangleAlreadyVisited[i] = triangleStatus.IsTriangleOpen_Unsafe(m_neighborTriangle[i]);
149 neighborTriangleAlreadyVisited[i] = triangleStatus.IsTriangleOpen(m_neighborTriangle[i]);
153 isNeighborInCellBox[i] =
true;
154 neighborTriangleAlreadyVisited[i] =
false;
159 doesIntersectsEdges[i] = neighborTriangleAlreadyVisited[i] || m_edgeIntersector->DoesIntersectEdge(*vertex[i], *vertex[i+1]);
161 m_lastCost = triangleCost;
163 if (isACrossableEdges[0] ==
false || isACrossableEdges[1] ==
false || isACrossableEdges[2] ==
false)
168 bool aCollisionFoundIsThisTriangle =
false;
172 if (isACrossableEdges[i] ==
false && doesIntersectsEdges[i])
174 m_edgeIntersector->ComputeCollisionPosOnEdge(*vertex[i], *vertex[i+1], collisionPos, squareDistToCollisionPos);
175 if (squareDistToCollisionPos < m_squareDistToCollisionPos)
177 m_squareDistToCollisionPos = squareDistToCollisionPos;
178 aCollisionFoundIsThisTriangle =
true;
179 m_collisionPos = collisionPos;
185 m_collisionFound = m_collisionFound || aCollisionFoundIsThisTriangle;
189 m_shouldVisitNeighborTriangle[i] = isACrossableEdges[i] && neighborTriangleAlreadyVisited[i] ==
false &&
190 doesIntersectsEdges[i] && isNeighborInCellBox[i];
#define KyFloat32MAXVAL
KyFloat32 max value
Definition: types.h:71
Box2i CellBox
A type that represents a bounding box around cells in a 2D grid.
Definition: navmeshtypes.h:31
std::uint32_t KyUInt32
uint32_t
Definition: types.h:29
KyUInt32 NavHalfEdgeIdx
An index that uniquely identifies a single edge of a triangle within the set of edges owned by a NavF...
Definition: navmeshtypes.h:84
Indicates that another NavHalfEdge in the same NavFloor but in different Connex lies adjacent to the ...
Definition: navmeshtypes.h:57
static NavHalfEdgeIdx NavTriangleIdxToFirstNavHalfEdgeIdx(NavTriangleIdx idx)
Retrieves the first NavHalfEdgeIdx of NavTriangle specified by the input NavTriangleIdx.
Definition: navfloorblob.inl:23
#define KY_DEFINE_NEW_DELETE_OPERATORS(MemStat)
This macro defines new and delete operators.
Definition: memory.h:132
Vec2LL CoordPos64
A type that represents the position of a point within the 2D integer grid.
Definition: navmeshtypes.h:16
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17
static NavTriangleIdx NavHalfEdgeIdxToTriangleIdx(NavHalfEdgeIdx idx)
Retrieves the index of the triangle that contains the edge specified the input NavHalfEdgeIdx.
Definition: navfloorblob.inl:22
Indicates that another NavHalfEdge in the same Connex lies adjacent to the NavHalfEdge.
Definition: navmeshtypes.h:58
static NavHalfEdgeIdx NavTriangleIdxToNavHalfEdgeIdx(NavTriangleIdx idx, KyInt32 halfEdgeNumber)
Retrieves one edge from the specified triangle.
Definition: navfloorblob.inl:25
float KyFloat32
float
Definition: types.h:32