gwnavruntime/channel/channelbordersimplifier.h Source File

channelbordersimplifier.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 #ifndef Navigation_SweepLinePolylineSimplifier_H
8 #define Navigation_SweepLinePolylineSimplifier_H
9 
10 
16 
17 
18 namespace Kaim
19 {
20 
21 class ChannelComputerConfig;
22 class ScopedDisplayList;
23 
24 class PolylineExtremityContext
25 {
26 public:
27  PolylineExtremityContext() : m_useStartAsInput(false), m_useEndAsInput(false), m_startCanBeMoved(false), m_endCanBeMoved(false) {}
28  Vec2f m_startPos;
29  Vec2f m_endPos;
30  bool m_useStartAsInput;
31  bool m_useEndAsInput;
32  bool m_startCanBeMoved;
33  bool m_endCanBeMoved;
34 
35  KyFloat32 m_startX;
36  KyFloat32 m_startY;
37  KyFloat32 m_endX;
38  KyFloat32 m_endY;
39 };
40 
41 class ChannelBorderSimplifier
42 {
43 public:
44  ChannelBorderSimplifier();
45  ~ChannelBorderSimplifier();
46 
47  void Clear();
48  void Initialize(Database* database, const Vec3f& edgeStartPos, const Vec2f& pathEdgeDir2d, KyFloat32 pathEdgeLength);
49  void SetSmoothingAngle(KyFloat32 angleInDegrees);
50 
51  KyResult SimplifyOnLeft(const SharedPoolList<PolylineCastIntersector::BorderEdge>& leftBorders, PolylineExtremityContext& extremityContext);
52  KyResult SimplifyOnRight(const SharedPoolList<PolylineCastIntersector::BorderEdge>& rightBorders, PolylineExtremityContext& extremityContext);
53  KyResult Simplify(const SharedPoolList<PolylineCastIntersector::BorderEdge>& borders, bool onLeft, PolylineExtremityContext& extremityContext);
54  void ProcessExtremity(SharedPoolList<Vec2f>& polyline, PolylineExtremityContext& extremityContext);
55 
56  Vec3f GetGlobalPosFromLocalPos(const Vec2f& localPos)
57  {
58  return m_edgeStartPos + Vec3f(localPos.x * m_edgeDir2d + localPos.y * m_edgeDir2d.PerpCCW());
59  }
60 
61  Vec3f GetGlobalPosFromLocalPos(KyFloat32 x, KyFloat32 y)
62  {
63  return GetGlobalPosFromLocalPos(Vec2f(x, y));
64  }
65 
66 public: // internal
67  void RemoveNoiseInPolyline(SharedPoolList<Vec2f>& polyline);
68 
69  void CreatePolylineFromBorder(const SharedPoolList<PolylineCastIntersector::BorderEdge>& borderEdgeList,
70  SharedPoolList<Vec2f>& borderPolyline);
71 
72  KyResult SwapXAndYCoordinatesToEdgeLocal(SharedPoolList<Vec2f>& polyline);
73 
74  void FixXCoordinatesOrder(SharedPoolList<Vec2f>& polyline);
75  void MoveYPositionOfAllPoints(SharedPoolList<Vec2f>& polyline);
76 
77  void FixPolylineAroundStartPoint(SharedPoolList<Vec2f>& polyline, KyFloat32& xCoordinate, KyFloat32& yCoordinate, bool canMovePoint);
78  void FixPolylineAroundEndPoint(SharedPoolList<Vec2f>& polyline, KyFloat32& xCoordinate, KyFloat32& yCoordinate, bool canMovePoint);
79  // ----------- Visual Debug ---------------
80 
81  // Polyline drawing
82  class PolylineDisplayConfig
83  {
84  public:
85  PolylineDisplayConfig() { SetDefaults(); }
86  void SetDefaults()
87  {
88  m_arrowWidth = 0.0f;
89  m_arrowColor.SetOnlyLineColor(VisualColor::Yellow);
90  }
91 
92  KyFloat32 m_arrowWidth;
93  VisualShapeColor m_arrowColor;
94  };
95 
96  void RenderBorderEdges(const char* listName, VisualColor visualColor, const SharedPoolList<PolylineCastIntersector::BorderEdge>& leftBorders);
97  void RenderPolyline(const char* listName, VisualColor visualColor, SharedPoolList<Vec2f>& polyline, bool hideByDefault = true);
98 
99 private:
100  void EraseCurrentPoint(SharedPoolList<Vec2f>& polyline,
101  SharedPoolList<Vec2f>::Iterator& previous,
102  SharedPoolList<Vec2f>::Iterator& current,
103  SharedPoolList<Vec2f>::Iterator& next);
104 
105 public: // internal
106  Database* m_database;
107 
108  SharedPoolList<Vec2f> m_leftPolyline;
109  SharedPoolList<Vec2f> m_rightPolyline;
110  SharedPoolList<Vec2f>::NodePool m_positionPool;
111  KyFloat32 m_nonNullMinY;
112 
113  Vec3f m_edgeStartPos;
114  Vec2f m_edgeDir2d;
115  KyFloat32 m_edgeLength2d;
116  KyFloat32 m_maxTangent;
117 
118  KyFloat32 m_channelRadius;
119  KyFloat32 m_min2dDistanceBetweenPoints; // The distance beneath which close border points are collapsed into one point
120  KyFloat32 m_max2dDistanceBetweenPoints;
121 
122  bool m_advancedVisualDebuggingEnabled;
123 };
124 
125 
126 class SweepLinePolylineSimplifier
127 {
128 public:
129  SweepLinePolylineSimplifier(KyFloat32 maxY, KyFloat32 maxSlope, KyFloat32 minProjDistBetweenPoint);
130  ~SweepLinePolylineSimplifier() { Clear(); }
131 
132  void Clear();
133 
134  KyResult Simplify(SharedPoolList<Vec2f>& polyline);
135 
136  static bool CompVec2fY(const Vec2f& p0, const Vec2f& p1) { return (p0.y < p1.y) || (p0.y == p1.y && p0.x < p1.x); }
137  static bool IsSlope1StrictlyGreaterThanSlope2(const Vec2f& slope1, const Vec2f& slope2)
138  {
139  return (fabsf(slope1.y * slope2.x) > fabsf(slope1.x * slope2.y));
140  }
141 private:
142  KyResult ConsumeInputPolyline(const SharedPoolList<Vec2f>& inPolyline);
143  KyResult SimplifyPolyline();
144  KyResult BuildOutput(SharedPoolList<Vec2f>& polyline);
145 
146  SharedPoolList<Vec2f>::Iterator GetAndPopPointToProcess();
147 
148  KyResult SimplifyAfterPolylinePoint(SharedPoolList<Vec2f>::Iterator pointIt);
149  KyResult SimplifyBeforePolylinePoint(SharedPoolList<Vec2f>::Iterator pointIt);
150 
151  Vec2f GetMaxSlopeForPoint(const Vec2f &point);
152 
153  SharedPoolList<Vec2f>::Iterator ComputeFirstPointIteratorAfterLine(SharedPoolList<Vec2f>::Iterator firstPointItToCheck,
154  const Vec2f& lineStartPoint, const Vec2f& lineSlope);
155  SharedPoolList<Vec2f>::Iterator ComputeFirstPointIteratorBeforeLine(SharedPoolList<Vec2f>::Iterator firstPointItToCheck,
156  const Vec2f& lineStartPoint, const Vec2f& lineSlope);
157 
158  SharedPoolList<Vec2f>::Iterator GetMoreConstraintSlopeForward(const Vec2f& point, SharedPoolList<Vec2f>::Iterator currentIt);
159  SharedPoolList<Vec2f>::Iterator GetMoreConstraintSlopeBackward(const Vec2f& point, SharedPoolList<Vec2f>::Iterator currentIt);
160 
161  void RemoveFromWorkingPolyline(SharedPoolList<Vec2f>::Iterator firstIteratorToRemove, SharedPoolList<Vec2f>::Iterator stopAtThis);
162 
163 public:
164  SharedPoolList<Vec2f> m_workingPolyline;
165  SharedPoolList<Vec2f>::NodePool m_pointPool;
166 
167  KyArrayCPP<SharedPoolList<Vec2f>::Iterator> m_openNodes;
168 
169  Vec2f m_maxSlope;
170  KyFloat32 m_minX;
171  KyFloat32 m_maxX;
172  KyFloat32 m_maxY;
173  KyFloat32 m_minY;
174  KyFloat32 m_minProjDistBetweenPoints;
175 
176  Vec3f m_origin;
177  Vec2f m_yAxis;
178 };
179 
180 
181 KY_INLINE KyResult ChannelBorderSimplifier::SimplifyOnLeft(const SharedPoolList<PolylineCastIntersector::BorderEdge>& leftBorders, PolylineExtremityContext& extremityContext)
182 {
183  return Simplify(leftBorders, true, extremityContext);
184 }
185 KY_INLINE KyResult ChannelBorderSimplifier::SimplifyOnRight(const SharedPoolList<PolylineCastIntersector::BorderEdge>& rightBorders, PolylineExtremityContext& extremityContext)
186 {
187  return Simplify(rightBorders, false, extremityContext);
188 }
189 
190 } // namespace Kaim
191 
192 #endif // Navigation_SweepLinePolylineSimplifier_H
KyInt32 KyResult
Defines a type that can be returned by methods or functions in the Gameware Navigation SDK to indicat...
Definition: types.h:254
static const VisualColor Yellow
Represents the color with RGBA values (255, 255, 0, 255).  
Definition: visualcolor.h:236
Definition: gamekitcrowddispersion.h:20
float KyFloat32
Type used internally to represent a 32-bit floating-point number.
Definition: types.h:43