28 template<
class TraverseLogic,
class EdgeIntersector>
29 class BreadthFirstSearchEdgeCollisionCollector
34 BreadthFirstSearchEdgeCollisionCollector(
void* traverseLogicUserData, EdgeIntersector& edgeIntersector, WorkingMemArray<NavHalfEdgeRawPtr>* nearbyEdges);
36 bool IsSearchFinished();
37 bool ShouldVisitNeighborTriangle(const NavTriangleRawPtr& triangleRawPtr,
KyUInt32 indexOfNeighborTriangle);
38 bool ShouldVisitTriangle(const NavTriangleRawPtr& triangleRawPtr);
40 NavTriangleRawPtr GetNeighborTriangle(const NavTriangleRawPtr& triangleRawPtr,
KyUInt32 indexOfNeighborTriangle);
42 void Visit(const NavTriangleRawPtr& triangleRawPtr, const TriangleStatusInGrid& triangleStatus);
45 EdgeIntersector* m_edgeIntersector;
46 void* m_traverseLogicUserData;
47 bool m_collisionFound;
49 WorkingMemArray<NavHalfEdgeRawPtr>* m_intersectedHalfEdgeRawPtrArray;
52 bool m_shouldVisitNeighborTriangle[3];
53 NavTriangleRawPtr m_neighborTriangle[3];
56 template<class TraverseLogic, class EdgeIntersector>
57 KY_INLINE BreadthFirstSearchEdgeCollisionCollector<TraverseLogic, EdgeIntersector>::BreadthFirstSearchEdgeCollisionCollector(
void* traverseLogicUserData, EdgeIntersector& edgeIntersector, WorkingMemArray<NavHalfEdgeRawPtr>* nearbyEdges)
58 : m_edgeIntersector(&edgeIntersector)
59 , m_traverseLogicUserData(traverseLogicUserData)
60 , m_collisionFound(false)
61 , m_intersectedHalfEdgeRawPtrArray(nearbyEdges)
63 m_shouldVisitNeighborTriangle[0] =
true;
64 m_shouldVisitNeighborTriangle[1] =
true;
65 m_shouldVisitNeighborTriangle[2] =
true;
68 template<
class TraverseLogic,
class EdgeIntersector>
69 KY_INLINE
bool BreadthFirstSearchEdgeCollisionCollector<TraverseLogic, EdgeIntersector>::IsSearchFinished()
74 template<
class TraverseLogic,
class EdgeIntersector>
75 KY_INLINE
bool BreadthFirstSearchEdgeCollisionCollector<TraverseLogic, EdgeIntersector>::ShouldVisitNeighborTriangle(
const NavTriangleRawPtr& ,
KyUInt32 indexOfNeighborTriangle)
77 return m_shouldVisitNeighborTriangle[indexOfNeighborTriangle];
80 template<
class TraverseLogic,
class EdgeIntersector>
81 KY_INLINE
bool BreadthFirstSearchEdgeCollisionCollector<TraverseLogic, EdgeIntersector>::ShouldVisitTriangle(
const NavTriangleRawPtr& )
86 template<
class TraverseLogic,
class EdgeIntersector>
87 KY_INLINE NavTriangleRawPtr BreadthFirstSearchEdgeCollisionCollector<TraverseLogic, EdgeIntersector>::GetNeighborTriangle(
const NavTriangleRawPtr& ,
KyUInt32 indexOfNeighborTriangle)
89 return m_neighborTriangle[indexOfNeighborTriangle];
92 template<
class TraverseLogic,
class EdgeIntersector>
93 void BreadthFirstSearchEdgeCollisionCollector<TraverseLogic, EdgeIntersector>::Visit(
const NavTriangleRawPtr& triangleRawPtr,
94 const TriangleStatusInGrid& triangleStatus)
98 NavHalfEdgeRawPtr halfEdgeRawPtr[3];
99 NavHalfEdge halfEdge[3];
100 bool isACrossableEdges[3];
101 bool neighborTriangleAlreadyVisited[3];
102 bool doesIntersectsEdges[3];
105 NavFloor* navFloor = triangleRawPtr.GetNavFloor();
108 halfEdgeRawPtr[i].Set(navFloor, firstNavHalfEdgeIdx + i);
110 triangleRawPtr.GetVerticesCoordPos64(v0, v1, v2);
112 const NavFloorBlob& navFloorBlob = *navFloor->GetNavFloorBlob();
113 const NavHalfEdge* m_navHalfEdges = navFloorBlob.m_navHalfEdges.GetValues();
116 halfEdge[i] = m_navHalfEdges[firstNavHalfEdgeIdx + i];
120 NavHalfEdgeRawPtr pairHalfEdgeRawPtr;
121 isACrossableEdges[i] = halfEdgeRawPtr[i].IsHalfEdgeCrossable<TraverseLogic>(m_traverseLogicUserData, halfEdge[i], &navFloorBlob, pairHalfEdgeRawPtr);
123 if (isACrossableEdges[i])
129 neighborTriangleAlreadyVisited[i] = triangleStatus.IsTriangleOpen_Unsafe(m_neighborTriangle[i]);
131 neighborTriangleAlreadyVisited[i] = triangleStatus.IsTriangleOpen(m_neighborTriangle[i]);
135 neighborTriangleAlreadyVisited[i] =
false;
141 doesIntersectsEdges[i] = neighborTriangleAlreadyVisited[i] || m_edgeIntersector->DoesIntersectEdge(*vertex[i], *vertex[i+1]);
142 if (doesIntersectsEdges[i] && (isACrossableEdges[i] ==
false))
143 m_intersectedHalfEdgeRawPtrArray->PushBack(halfEdgeRawPtr[i]);
147 (isACrossableEdges[0] ==
false && doesIntersectsEdges[0]) ||
148 (isACrossableEdges[1] ==
false && doesIntersectsEdges[1]) ||
149 (isACrossableEdges[2] ==
false && doesIntersectsEdges[2]);
152 m_shouldVisitNeighborTriangle[i] = isACrossableEdges[i] && neighborTriangleAlreadyVisited[i] ==
false && doesIntersectsEdges[i];
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