22 class SweepLineOutputEdgePiece
26 SweepLineOutputEdgePiece(): m_correspondingRawInputEdgeIdx(
KyUInt32MAXVAL), m_navTagIndex(KyUInt32MAXVAL), m_userData(
nullptr) {}
27 SweepLineOutputEdgePiece(
const EdgePoints& subSegment,
const InputEdge& parentEdge) :
28 m_rawInputEdgePiece(subSegment, parentEdge), m_correspondingRawInputEdgeIdx(
KyUInt32MAXVAL), m_navTagIndex(
KyUInt32MAXVAL), m_userData(nullptr) {}
30 const InputEdgeProperty& ParentProperty()
const {
return m_rawInputEdgePiece.ParentProperty(); }
31 bool IsVertical()
const {
return m_rawInputEdgePiece.IsVertical(); }
32 KyInt32 GetCount()
const {
return m_rawInputEdgePiece.GetCount(); }
33 const Vec2i& GetEdgeStart()
const {
return m_rawInputEdgePiece.GetEdgeStart(); }
34 const Vec2i& GetEdgeEnd()
const {
return m_rawInputEdgePiece.GetEdgeEnd(); }
35 const Vec2i& GetOriginalStart()
const {
return m_rawInputEdgePiece.GetOriginalStart(); }
36 const Vec2i& GetOriginalEnd()
const {
return m_rawInputEdgePiece.GetOriginalEnd(); }
39 InputEdgePiece m_rawInputEdgePiece;
40 KyUInt32 m_correspondingRawInputEdgeIdx;
42 mutable void* m_userData;
52 inline void Insert(InputEdgePiece& elem,
KyUInt32 navTagIdx)
54 SweepLineOutputEdgePiece& newElem = m_rawResults.PushDefault();
55 newElem.m_rawInputEdgePiece = elem;
57 newElem.m_correspondingRawInputEdgeIdx = elem.m_index;
58 newElem.m_rawInputEdgePiece.m_index = m_rawResults.GetCount() - 1;
59 newElem.m_navTagIndex = navTagIdx;
61 const Vec2i& edgeStart = elem.m_extremities.m_start;
62 const Vec2i& edgeEnd = elem.m_extremities.m_end;
68 if (edgeEnd < edgeStart)
71 Alg::Swap(newElem.m_rawInputEdgePiece.m_extremities.m_start, newElem.m_rawInputEdgePiece.m_extremities.m_end);
72 newElem.m_rawInputEdgePiece.m_count *= -1;
76 for (; thisNavTagIndexPos < m_navTagIndexes.GetCount(); ++thisNavTagIndexPos)
78 if(m_navTagIndexes[thisNavTagIndexPos] == navTagIdx)
80 m_elemByNavTag[thisNavTagIndexPos].PushBack(newElem.m_rawInputEdgePiece.m_index);
85 KY_ASSERT(thisNavTagIndexPos == m_navTagIndexes.GetCount());
86 m_navTagIndexes.PushBack(navTagIdx);
87 m_elemByNavTag.PushDefault().PushBack(newElem.m_rawInputEdgePiece.m_index);
88 KY_ASSERT(m_elemByNavTag.GetCount() == m_navTagIndexes.GetCount());
94 m_navTagIndexes.Clear();
95 m_elemByNavTag.Clear();
98 KyArray<SweepLineOutputEdgePiece> m_rawResults;
99 KyArray<KyUInt32> m_navTagIndexes;
100 KyArray<KyArray<KyUInt32> > m_elemByNavTag;
104 struct SweeplineProperty
109 SweeplineProperty() : m_halfEdge(
nullptr), m_count(0) {}
110 SweeplineProperty(
const InputEdgePiece& he) : m_halfEdge(&he), m_count(he.GetCount()) {}
112 bool operator <(
const SweeplineProperty& rhs)
const {
return m_halfEdge->ParentProperty() < rhs.m_halfEdge->ParentProperty(); }
115 const InputEdgePiece* m_halfEdge;
119 static inline bool ArePropertiesFromSameContour(
const SweeplineProperty& prop1,
const SweeplineProperty& prop2)
120 {
return prop1.m_halfEdge->ParentProperty() == prop2.m_halfEdge->ParentProperty(); }
122 class ScanDataElement
126 ScanDataElement() : m_edge(
nullptr), m_propertyList(
nullptr) {}
127 ScanDataElement(
const InputEdgePiece& edge, SharedPoolList<SweeplineProperty>* properties) : m_edge(&edge), m_propertyList(properties) {}
130 const InputEdgePiece* m_edge;
131 SharedPoolList<SweeplineProperty>* m_propertyList;
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
#define KY_DEFINE_NEW_DELETE_OPERATORS(MemStat)
This macro defines new and delete operators.
Definition: memory.h:132
#define KyUInt8MAXVAL
KyUInt8 max value
Definition: types.h:66
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17
std::int32_t KyInt32
int32_t
Definition: types.h:24
#define KyUInt32MAXVAL
KyUInt32 max value
Definition: types.h:68