gwnavruntime/channel/channelbordersimplifier.h Source File

channelbordersimplifier.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 
16 
17 namespace Kaim
18 {
19 
20 class ChannelComputerConfig;
21 class DisplayList;
22 
23 class PolylineExtremityContext
24 {
25 public:
26  PolylineExtremityContext()
27  : m_useStartAsInput(false), m_useEndAsInput(false), m_startCanBeMoved(false), m_endCanBeMoved(false), m_startX(0.0), m_startY(0.0), m_endX(0.0), m_endY(0.0)
28  {}
29 
30  Vec2f m_startPos;
31  Vec2f m_endPos;
32  bool m_useStartAsInput;
33  bool m_useEndAsInput;
34  bool m_startCanBeMoved;
35  bool m_endCanBeMoved;
36 
37  KyFloat32 m_startX;
38  KyFloat32 m_startY;
39  KyFloat32 m_endX;
40  KyFloat32 m_endY;
41 };
42 
43 class ChannelBorderSimplifier
44 {
45 public:
46  ChannelBorderSimplifier();
47  ~ChannelBorderSimplifier();
48 
49  void Clear();
50  void InitializeForSection(Database* database, const ChannelComputerConfig& channelConfig, const Vec3f& edgeStartPos, const Vec2f& pathEdgeDir2d, KyFloat32 pathEdgeLength, const FullDebug& fullDebug);
51  void InitializeForChannelPrePost(Database* database, const ChannelComputerConfig& channelConfig, const Vec3f& edgeStartPos, const Vec2f& pathEdgeDir2d, KyFloat32 pathEdgeLength, const FullDebug& fullDebug);
52 
53  KyResult Simplify_Left(const SharedPoolList<PolylineCastIntersector::BorderEdge>& leftBorders, PolylineExtremityContext& extremityContext);
54  KyResult Simplify_Right(const SharedPoolList<PolylineCastIntersector::BorderEdge>& rightBorders, PolylineExtremityContext& extremityContext);
55  KyResult Simplify(const SharedPoolList<PolylineCastIntersector::BorderEdge>& borders, bool onLeft, PolylineExtremityContext& extremityContext);
56  void ProcessExtremity(SharedPoolList<Vec2f>& polyline, PolylineExtremityContext& extremityContext);
57 
58  Vec3f GetGlobalPosFromLocalPos(const Vec2f& localPos) { return m_edgeStartPos + Vec3f(localPos.x * m_edgeDir2d + localPos.y * m_edgeDir2d.PerpCCW()); }
59  Vec3f GetGlobalPosFromLocalPos(KyFloat32 x, KyFloat32 y) { return GetGlobalPosFromLocalPos(Vec2f(x, y)); }
60 
61 public: // internal
62  void RemoveNoiseInPolyline(SharedPoolList<Vec2f>& polyline);
63 
64  void CreatePolylineFromBorder(const SharedPoolList<PolylineCastIntersector::BorderEdge>& borderEdgeList,
65  SharedPoolList<Vec2f>& borderPolyline);
66 
67  // converts in place the Vec2f coordinates from global coords to EdgeLocal coords
68  // Y
69  // + ^ +
70  // \| /
71  // m_edgeStartPos +----> X + m_edgeEndPos
72  // \ /
73  // + +
74  KyResult ConvertPolylineToEdgeLocalCoords(SharedPoolList<Vec2f>& polyline);
75 
76  void FixXCoordinatesOrder(SharedPoolList<Vec2f>& polyline);
77  void MoveYPositionOfAllPoints(SharedPoolList<Vec2f>& polyline);
78 
79  void FixPolylineAroundStartPoint(SharedPoolList<Vec2f>& polyline, KyFloat32& xCoordinate, KyFloat32& yCoordinate, bool canMovePoint);
80  void FixPolylineAroundEndPoint(SharedPoolList<Vec2f>& polyline, KyFloat32& xCoordinate, KyFloat32& yCoordinate, bool canMovePoint);
81 
82  // ----------- Visual Debug ---------------
83 
84  void RenderBorderEdges(const char* listName, Color visualColor, const SharedPoolList<PolylineCastIntersector::BorderEdge>& leftBorders);
85  void RenderPolyline(const char* listName, Color visualColor, SharedPoolList<Vec2f>& polyline, bool hideByDefault = true);
86 
87 private:
88  void ComputeMaxTangent(KyFloat32 angleInDegrees);
89  void EraseCurrentPoint(SharedPoolList<Vec2f>& polyline, SPL_Iterator<Vec2f>& previous, SPL_Iterator<Vec2f>& current, SPL_Iterator<Vec2f>& next);
90 
91  KyFloat32 GetChannelRadius() { return m_channelConfig.m_channelRadius; }
92  KyFloat32 GetMin2dDistanceBetweenPoints() { return m_channelConfig.m_advancedConfig.m_minDistBetweenIntermediaryGates; }
93  KyFloat32 GetMax2dDistanceBetweenPoints() { return m_channelConfig.m_advancedConfig.m_maxDistBetweenIntermediaryGates; }
94 
95 public: // internal
96  Database* m_database;
97  ChannelComputerConfig m_channelConfig;
98  bool m_hasFullDebug;
99  KyFloat32 m_maxTangent;
100 
101  SharedPoolList<Vec2f> m_leftPolyline;
102  SharedPoolList<Vec2f> m_rightPolyline;
103  SharedPoolList<Vec2f>::NodePool m_positionPool;
104  KyFloat32 m_nonNullMinY;
105 
106  Vec3f m_edgeStartPos;
107  Vec2f m_edgeDir2d;
108  KyFloat32 m_edgeLength2d;
109 };
110 
111 
112 class SweepLinePolylineSimplifier
113 {
114 public:
115  SweepLinePolylineSimplifier(KyFloat32 maxY, KyFloat32 maxSlope, KyFloat32 minProjDistBetweenPoint);
116  ~SweepLinePolylineSimplifier() { Clear(); }
117 
118  void Clear();
119 
120  KyResult Simplify(SharedPoolList<Vec2f>& polyline);
121 
122  static bool CompVec2fY(const Vec2f& p0, const Vec2f& p1) { return (p0.y < p1.y) || (p0.y == p1.y && p0.x < p1.x); }
123 
124  static bool IsAbsSlope1StrictlyGreaterThanAbsSlope2(const Vec2f& slope1, const Vec2f& slope2) { return (fabsf(slope1.y * slope2.x) > fabsf(slope1.x * slope2.y)); }
125 
126 private:
127  KyResult ConsumeInputPolyline(const SharedPoolList<Vec2f>& inPolyline);
128  KyResult SimplifyPolyline();
129  KyResult BuildOutput(SharedPoolList<Vec2f>& polyline);
130 
131  SPL_Iterator<Vec2f> GetAndPopPointToProcess();
132 
133  KyResult SimplifyAfterPolylinePoint(SPL_Iterator<Vec2f> pointIt);
134  KyResult SimplifyBeforePolylinePoint(SPL_Iterator<Vec2f> pointIt);
135 
136  Vec2f GetMaxSlopeForPoint(const Vec2f &point);
137 
138  SPL_Iterator<Vec2f> ComputeFirstPointIteratorAfterLine(SPL_Iterator<Vec2f> firstPointItToCheck, const Vec2f& lineStartPoint, const Vec2f& lineSlope);
139  SPL_Iterator<Vec2f> ComputeFirstPointIteratorBeforeLine(SPL_Iterator<Vec2f> firstPointItToCheck, const Vec2f& lineStartPoint, const Vec2f& lineSlope);
140 
141  SPL_Iterator<Vec2f> GetMoreConstraintSlopeForward(const Vec2f& point, SPL_Iterator<Vec2f> currentIt);
142  SPL_Iterator<Vec2f> GetMoreConstraintSlopeBackward(const Vec2f& point, SPL_Iterator<Vec2f> currentIt);
143 
144  void RemoveFromWorkingPolyline(SPL_Iterator<Vec2f> firstIteratorToRemove, SPL_Iterator<Vec2f> stopAtThis);
145 
146 public:
147  SharedPoolList<Vec2f> m_workingPolyline;
148  SharedPoolList<Vec2f>::NodePool m_pointPool;
149 
150  KyArrayCPP<SPL_Iterator<Vec2f> > m_openNodes;
151 
152  Vec2f m_maxSlope;
153  KyFloat32 m_minX;
154  KyFloat32 m_maxX;
155  KyFloat32 m_maxY;
156  KyFloat32 m_minY;
157  KyFloat32 m_minProjDistBetweenPoints;
158 
159  Vec3f m_origin;
160  Vec2f m_yAxis;
161 };
162 
163 
164 KY_INLINE KyResult ChannelBorderSimplifier::Simplify_Left(const SharedPoolList<PolylineCastIntersector::BorderEdge>& leftBorders, PolylineExtremityContext& extremityContext)
165 {
166  return Simplify(leftBorders, true, extremityContext);
167 }
168 KY_INLINE KyResult ChannelBorderSimplifier::Simplify_Right(const SharedPoolList<PolylineCastIntersector::BorderEdge>& rightBorders, PolylineExtremityContext& extremityContext)
169 {
170  return Simplify(rightBorders, false, extremityContext);
171 }
172 
173 } // namespace Kaim
174 
Navigation return code class.
Definition: types.h:108
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17
float KyFloat32
float
Definition: types.h:32