gwnavruntime/queries/utils/bestfirstsearch2dbordercollector.h Source File

bestfirstsearch2dbordercollector.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 
14 
15 namespace Kaim
16 {
17 
18 /*
19 class BestFirstSearch2dBorderCollector
20 
21 EdgeIntersector must have the following functions :
22 
23  bool DoesIntersectEdge(const Vec3f& startEdgePos, const Vec3f& endEdgePos);
24 
25  void ComputeCollisionPosOnEdge(const Vec3f& startEdgePos, const Vec3f& endEdgePos, Vec3f& collisionPos, KyFloat32& squareDistToCollisionPos)
26 
27  void ComputeTriangleCost(const Vec3f& v0, const Vec3f& v1, const Vec3f& v2, KyFloat32& cost)
28 
29 */
30 template<class TraverseLogic, class EdgeIntersector>
31 class BestFirstSearch2dBorderCollector
32 {
33  KY_DEFINE_NEW_DELETE_OPERATORS(MemStat_Query)
34 
35 public:
36  BestFirstSearch2dBorderCollector(void* traverseLogicUserData, EdgeIntersector& edgeIntersector);
37 
38  bool IsSearchFinished();
39 
40  bool ShouldVisitNeighborTriangle(const NavTriangleRawPtr& triangleRawPtr, KyUInt32 indexOfNeighborTriangle);
41  bool ShouldVisitTriangle(const NavTriangleRawPtr& triangleRawPtr);
42  void ComputeTriangleCost(const NavTriangleRawPtr& triangleRawPtr, KyFloat32& cost);
43 
44  NavTriangleRawPtr GetNeighborTriangle(const NavTriangleRawPtr& triangleRawPtr, KyUInt32 indexOfNeighborTriangle);
45 
46  void Visit(const NavTriangleRawPtr& triangleRawPtr, KyFloat32 cost, const TriangleStatusInGrid& triangleStatus);
47 
48 public:
49  EdgeIntersector* m_edgeIntersector;
50  void* m_traverseLogicUserData;
51  bool m_collisionFound;
52 
53  KyFloat32 m_squareDistToCollisionPos;
54  Vec3f m_collisionPos;
55  NavHalfEdgeRawPtr m_intersectedHalfEdgeRawPtr;
56 
57 private:
58  bool m_shouldVisitNeighborTriangle[3];
59  NavTriangleRawPtr m_neighborTriangle[3];
60 };
61 
62 template<class TraverseLogic, class EdgeIntersector>
63 KY_INLINE BestFirstSearch2dBorderCollector<TraverseLogic, EdgeIntersector>::BestFirstSearch2dBorderCollector(void* traverseLogicUserData, EdgeIntersector& edgeIntersector) :
64 m_edgeIntersector(&edgeIntersector), m_traverseLogicUserData(traverseLogicUserData), m_collisionFound(false),
65  m_squareDistToCollisionPos(KyFloat32MAXVAL)
66 {
67  m_shouldVisitNeighborTriangle[0] = true;
68  m_shouldVisitNeighborTriangle[1] = true;
69  m_shouldVisitNeighborTriangle[2] = true;
70 }
71 
72 template<class TraverseLogic, class EdgeIntersector>
73 KY_INLINE bool BestFirstSearch2dBorderCollector<TraverseLogic, EdgeIntersector>::IsSearchFinished() { return false; }
74 
75 template<class TraverseLogic, class EdgeIntersector>
76 KY_INLINE bool BestFirstSearch2dBorderCollector<TraverseLogic, EdgeIntersector>::ShouldVisitNeighborTriangle(const NavTriangleRawPtr& /*triangleRawPtr*/, KyUInt32 indexOfNeighborTriangle)
77 {
78  return m_shouldVisitNeighborTriangle[indexOfNeighborTriangle];
79 }
80 
81 template<class TraverseLogic, class EdgeIntersector>
82 KY_INLINE bool BestFirstSearch2dBorderCollector<TraverseLogic, EdgeIntersector>::ShouldVisitTriangle(const NavTriangleRawPtr& /*triangleRawPtr*/) { return true; }
83 
84 template<class TraverseLogic, class EdgeIntersector>
85 KY_INLINE NavTriangleRawPtr BestFirstSearch2dBorderCollector<TraverseLogic, EdgeIntersector>::GetNeighborTriangle(const NavTriangleRawPtr& /*triangleRawPtr*/, KyUInt32 indexOfNeighborTriangle)
86 {
87  return m_neighborTriangle[indexOfNeighborTriangle];
88 }
89 
90 template<class TraverseLogic, class EdgeIntersector>
91 void BestFirstSearch2dBorderCollector<TraverseLogic, EdgeIntersector>::ComputeTriangleCost(const NavTriangleRawPtr& triangleRawPtr, KyFloat32& cost)
92 {
93  CoordPos64 v0, v1, v2;
94  triangleRawPtr.GetVerticesCoordPos64(v0, v1, v2);
95  m_edgeIntersector->ComputeTriangleCost(v0, v1, v2, cost);
96 }
97 
98 template<class TraverseLogic, class EdgeIntersector>
99 void BestFirstSearch2dBorderCollector<TraverseLogic, EdgeIntersector>::Visit(const NavTriangleRawPtr& triangleRawPtr, const KyFloat32 /*triangleCost*/,
100  const TriangleStatusInGrid& triangleStatus)
101 {
102  CoordPos64 v0, v1, v2;
103  CoordPos64* vertex[4] = { &v0, &v1, &v2, &v0};
104  NavHalfEdgeRawPtr halfEdgeRawPtr[3];
105  NavHalfEdge halfEdge[3];
106  bool isACrossableEdges[3];
107  bool isVisibleEdges[3];
108  bool neighborTriangleAlreadyVisited[3];
109 
110  const NavHalfEdgeIdx firstNavHalfEdgeIdx = NavFloorBlob::NavTriangleIdxToFirstNavHalfEdgeIdx(triangleRawPtr.GetTriangleIdx());
111  NavFloor* navFloor = triangleRawPtr.GetNavFloor();
112 
113  for(KyUInt32 i = 0; i < 3; ++i)
114  halfEdgeRawPtr[i].Set(navFloor, firstNavHalfEdgeIdx + i);
115 
116  triangleRawPtr.GetVerticesCoordPos64(v0, v1, v2);
117 
118  const NavFloorBlob& navFloorBlob = *navFloor->GetNavFloorBlob();
119  const NavHalfEdge* m_navHalfEdges = navFloorBlob.m_navHalfEdges.GetValues();
120 
121  for(KyUInt32 i = 0; i < 3; ++i)
122  halfEdge[i] = m_navHalfEdges[firstNavHalfEdgeIdx + i];
123 
124  NavHalfEdgeRawPtr pairHalfEdgeRawPtr;
125  for(KyUInt32 i = 0; i < 3; ++i)
126  {
127  isACrossableEdges[i] = halfEdgeRawPtr[i].IsHalfEdgeCrossable<TraverseLogic>(m_traverseLogicUserData, halfEdge[i], &navFloorBlob, pairHalfEdgeRawPtr);
128  if (isACrossableEdges[i])
129  {
130  bool inSameFloor = halfEdge[i].GetHalfEdgeType() == EDGETYPE_PAIRED || halfEdge[i].GetHalfEdgeType() == EDGETYPE_CONNEXBOUNDARY;
131  m_neighborTriangle[i].Set(pairHalfEdgeRawPtr.GetNavFloor(), NavFloorBlob::NavHalfEdgeIdxToTriangleIdx(pairHalfEdgeRawPtr.GetHalfEdgeIdx()));
132 
133  if (inSameFloor)
134  neighborTriangleAlreadyVisited[i] = triangleStatus.IsTriangleOpen_Unsafe(m_neighborTriangle[i]);
135  else
136  neighborTriangleAlreadyVisited[i] = triangleStatus.IsTriangleOpen(m_neighborTriangle[i]);
137  }
138  else
139  {
140  neighborTriangleAlreadyVisited[i] = false;
141  }
142  }
143 
144  for(KyUInt32 i = 0; i < 3; ++i)
145  isVisibleEdges[i] = neighborTriangleAlreadyVisited[i] || m_edgeIntersector->IsEdgeVisible(*vertex[i], *vertex[i+1], halfEdgeRawPtr[i], isACrossableEdges[i]);
146 
147  for(KyUInt32 i = 0; i < 3; ++i)
148  {
149  m_shouldVisitNeighborTriangle[i] = neighborTriangleAlreadyVisited[i]==false && isVisibleEdges[i] && isACrossableEdges[i];
150  }
151 }
152 
153 }
154 
155 
156 
#define KyFloat32MAXVAL
KyFloat32 max value
Definition: types.h:71
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
float KyFloat32
float
Definition: types.h:32