gwnavruntime/queries/utils/polylinecasthelper.h Source File

polylinecasthelper.h
Go to the documentation of this file.
1 /*
2 * Copyright 2015 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 // Primary contact: JUBA - secondary contact: NOBODY
9 #ifndef Navigation_PolylineCastHelper_H
10 #define Navigation_PolylineCastHelper_H
11 
17 
18 
19 namespace Kaim
20 {
21 class WorkingMemory;
22 class Vec3f;
23 class NavTrianglePtr;
24 
25 class PolylineCastHelper
26 {
27  KY_DEFINE_NEW_DELETE_OPERATORS(MemStat_Query)
28 
29 public:
30 
31  static KyResult RetrieveTriangleFromStartToEnd(WorkingMemory* workingMemory, Database* database, const Vec3f& start, const Vec3f& end,
32  NavTrianglePtr& inAndOutStartTrianglePtr, NavTrianglePtr& outStartTrianglePtr, Ptr<QueryDynamicOutput>& dynamicOutput);
33 
34  template<class TLogic>
35  static KyResult RunPolylineCastInTrapeze(WorkingMemory* workingMemory, Database* database, void* traverseLogicUserData,
36  QueryDynamicOutput* queryDynamicOutput, PolylineCastIntersector& intersector, const Vec3f& pathEdgeStart, const Vec3f& pathEdgeEnd,
37  const Vec3f& pointOnStartSideLeft, const Vec3f& pointOnEndSideLeft, const Vec3f& pointOnStartSideRight, const Vec3f& pointOnEndSideRight);
38 
39  template<class TLogic>
40  static KyResult RunPolylineCastInTriangle(WorkingMemory* workingMemory, Database* database, void* traverseLogicUserData,
41  QueryDynamicOutput* queryDynamicOutput, PolylineCastIntersector& intersector, const Vec3f& pathEdgeStart, const Vec3f& pathEdgeEnd,
42  const Vec3f& pointOnStartSideLeft, const Vec3f& pointOnStartSideRight, const Vec3f& pointOnEndSideLeft, const Vec3f& pointOnEndSideRight);
43 
44  template<class TLogic>
45  static KyResult RunPolylineCastInTriangleOnLeft(WorkingMemory* workingMemory, Database* database, void* traverseLogicUserData,
46  QueryDynamicOutput* queryDynamicOutput, PolylineCastIntersector& intersector, const Vec3f& pathEdgeStart, const Vec3f& pathEdgeEnd,
47  const Vec3f& pointOnStartSideLeft, const Vec3f& pointOnStartSideRight, const Vec3f& pointOnEndSideRight);
48 
49  template<class TLogic>
50  static KyResult RunPolylineCastInTriangleOnRight(WorkingMemory* workingMemory, Database* database, void* traverseLogicUserData,
51  QueryDynamicOutput* queryDynamicOutput, PolylineCastIntersector& intersector, const Vec3f& pathEdgeStart, const Vec3f& pathEdgeEnd,
52  const Vec3f& pointOnStartSideLeft, const Vec3f& pointOnEndSideLeft, const Vec3f& pointOnEndSideRight);
53 
54  template<class TLogic>
55  static KyResult RunPolylineCast(WorkingMemory* workingMemory, Database* database, void* traverseLogicUserData, QueryDynamicOutput* queryDynamicOutput, PolylineCastIntersector& intersector);
56 };
57 
58 
59 template<class TLogic>
60 inline KyResult PolylineCastHelper::RunPolylineCastInTrapeze(WorkingMemory* workingMemory, Database* database, void* traverseLogicUserData,
61  QueryDynamicOutput* queryDynamicOutput, PolylineCastIntersector& intersector, const Vec3f& pathEdgeStart, const Vec3f& pathEdgeEnd,
62  const Vec3f& pointOnStartSideLeft, const Vec3f& pointOnEndSideLeft, const Vec3f& pointOnStartSideRight, const Vec3f& pointOnEndSideRight)
63 {
64  intersector.InitTrapezoid(pathEdgeStart, pathEdgeEnd, pointOnStartSideLeft, pointOnEndSideLeft, pointOnStartSideRight, pointOnEndSideRight, database->GetDatabaseGenMetrics());
65  return RunPolylineCast<TLogic>(workingMemory, database, traverseLogicUserData, queryDynamicOutput, intersector);
66 }
67 
68 template<class TLogic>
69 inline KyResult PolylineCastHelper::RunPolylineCastInTriangle(WorkingMemory* workingMemory, Database* database, void* traverseLogicUserData,
70  QueryDynamicOutput* queryDynamicOutput, PolylineCastIntersector& intersector, const Vec3f& pathEdgeStart, const Vec3f& pathEdgeEnd,
71  const Vec3f& pointOnStartSideLeft, const Vec3f& pointOnStartSideRight, const Vec3f& pointOnEndSideLeft, const Vec3f& pointOnEndSideRight)
72 {
73  KY_ASSERT(pointOnStartSideLeft == pointOnEndSideLeft || pointOnStartSideRight == pointOnEndSideRight);
74  if (pointOnStartSideLeft == pointOnEndSideLeft)
75  return RunPolylineCastInTriangleOnLeft<TLogic>(workingMemory, database, traverseLogicUserData, queryDynamicOutput, intersector, pathEdgeStart,
76  pathEdgeEnd, pointOnStartSideLeft, pointOnStartSideRight, pointOnEndSideRight);
77  else
78  return RunPolylineCastInTriangleOnRight<TLogic>(workingMemory, database, traverseLogicUserData, queryDynamicOutput, intersector, pathEdgeStart,
79  pathEdgeEnd, pointOnStartSideLeft, pointOnStartSideRight, pointOnEndSideLeft);
80 }
81 
82 template<class TLogic>
83 inline KyResult PolylineCastHelper::RunPolylineCastInTriangleOnLeft(WorkingMemory* workingMemory, Database* database, void* traverseLogicUserData,
84  QueryDynamicOutput* queryDynamicOutput, PolylineCastIntersector& intersector, const Vec3f& pathEdgeStart, const Vec3f& pathEdgeEnd,
85  const Vec3f& pointOnStartSideLeft, const Vec3f& pointOnStartSideRight, const Vec3f& pointOnEndSideRight)
86 {
87  intersector.InitTriangleAroundLeft(pathEdgeStart, pathEdgeEnd, pointOnStartSideLeft, pointOnStartSideRight, pointOnEndSideRight,database->GetDatabaseGenMetrics());
88  return RunPolylineCast<TLogic>(workingMemory, database, traverseLogicUserData, queryDynamicOutput, intersector);
89 }
90 
91 template<class TLogic>
92 inline KyResult PolylineCastHelper::RunPolylineCastInTriangleOnRight(WorkingMemory* workingMemory, Database* database, void* traverseLogicUserData,
93  QueryDynamicOutput* queryDynamicOutput, PolylineCastIntersector& intersector, const Vec3f& pathEdgeStart, const Vec3f& pathEdgeEnd,
94  const Vec3f& pointOnStartSideLeft, const Vec3f& pointOnStartSideRight, const Vec3f& pointOnEndSideLeft)
95 {
96  intersector.InitTriangleAroundRight(pathEdgeStart, pathEdgeEnd, pointOnStartSideLeft, pointOnEndSideLeft, pointOnStartSideRight, database->GetDatabaseGenMetrics());
97  return RunPolylineCast<TLogic>(workingMemory, database, traverseLogicUserData, queryDynamicOutput, intersector);
98 }
99 
100 template<class TLogic>
101 inline KyResult PolylineCastHelper::RunPolylineCast(WorkingMemory* workingMemory, Database* database, void* traverseLogicUserData, QueryDynamicOutput* queryDynamicOutput, PolylineCastIntersector& intersector)
102 {
103  if (queryDynamicOutput == KY_NULL || queryDynamicOutput->GetNavTrianglePtrCount() == 0)
104  return KY_ERROR;
105 
106  QueryUtils queryUtils(database, workingMemory,traverseLogicUserData);
107  BestFirstSearch2dBorderCollector<TLogic, PolylineCastIntersector> edgeIntersectionVisitor(traverseLogicUserData, intersector);
108  BestFirstSearchTraversal<BestFirstSearch2dBorderCollector<TLogic, PolylineCastIntersector> > traversalForPolylineCast(queryUtils, database->GetActiveData()->GetCellBox(),
109  edgeIntersectionVisitor);
110 
111  if (traversalForPolylineCast.IsInitialized() == false)
112  return KY_ERROR;
113 
114  for(KyUInt32 i = 0; i < queryDynamicOutput->GetNavTrianglePtrCount(); ++i)
115  {
116  const NavTrianglePtr& triangle = queryDynamicOutput->GetNavTrianglePtr(i);
117  if (traversalForPolylineCast.SetStartTriangle(triangle.GetRawPtr()) != TraversalResult_DONE)
118  return KY_ERROR;
119  }
120 
121  if (traversalForPolylineCast.Search() != TraversalResult_DONE)
122  return KY_ERROR;
123 
124  return KY_SUCCESS;
125 }
126 }
127 
128 #endif //Navigation_PolylineCastHelper_H
129 
KyInt32 KyResult
Defines a type that can be returned by methods or functions in the Gameware Navigation SDK to indicat...
Definition: types.h:254
#define KY_NULL
Null value.
Definition: types.h:247
Definition: gamekitcrowddispersion.h:20
#define KY_SUCCESS
Shorthand for Kaim::Result::Success.
Definition: types.h:273
#define KY_ERROR
Shorthand for Kaim::Result::Failure.
Definition: types.h:272
#define KY_DEFINE_NEW_DELETE_OPERATORS(MemStat)
This macro defines new and delete operators.
Definition: memory.h:137
unsigned int KyUInt32
Type used internally to represent an unsigned 32-bit integer.
Definition: types.h:36