gwnavruntime/queries/utils/polylinecasthelper.h Source File

polylinecasthelper.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 #pragma once
9 
15 
16 
17 namespace Kaim
18 {
19 class WorkingMemory;
20 class Vec3f;
21 class NavTrianglePtr;
22 
23 class PolylineCastHelper
24 {
25  KY_DEFINE_NEW_DELETE_OPERATORS(MemStat_Query)
26 
27 public:
28  static KyResult RetrieveTriangleFromStartToEnd(WorkingMemory* workingMemory, Database* database, const Vec3f& start, const Vec3f& end, NavTrianglePtr& io_startTrianglePtr,
29  NavTrianglePtr& o_endTrianglePtr, Ptr<QueryDynamicOutput>& dynOutput);
30 
31  template <class TLogic>
32  static KyResult RunPolylineCastInTrapeze(WorkingMemory* workingMemory, Database* database, void* traverseLogicUserData, QueryDynamicOutput* dynOutput,
33  PolylineCastIntersector& intersector, const Vec3f& startO, const Vec3f& endO, const Vec3f& startL, const Vec3f& endL,
34  const Vec3f& startR, const Vec3f& endR);
35 
36  template <class TLogic>
37  static KyResult RunPolylineCastInTriangle(WorkingMemory* workingMemory, Database* database, void* traverseLogicUserData, QueryDynamicOutput* dynOutput,
38  PolylineCastIntersector& intersector, const Vec3f& startO, const Vec3f& endO, const Vec3f& startL, const Vec3f& startR,
39  const Vec3f& endL, const Vec3f& endR);
40 
41  template <class TLogic>
42  static KyResult RunPolylineCastInTriangleOnLeft(WorkingMemory* workingMemory, Database* database, void* traverseLogicUserData, QueryDynamicOutput* dynOutput,
43  PolylineCastIntersector& intersector, const Vec3f& startO, const Vec3f& endO, const Vec3f& startL, const Vec3f& startR,
44  const Vec3f& endR);
45 
46  template <class TLogic>
47  static KyResult RunPolylineCastInTriangleOnRight(WorkingMemory* workingMemory, Database* database, void* traverseLogicUserData, QueryDynamicOutput* dynOutput,
48  PolylineCastIntersector& intersector, const Vec3f& startO, const Vec3f& endO, const Vec3f& startL, const Vec3f& endL,
49  const Vec3f& endR);
50 
51  template <class TLogic>
52  static KyResult RunPolylineCast(WorkingMemory* workingMemory, Database* database, void* traverseLogicUserData, QueryDynamicOutput* dynOutput,
53  PolylineCastIntersector& intersector);
54 };
55 
56 template <class TLogic>
57 inline KyResult PolylineCastHelper::RunPolylineCastInTrapeze(WorkingMemory* workingMemory, Database* database, void* traverseLogicUserData, QueryDynamicOutput* dynOutput,
58  PolylineCastIntersector& intersector, const Vec3f& startO, const Vec3f& endO,
59  const Vec3f& startL, const Vec3f& endL, const Vec3f& startR,
60  const Vec3f& endR)
61 {
62  intersector.InitTrapezoid(startO, endO, startL, endL, startR, endR, database->GetDatabaseGenMetrics());
63  return RunPolylineCast<TLogic>(workingMemory, database, traverseLogicUserData, dynOutput, intersector);
64 }
65 
66 template <class TLogic>
67 inline KyResult PolylineCastHelper::RunPolylineCastInTriangle(WorkingMemory* workingMemory, Database* database, void* traverseLogicUserData, QueryDynamicOutput* dynOutput,
68  PolylineCastIntersector& intersector, const Vec3f& startO, const Vec3f& endO,
69  const Vec3f& startL, const Vec3f& startR, const Vec3f& endL,
70  const Vec3f& endR)
71 {
72  KY_ASSERT(startL == endL || startR == endR);
73  if (startL == endL)
74  return RunPolylineCastInTriangleOnLeft<TLogic>(workingMemory, database, traverseLogicUserData, dynOutput, intersector, startO, endO,
75  startL, startR, endR);
76  else
77  return RunPolylineCastInTriangleOnRight<TLogic>(workingMemory, database, traverseLogicUserData, dynOutput, intersector, startO, endO,
78  startL, startR, endL);
79 }
80 
81 template <class TLogic>
82 inline KyResult PolylineCastHelper::RunPolylineCastInTriangleOnLeft(WorkingMemory* workingMemory, Database* database, void* traverseLogicUserData,
83  QueryDynamicOutput* dynOutput, PolylineCastIntersector& intersector, const Vec3f& startO,
84  const Vec3f& endO, const Vec3f& startL, const Vec3f& startR,
85  const Vec3f& endR)
86 {
87  intersector.InitTriangleAroundLeft(startO, endO, startL, startR, endR, database->GetDatabaseGenMetrics());
88  return RunPolylineCast<TLogic>(workingMemory, database, traverseLogicUserData, dynOutput, intersector);
89 }
90 
91 template <class TLogic>
92 inline KyResult PolylineCastHelper::RunPolylineCastInTriangleOnRight(WorkingMemory* workingMemory, Database* database, void* traverseLogicUserData,
93  QueryDynamicOutput* dynOutput, PolylineCastIntersector& intersector, const Vec3f& startO,
94  const Vec3f& endO, const Vec3f& startL, const Vec3f& startR,
95  const Vec3f& endL)
96 {
97  intersector.InitTriangleAroundRight(startO, endO, startL, endL, startR, database->GetDatabaseGenMetrics());
98  return RunPolylineCast<TLogic>(workingMemory, database, traverseLogicUserData, dynOutput, intersector);
99 }
100 
101 template <class TLogic>
102 inline KyResult PolylineCastHelper::RunPolylineCast(WorkingMemory* workingMemory, Database* database, void* traverseLogicUserData, QueryDynamicOutput* dynOutput,
103  PolylineCastIntersector& intersector)
104 {
105  if (dynOutput == nullptr || dynOutput->GetNavTrianglePtrCount() == 0)
106  return KY_ERROR;
107 
108  QueryUtils queryUtils(database, workingMemory, traverseLogicUserData);
109 
110  typedef BestFirstSearch2dBorderCollector<TLogic, PolylineCastIntersector> Visitor;
111  Visitor edgeIntersectionVisitor(traverseLogicUserData, intersector);
112 
113  BestFirstSearchTraversal<Visitor> traversal(queryUtils, database->GetActiveData()->GetCellBox(), edgeIntersectionVisitor);
114 
115  if (traversal.IsInitialized() == false)
116  return KY_ERROR;
117 
118  for (KyUInt32 i = 0; i < dynOutput->GetNavTrianglePtrCount(); ++i)
119  {
120  const NavTrianglePtr& triangle = dynOutput->GetNavTrianglePtr(i);
121  if (traversal.SetStartTriangle(triangle.GetRawPtr()) != TraversalResult_DONE)
122  return KY_ERROR;
123  }
124 
125  if (traversal.Search() != TraversalResult_DONE)
126  return KY_ERROR;
127 
128  return KY_SUCCESS;
129 }
130 
131 }
std::uint32_t KyUInt32
uint32_t
Definition: types.h:29
#define KY_DEFINE_NEW_DELETE_OPERATORS(MemStat)
This macro defines new and delete operators.
Definition: memory.h:132
Navigation return code class.
Definition: types.h:108
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17
#define KY_ERROR
use result == KY_ERROR to test for error
Definition: types.h:132