gwnavruntime/channel/diagonalstripcomputer.h Source File

diagonalstripcomputer.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 #pragma once
8 
10 #include "gwnavruntime/path/path.h"
19 
20 namespace Kaim
21 {
22 
23 class DiagonalStripComputerContext;
24 class Path;
25 
26 class DiagonalStripComputerConfig
27 {
28 public:
29  DiagonalStripComputerConfig() { SetDefaults(); }
30  void SetDefaults()
31  {
32  m_idealClearanceRadius = 2.5f;
33  //m_idealPathDistFromCorners = 1.0f;
34  m_fullDebug.Clear();
35  }
36 
37  KyFloat32 m_idealClearanceRadius;
38  //KyFloat32 m_idealPathDistFromCorners;
39  FullDebug m_fullDebug;
40 };
41 
43 {
46 
47  DiagonalStripResult_BuildDiagonalForPathEdge,
48  DiagonalStripResult_ComputingMaxRadius_Init,
49  DiagonalStripResult_ComputingMaxRadius,
50  DiagonalStripResult_ComputingNeighborCompatibleRadius_Backward_Init,
51  DiagonalStripResult_ComputingNeighborCompatibleRadius_Backward,
52  DiagonalStripResult_ComputingNeighborCompatibleRadius_Forward_Init,
53  DiagonalStripResult_ComputingNeighborCompatibleRadius_Forward,
54 
55  DiagonalStripResult_Done_DiagonalStripComputerError,
56  DiagonalStripResult_Done_ComputeMaxRadiusError,
57  DiagonalStripResult_Done_ComputeNeighborCompatibleRadiusError,
58 
59  DiagonalStripResult_Done
60 };
61 
62 enum DiagonalStripJunctionType { JunctionType_Slanting, JunctionType_AlmostOrtho };
63 
64 class DiagonalStripComputer
65 {
66 public:
67  KY_DEFINE_NEW_DELETE_OPERATORS(MemStat_QueryWorkingMem)
68 public:
69  DiagonalStripComputer();
70  ~DiagonalStripComputer();
71 
72  void Clear();
73 
74  // database is redundant with path->m_database
75  void Init(Database* database, const Path* path, KyUInt32 firstEdgeIdxOfSection, KyUInt32 lastEdgeIdxOfSection, DiagonalStrip* diagonalStrip, KyFloat32 cornerMaxRadius,
76  FullDebug fullDebug);
77 
78  bool IsFinished() const { return m_result >= DiagonalStripResult_Done_DiagonalStripComputerError; }
79 
80  void* GetTraverseLogicUserData() const { return m_traverseLogicUserData; }
81  void SetTraverseLogicUserData(void* traverseLogicUserData) { m_traverseLogicUserData = traverseLogicUserData; }
82 
83  DiagonalStripComputerResult GetResult() const { return m_result; }
84  //DiagonalStripComputerConfig& GetComputerConfig() { return m_diagonalStripConfig; }
85 
86 protected:
87  KyResult ComputeCornerRadius(KyUInt32 cornerIdx);
88 
89  enum ComputeCompatibleRadiusResult { OutOfNeighborhood, Shrinked, Unchanged };
90 
91  KyResult ComputeForwardNeighborCompatibleCornerRadius(KyUInt32 cornerIdx);
92  KyResult ComputeBackwardNeighborCompatibleCornerRadius(KyUInt32 cornerIdx);
93  ComputeCompatibleRadiusResult ComputeCompatibleRadius(const Vec3f& cornerPos, CornerType cornerType, KyUInt32 otherIdx, KyFloat32& cornerRadius);
94 
95  void InitContext(DiagonalStripComputerContext& context, WorkingMemory* workingMemory);
96  //void PostProcessPolylineCastResult(PolylineCastIntersector& clearancePolygonIntersector);
97  KyResult FillDiagonalStripFromPolylineCastResult(PolylineCastIntersector& clearancePolygonIntersector);
98  bool IsCCWQuadConvex(const Vec3f& A, const Vec3f& B, const Vec3f& C, const Vec3f& D);
99  void ComputeBissectriceEndPoints(DiagonalStripComputerContext& context, const Vec3f& nextPointOnPath, KyFloat32 nextEdgelength2D, KyFloat32 dotProdWithNextEdge,
100  KyFloat32 crossProdWithNextEdge);
101 
102  bool PushCorner(const Vec3f& pos, CornerType cornerType, bool force = false);
103  //bool DiagonalStripComputerGetLastButOnCornerPos(CornerType cornerType, Vec3f& pos);
104  KyResult MakeJunctionWithCurrentDiagonalStrip(PolylineCastIntersector& clearancePolygonIntersector);
105  void PushEndPoint();
106 
107 public:
108  template <class TLogic> void Advance(WorkingMemory* workingMemory, ChannelArrayComputerStats& channelStats);
109 
110  template <class TLogic> KyResult ComputeDiagonalsFromPath(WorkingMemory* workingMemory, ChannelArrayComputerStats& stats);
111 
112  template <class TLogic> KyResult BuildDiagonalsForPathEdge(WorkingMemory* workingMemory);
113 
114  template <class TLogic> KyResult ProcessTheOneTrapezeStartingThePolygon(WorkingMemory* workingMemory, DiagonalStripComputerContext& context, KyFloat32 maxDotProdStart);
115 
116  template <class TLogic>
117  KyResult ProcessPolygonWithTriangles(WorkingMemory* workingMemory, DiagonalStripComputerContext& context, Vec3f& bissectricIntersection, bool bissectriceIntersect,
118  KyFloat32 maxDotProdStart, KyFloat32 minDotProdEnd);
119 
120  template <class TLogic>
121  KyResult ProcessTwoOppositeTriangles(WorkingMemory* workingMemory, DiagonalStripComputerContext& context, const Vec3f& endPointLeft, const Vec3f& endPointRight,
122  const Vec3f& endPointOnPath);
123 
124  template <class TLogic> KyResult EndPolygonFromAlmostOrthoStart(WorkingMemory* workingMemory, DiagonalStripComputerContext& context, KyFloat32 minDotProdEnd);
125 
126  template <class TLogic>
127  KyResult BuildDiagonalsInTrapeze(WorkingMemory* workingMemory, const Vec3f& pathEdgeStart, const Vec3f& pathEdgeEnd, NavTrianglePtr& inAndOutTrianglePtr,
128  const Vec3f& pointOnStartSideLeft, const Vec3f& pointOnEndSideLeft, const Vec3f& pointOnStartSideRight, const Vec3f& pointOnEndSideRight);
129 
130  template <class TLogic>
131  KyResult BuildDiagonalsInTriangle(WorkingMemory* workingMemory, const Vec3f& pathEdgeStart, const Vec3f& pathEdgeEnd, NavTrianglePtr& inAndOutTrianglePtr,
132  const Vec3f& pointOnStartSideLeft, const Vec3f& pointOnStartSideRight, const Vec3f& pointOnEndSideLeft, const Vec3f& pointOnEndSideRight,
133  bool forceTrapeze = false);
134 
135 public: // internal
136  void ClearDisplayList();
137  void CreateDisplayList();
138  static ShapeColor GetVisualDebugQuadColor();
139  static ShapeColor GetVisualDebugTriangleColor();
140 protected:
141  Database* m_database;
142  void* m_traverseLogicUserData;
143  KyFloat32 m_channelRadius;
145  const Path* m_rawPath;
146  DiagonalStrip* m_diagonalStrip;
147 
148  // diagonal strip temp
149  KyUInt32 m_currentPathEdgeIdx;
150  KyUInt32 m_firstEdgeIdxOfSection;
151  KyUInt32 m_lastEdgeIdxOfSection;
152  KyInt32 m_currentCornerIdx;
153 
154  Vec3f m_startL;
155  Vec3f m_startR;
156  DiagonalStripJunctionType m_startJunctionType;
157  Vec3f m_lastStripCornerLeft;
158  Vec3f m_lastStripCornerRight;
159  DisplayList* m_displayList; // TODO remove that and crate display list on the stack
160 
161  FullDebug m_fullDebug;
162 };
163 
164 
165 } // namespace Kaim
166 
167 
168 
170 
171 
std::uint32_t KyUInt32
uint32_t
Definition: types.h:29
Indicates the query has not yet been launched.
Definition: diagonalstripcomputer.h:45
#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
DiagonalStripComputerResult
Definition: diagonalstripcomputer.h:42
Indicates that the query has not yet been initialized.
Definition: iquery.h:295
std::int32_t KyInt32
int32_t
Definition: types.h:24
Indicates that the query has not yet been launched.
Definition: iquery.h:296
Indicates the query has not yet been initialized.
Definition: diagonalstripcomputer.h:44
float KyFloat32
float
Definition: types.h:32