16 class CircleArcCanGoInChannel
20 static bool Perform(
const Channel* channel,
const Bubble& bubble,
21 const Vec3f& arcStartPos,
const Vec3f& arcEndPos,
KyUInt32 startSectionIdx,
KyUInt32 endSectionIdx);
24 enum CircleArcCanGoResult
26 CircleArcCanGoResult_NoIntersection,
27 CircleArcCanGoResult_CollisionWithBorder,
28 CircleArcCanGoResult_CollisionWithSectionStartGate,
29 CircleArcCanGoResult_CollisionWithSectionEndGate,
30 CircleArcCanGoResult_Error
44 bool m_arcStartCloseToSegmentInSection[4];
45 bool m_arcEndCloseToSegmentInSection[4];
49 class SegmentVsCircleData
53 enum SegmentType { Gate, Border, Undefined };
54 SegmentVsCircleData();
55 void Compute(
const Vec3f& segmentStart,
const Vec3f& segmentEnd,
const CWCircleArc& cWCircleArc, SegmentType segmentType);
56 void BuildReverse(
const SegmentVsCircleData& other)
58 m_segmentStart = other.m_segmentEnd;
59 m_segmentEnd = other.m_segmentStart;
60 m_closestPoint = other.m_closestPoint;
61 m_intersectionCount = other.m_intersectionCount;
62 m_segmentType = other.m_segmentType;
63 m_startPosIsStrictlyInsideCircle = other.m_endPosIsStrictlyInsideCircle;
64 m_endPosIsStrictlyInsideCircle = other.m_startPosIsStrictlyInsideCircle;
68 Alg::Swap(m_segmentStart, m_segmentEnd);
69 Alg::Swap(m_startPosIsStrictlyInsideCircle, m_startPosIsStrictlyInsideCircle);
76 SegmentType m_segmentType;
77 bool m_startPosIsStrictlyInsideCircle;
78 bool m_endPosIsStrictlyInsideCircle;
84 enum SectionType { Quad, TurnLeft, TurnRight, PreSection, PostSection };
86 const SegmentVsCircleData& GetEndGateSegmentData()
const
88 KY_ASSERT(m_type != PostSection);
92 case TurnRight :
return m_segmentVsCircleData[2];
93 case TurnLeft :
return m_segmentVsCircleData[1];
95 default :
return m_segmentVsCircleData[0];
98 const SegmentVsCircleData& GetStartGateSegmentData()
const { KY_ASSERT(m_type != PreSection);
return m_segmentVsCircleData[0]; }
102 SegmentVsCircleData m_segmentVsCircleData[4];
105 static CircleArcCanGoResult InitCircleArcCanGo(
const Channel* channel, CWCircleArc& cwCircleArc, SectionData& currentSectionData);
108 static void BuildCWCircleArc(
const Channel* channel,
const Bubble& bubble,
const Vec3f& arcStartPos,
const Vec3f& arcEndPos,
109 KyUInt32 startSectionIdx,
KyUInt32 endSectionIdx, CWCircleArc &cwCircleArc);
110 static void ComputeArcExtremityLocationInSection(
const Channel* channel,
const Vec2f& pos,
KyUInt32 sectionIdx,
bool* posCloseToSegmentInSection);
112 static CircleArcCanGoResult InitCircleArcCanGo_InSection(
const Channel* channel,
const CWCircleArc& cwCircleArc, SectionData& currentSectionData);
113 static CircleArcCanGoResult InitCircleArcCanGo_GenericForPolylineSection(
const CircleArcCanGoInChannel::CWCircleArc& cwCircleArc,
114 const SectionData& currentSectionData,
const KyArray<Vec2f>& polyline);
116 static CircleArcCanGoResult ProcessNextSectionAlongArc(
const Channel* channel,
const CWCircleArc& cwCircleArc, SectionData& currentSectionData,
117 KyUInt32 nextSectionIdx, CircleArcCanGoResult previousResult);
118 static CircleArcCanGoResult ProcessNextSectionAlongArc_InSection(
const Channel* channel,
const CWCircleArc& cwCircleArc, SectionData& currentSectionData,
KyUInt32 currentSectionIdx, CircleArcCanGoResult previousResult);
119 static CircleArcCanGoResult ProcessNextSectionAlongArc_GenericForPolylineSection(
const CWCircleArc& cwCircleArc,
const SectionData& currentSectionData,
120 const KyArray<Vec2f>& polyline);
122 static bool IsArcTangenteAlmostColinearWithSegment(
const Vec2f& segmentStart,
const Vec2f& segmentEnd,
const Vec2f& center,
const Vec2f& arcStart);
123 static bool DoesCircleArcIntersectPolyline(
const KyArray<Vec2f>& polyline,
const Vec2f& circleCenter,
KyFloat32 radius,
124 const Vec2f& circleArcStart,
const Vec2f& circleArcEnd);
125 static bool DoesArcGoAwayFromSegment(
const SegmentVsCircleData& segmentData,
const CWCircleArc& cwCircleArc);
126 static bool IsArcEndBetweenArcStartAndExitPos(
const CWCircleArc& cwCircleArc,
const SegmentVsCircleData& segmentData,
KyUInt32 segmentIdx);
127 static void InitSectionData(
const Channel* channel,
const CWCircleArc& cwCircleArc,
KyUInt32 currentSectionIdx,
128 SectionData& currentSectionData,
KyUInt32& segmentCount);
129 static void UpdateSectionData(
const Channel* channel,
const CWCircleArc& cwCircleArc,
KyUInt32 newSectionIdx,
130 SectionData& currentSectionData,
KyUInt32& segmentCount);
std::uint32_t KyUInt32
uint32_t
Definition: types.h:29
#define KY_CLASS_WITHOUT_COPY(ClassName)
Define to forbid copy constructor and copy assignment.
Definition: types.h:196
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17
std::uint8_t KyUInt8
uint8_t
Definition: types.h:27
float KyFloat32
float
Definition: types.h:32