7 #ifndef Navigation_CircleArcCanGoInChannel_H
8 #define Navigation_CircleArcCanGoInChannel_H
17 class CircleArcCanGoInChannel
21 static bool Perform(
const Channel* channel,
const Bubble& bubble,
22 const Vec3f& arcStartPos,
const Vec3f& arcEndPos,
KyUInt32 startSectionIdx,
KyUInt32 endSectionIdx);
25 enum CircleArcCanGoResult
27 CircleArcCanGoResult_NoIntersection,
28 CircleArcCanGoResult_CollisionWithBorder,
29 CircleArcCanGoResult_CollisionWithSectionStartGate,
30 CircleArcCanGoResult_CollisionWithSectionEndGate,
31 CircleArcCanGoResult_Error
45 bool m_arcStartCloseToSegmentInSection[4];
46 bool m_arcEndCloseToSegmentInSection[4];
50 class SegmentVsCircleData
54 enum SegmentType { Gate, Border, Undefined };
55 SegmentVsCircleData();
56 void Compute(
const Vec3f& segmentStart,
const Vec3f& segmentEnd,
const CWCircleArc& cWCircleArc, SegmentType segmentType);
57 void BuildReverse(
const SegmentVsCircleData& other)
59 m_segmentStart = other.m_segmentEnd;
60 m_segmentEnd = other.m_segmentStart;
61 m_closestPoint = other.m_closestPoint;
62 m_intersectionCount = other.m_intersectionCount;
63 m_segmentType = other.m_segmentType;
64 m_startPosIsStrictlyInsideCircle = other.m_endPosIsStrictlyInsideCircle;
65 m_endPosIsStrictlyInsideCircle = other.m_startPosIsStrictlyInsideCircle;
69 Alg::Swap(m_segmentStart, m_segmentEnd);
70 Alg::Swap(m_startPosIsStrictlyInsideCircle, m_startPosIsStrictlyInsideCircle);
77 SegmentType m_segmentType;
78 bool m_startPosIsStrictlyInsideCircle;
79 bool m_endPosIsStrictlyInsideCircle;
85 enum SectionType { Quad, TurnLeft, TurnRight, PreSection, PostSection };
87 const SegmentVsCircleData& GetEndGateSegmentData()
const
89 KY_ASSERT(m_type != PostSection);
93 case TurnRight :
return m_segmentVsCircleData[2];
94 case TurnLeft :
return m_segmentVsCircleData[1];
96 default :
return m_segmentVsCircleData[0];
99 const SegmentVsCircleData& GetStartGateSegmentData()
const { KY_ASSERT(m_type != PreSection);
return m_segmentVsCircleData[0]; }
103 SegmentVsCircleData m_segmentVsCircleData[4];
106 static CircleArcCanGoResult InitCircleArcCanGo(
const Channel* channel, CWCircleArc& cwCircleArc, SectionData& currentSectionData);
109 static void BuildCWCircleArc(
const Channel* channel,
const Bubble& bubble,
const Vec3f& arcStartPos,
const Vec3f& arcEndPos,
110 KyUInt32 startSectionIdx,
KyUInt32 endSectionIdx, CWCircleArc &cwCircleArc);
111 static void ComputeArcExtremityLocationInSection(
const Channel* channel,
const Vec2f& pos,
KyUInt32 sectionIdx,
bool* posCloseToSegmentInSection);
113 static CircleArcCanGoResult InitCircleArcCanGo_InSection(
const Channel* channel,
const CWCircleArc& cwCircleArc, SectionData& currentSectionData);
114 static CircleArcCanGoResult InitCircleArcCanGo_GenericForPolylineSection(
const CircleArcCanGoInChannel::CWCircleArc& cwCircleArc,
115 const SectionData& currentSectionData,
const KyArray<Vec2f>& polyline);
117 static CircleArcCanGoResult ProcessNextSectionAlongArc(
const Channel* channel,
const CWCircleArc& cwCircleArc, SectionData& currentSectionData,
118 KyUInt32 nextSectionIdx, CircleArcCanGoResult previousResult);
119 static CircleArcCanGoResult ProcessNextSectionAlongArc_InSection(
const Channel* channel,
const CWCircleArc& cwCircleArc, SectionData& currentSectionData,
KyUInt32 currentSectionIdx, CircleArcCanGoResult previousResult);
120 static CircleArcCanGoResult ProcessNextSectionAlongArc_GenericForPolylineSection(
const CWCircleArc& cwCircleArc,
const SectionData& currentSectionData,
121 const KyArray<Vec2f>& polyline);
123 static bool IsArcTangenteAlmostColinearWithSegment(
const Vec2f& segmentStart,
const Vec2f& segmentEnd,
const Vec2f& center,
const Vec2f& arcStart);
124 static bool DoesCircleArcIntersectPolyline(
const KyArray<Vec2f>& polyline,
const Vec2f& circleCenter,
KyFloat32 radius,
125 const Vec2f& circleArcStart,
const Vec2f& circleArcEnd);
126 static bool DoesArcGoAwayFromSegment(
const SegmentVsCircleData& segmentData,
const CWCircleArc& cwCircleArc);
127 static bool IsArcEndBetweenArcStartAndExitPos(
const CWCircleArc& cwCircleArc,
const SegmentVsCircleData& segmentData,
KyUInt32 segmentIdx);
128 static void InitSectionData(
const Channel* channel,
const CWCircleArc& cwCircleArc,
KyUInt32 currentSectionIdx,
129 SectionData& currentSectionData,
KyUInt32& segmentCount);
130 static void UpdateSectionData(
const Channel* channel,
const CWCircleArc& cwCircleArc,
KyUInt32 newSectionIdx,
131 SectionData& currentSectionData,
KyUInt32& segmentCount);
#define KY_CLASS_WITHOUT_COPY(ClassName)
Define to forbid copy constructor and copy assignment.
Definition: types.h:387
unsigned char KyUInt8
Type used internally to represent an unsigned 8-bit integer.
Definition: types.h:41
Definition: gamekitcrowddispersion.h:20
unsigned int KyUInt32
Type used internally to represent an unsigned 32-bit integer.
Definition: types.h:36
float KyFloat32
Type used internally to represent a 32-bit floating-point number.
Definition: types.h:43