18 template<
class TraverseLogic,
class EdgeIntersector>
19 class BreadthFirstSearchEdgeCollisionVisitor
24 BreadthFirstSearchEdgeCollisionVisitor(
void* traverseLogicUserData, const
CellBox& cellBox, EdgeIntersector& edgeIntersector)
25 : m_edgeIntersector(&edgeIntersector)
26 , m_traverseLogicUserData(traverseLogicUserData)
27 , m_collisionFound(false)
30 m_shouldVisitNeighborTriangle[0] =
true;
31 m_shouldVisitNeighborTriangle[1] =
true;
32 m_shouldVisitNeighborTriangle[2] =
true;
35 bool IsSearchFinished() {
return m_collisionFound; }
36 bool ShouldVisitNeighborTriangle(
const NavTriangleRawPtr&,
KyUInt32 indexOfNeighborTriangle) {
return m_shouldVisitNeighborTriangle[indexOfNeighborTriangle]; }
37 bool ShouldVisitTriangle(
const NavTriangleRawPtr& triangleRawPtr) {
return m_cellBox.DoesContain(triangleRawPtr.GetCellPos()); }
39 NavTriangleRawPtr GetNeighborTriangle(
const NavTriangleRawPtr&,
KyUInt32 indexOfNeighborTriangle) {
return m_neighborTriangle[indexOfNeighborTriangle]; }
41 void Visit(
const NavTriangleRawPtr& triangleRawPtr,
const TriangleStatusInGrid& triangleStatus)
45 NavHalfEdgeRawPtr halfEdgeRawPtr[3];
46 NavHalfEdge halfEdge[3];
47 bool isACrossableEdges[3];
48 bool neighborTriangleAlreadyVisited[3];
49 bool doesIntersectsEdges[3];
50 bool isNeighborInCellBox[3];
53 NavFloor* navFloor = triangleRawPtr.GetNavFloor();
56 halfEdgeRawPtr[i].Set(navFloor, firstNavHalfEdgeIdx + i);
58 triangleRawPtr.GetVerticesCoordPos64(v0, v1, v2);
60 const NavFloorBlob& navFloorBlob = *navFloor->GetNavFloorBlob();
61 const NavHalfEdge* m_navHalfEdges = navFloorBlob.m_navHalfEdges.GetValues();
64 halfEdge[i] = m_navHalfEdges[firstNavHalfEdgeIdx + i];
68 NavHalfEdgeRawPtr pairHalfEdgeRawPtr;
69 isACrossableEdges[i] = halfEdgeRawPtr[i].IsHalfEdgeCrossable<TraverseLogic>(m_traverseLogicUserData, halfEdge[i], &navFloorBlob, pairHalfEdgeRawPtr);
71 if (isACrossableEdges[i])
73 isNeighborInCellBox[i] = m_cellBox.DoesContain(pairHalfEdgeRawPtr.GetCellPos());
79 neighborTriangleAlreadyVisited[i] = triangleStatus.IsTriangleOpen_Unsafe(m_neighborTriangle[i]);
81 neighborTriangleAlreadyVisited[i] = triangleStatus.IsTriangleOpen(m_neighborTriangle[i]);
85 isNeighborInCellBox[i] =
true;
86 neighborTriangleAlreadyVisited[i] =
false;
91 doesIntersectsEdges[i] = neighborTriangleAlreadyVisited[i] || m_edgeIntersector->DoesIntersectEdge(*vertex[i], *vertex[i + 1]);
93 m_collisionFound = (isACrossableEdges[0] ==
false && doesIntersectsEdges[0]) ||
94 (isACrossableEdges[1] ==
false && doesIntersectsEdges[1]) ||
95 (isACrossableEdges[2] ==
false && doesIntersectsEdges[2]);
99 m_shouldVisitNeighborTriangle[i] = (isACrossableEdges[i] && !neighborTriangleAlreadyVisited[i] && doesIntersectsEdges[i] && isNeighborInCellBox[i]);
104 EdgeIntersector* m_edgeIntersector;
105 void* m_traverseLogicUserData;
106 bool m_collisionFound;
110 bool m_shouldVisitNeighborTriangle[3];
111 NavTriangleRawPtr m_neighborTriangle[3];
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