gwnavruntime/queries/utils/breadthfirstsearchedgecollisioncollector.h Source File

breadthfirstsearchedgecollisioncollector.h
Go to the documentation of this file.
1 /*
2 * Copyright 2016 Autodesk, Inc. All rights reserved.
3 * Use of this software is subject to the terms of the Autodesk license agreement and any attachments or Appendices thereto provided at the time of installation or download,
4 * or which otherwise accompanies this software in either electronic or hard copy form, or which is signed by you and accepted by Autodesk.
5 */
6 
7 
8 
9 
10 
11 #pragma once
12 
16 
17 
18 namespace Kaim
19 {
20 
21 /*
22 class BreadthFirstSearchEdgeCollisionCollector
23 
24 EdgeIntersector must have the following functions :
25 
26  bool DoesIntersectEdge(const Vec3f& startEdgePos, const Vec3f& endEdgePos);
27 */
28 template<class TraverseLogic, class EdgeIntersector>
29 class BreadthFirstSearchEdgeCollisionCollector
30 {
31  KY_DEFINE_NEW_DELETE_OPERATORS(MemStat_Query)
32 
33 public:
34  BreadthFirstSearchEdgeCollisionCollector(void* traverseLogicUserData, EdgeIntersector& edgeIntersector, WorkingMemArray<NavHalfEdgeRawPtr>* nearbyEdges);
35 
36  bool IsSearchFinished();
37  bool ShouldVisitNeighborTriangle(const NavTriangleRawPtr& triangleRawPtr, KyUInt32 indexOfNeighborTriangle);
38  bool ShouldVisitTriangle(const NavTriangleRawPtr& triangleRawPtr);
39 
40  NavTriangleRawPtr GetNeighborTriangle(const NavTriangleRawPtr& triangleRawPtr, KyUInt32 indexOfNeighborTriangle);
41 
42  void Visit(const NavTriangleRawPtr& triangleRawPtr, const TriangleStatusInGrid& triangleStatus);
43 
44 public:
45  EdgeIntersector* m_edgeIntersector;
46  void* m_traverseLogicUserData;
47  bool m_collisionFound;
48 
49  WorkingMemArray<NavHalfEdgeRawPtr>* m_intersectedHalfEdgeRawPtrArray;
50 
51 private:
52  bool m_shouldVisitNeighborTriangle[3];
53  NavTriangleRawPtr m_neighborTriangle[3];
54 };
55 
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)
62 {
63  m_shouldVisitNeighborTriangle[0] = true;
64  m_shouldVisitNeighborTriangle[1] = true;
65  m_shouldVisitNeighborTriangle[2] = true;
66 }
67 
68 template<class TraverseLogic, class EdgeIntersector>
69 KY_INLINE bool BreadthFirstSearchEdgeCollisionCollector<TraverseLogic, EdgeIntersector>::IsSearchFinished()
70 {
71  return false;
72 }
73 
74 template<class TraverseLogic, class EdgeIntersector>
75 KY_INLINE bool BreadthFirstSearchEdgeCollisionCollector<TraverseLogic, EdgeIntersector>::ShouldVisitNeighborTriangle(const NavTriangleRawPtr& /*triangleRawPtr*/, KyUInt32 indexOfNeighborTriangle)
76 {
77  return m_shouldVisitNeighborTriangle[indexOfNeighborTriangle];
78 }
79 
80 template<class TraverseLogic, class EdgeIntersector>
81 KY_INLINE bool BreadthFirstSearchEdgeCollisionCollector<TraverseLogic, EdgeIntersector>::ShouldVisitTriangle(const NavTriangleRawPtr& /*triangleRawPtr*/)
82 {
83  return true;
84 }
85 
86 template<class TraverseLogic, class EdgeIntersector>
87 KY_INLINE NavTriangleRawPtr BreadthFirstSearchEdgeCollisionCollector<TraverseLogic, EdgeIntersector>::GetNeighborTriangle(const NavTriangleRawPtr& /*triangleRawPtr*/, KyUInt32 indexOfNeighborTriangle)
88 {
89  return m_neighborTriangle[indexOfNeighborTriangle];
90 }
91 
92 template<class TraverseLogic, class EdgeIntersector>
93 void BreadthFirstSearchEdgeCollisionCollector<TraverseLogic, EdgeIntersector>::Visit(const NavTriangleRawPtr& triangleRawPtr,
94  const TriangleStatusInGrid& triangleStatus)
95 {
96  CoordPos64 v0, v1, v2;
97  CoordPos64* vertex[4] = { &v0, &v1, &v2, &v0};
98  NavHalfEdgeRawPtr halfEdgeRawPtr[3];
99  NavHalfEdge halfEdge[3];
100  bool isACrossableEdges[3];
101  bool neighborTriangleAlreadyVisited[3];
102  bool doesIntersectsEdges[3];
103 
104  const NavHalfEdgeIdx firstNavHalfEdgeIdx = NavFloorBlob::NavTriangleIdxToFirstNavHalfEdgeIdx(triangleRawPtr.GetTriangleIdx());
105  NavFloor* navFloor = triangleRawPtr.GetNavFloor();
106 
107  for(KyUInt32 i = 0; i < 3; ++i)
108  halfEdgeRawPtr[i].Set(navFloor, firstNavHalfEdgeIdx + i);
109 
110  triangleRawPtr.GetVerticesCoordPos64(v0, v1, v2);
111 
112  const NavFloorBlob& navFloorBlob = *navFloor->GetNavFloorBlob();
113  const NavHalfEdge* m_navHalfEdges = navFloorBlob.m_navHalfEdges.GetValues();
114 
115  for(KyUInt32 i = 0; i < 3; ++i)
116  halfEdge[i] = m_navHalfEdges[firstNavHalfEdgeIdx + i];
117 
118  for(KyUInt32 i = 0; i < 3; ++i)
119  {
120  NavHalfEdgeRawPtr pairHalfEdgeRawPtr;
121  isACrossableEdges[i] = halfEdgeRawPtr[i].IsHalfEdgeCrossable<TraverseLogic>(m_traverseLogicUserData, halfEdge[i], &navFloorBlob, pairHalfEdgeRawPtr);
122 
123  if (isACrossableEdges[i])
124  {
125  bool inSameFloor = halfEdge[i].GetHalfEdgeType() == EDGETYPE_PAIRED || halfEdge[i].GetHalfEdgeType() == EDGETYPE_CONNEXBOUNDARY;
126  m_neighborTriangle[i].Set(pairHalfEdgeRawPtr.GetNavFloor(), NavFloorBlob::NavHalfEdgeIdxToTriangleIdx(pairHalfEdgeRawPtr.GetHalfEdgeIdx()));
127 
128  if (inSameFloor)
129  neighborTriangleAlreadyVisited[i] = triangleStatus.IsTriangleOpen_Unsafe(m_neighborTriangle[i]);
130  else
131  neighborTriangleAlreadyVisited[i] = triangleStatus.IsTriangleOpen(m_neighborTriangle[i]);
132  }
133  else
134  {
135  neighborTriangleAlreadyVisited[i] = false;
136  }
137  }
138 
139  for(KyUInt32 i = 0; i < 3; ++i)
140  {
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]);
144  }
145 
146  m_collisionFound =
147  (isACrossableEdges[0] == false && doesIntersectsEdges[0]) ||
148  (isACrossableEdges[1] == false && doesIntersectsEdges[1]) ||
149  (isACrossableEdges[2] == false && doesIntersectsEdges[2]);
150 
151  for(KyUInt32 i = 0; i < 3; ++i)
152  m_shouldVisitNeighborTriangle[i] = isACrossableEdges[i] && neighborTriangleAlreadyVisited[i] == false && doesIntersectsEdges[i];
153 }
154 
155 }
156 
157 
158 
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