17 class IndexedTriangleSoup2i;
22 enum DynamicVertexIntUserDataContent
24 DTI_UNKNOWN_VERTEX_USERDATA,
25 DTI_TRIANGLE_SOUP_VERTEX_TAG_DATA
36 m_outGoingEdgeIdx.Reserve(12);
40 KY_INLINE
void InsertInOutGoingEdges(
KyUInt32 dynamicHalfEdgeIdx)
42 KY_ASSERT(m_outGoingEdgeIdx.DoesContain(dynamicHalfEdgeIdx) ==
false);
43 m_outGoingEdgeIdx.PushBack(dynamicHalfEdgeIdx);
44 KY_ASSERT(m_outGoingEdgeIdx.DoesContain(dynamicHalfEdgeIdx));
47 KY_INLINE
void RemoveFromOutGoingEdges(
KyUInt32 dynamicHalfEdgeIdx)
49 KY_ASSERT(m_outGoingEdgeIdx.DoesContain(dynamicHalfEdgeIdx));
50 m_outGoingEdgeIdx.RemoveFirstOccurrence(dynamicHalfEdgeIdx);
51 KY_ASSERT(m_outGoingEdgeIdx.DoesContain(dynamicHalfEdgeIdx) ==
false);
56 AlignedCoordPos m_coordPos;
58 Collection<KyUInt32> m_outGoingEdgeIdx;
70 DynTriTriangle() : m_idx(KyUInt32MAXVAL), m_edgeIdx(KyUInt32MAXVAL), m_userData(
nullptr) {}
72 void GetLocalTriangle3i(
KyUInt32 pixelSize,
KyFloat32 rasterPrecision, Triangle3i& triangle3i)
const;
87 DynTriHalfEdge() : m_idx(KyUInt32MAXVAL), m_startVertexIdx(KyUInt32MAXVAL), m_triangleIdx(KyUInt32MAXVAL),
88 m_nextEdgeIdx(KyUInt32MAXVAL), m_pairEdgeIdx(KyUInt32MAXVAL), m_status(HalfEdgeStatus_NotOpen), m_userData(
nullptr) {}
92 HalfEdgeStatus_Open = 0,
93 HalfEdgeStatus_NotOpen = 1,
94 HalfEdgeStatus_Locked = 2,
96 HalfEdgeStatus_FORCE32 = 0xFFFFFFFF
99 KY_INLINE
bool IsABorder()
const {
return m_pairEdgeIdx ==
KyUInt32MAXVAL; }
100 KY_INLINE
bool IsLocked()
const {
return m_status == HalfEdgeStatus_Locked; }
108 HalfEdgeStatus m_status;
120 class DynTriangulationInsertionResult
126 DynTriangulationInsertionResult() : m_result(RESULT_FORCE32), m_vertexIdx(KyUInt32MAXVAL), m_halfEdgeIdx(KyUInt32MAXVAL) {}
130 RESULT_NEW_VERTEX_CREATED = 0,
131 RESULT_EXISTING_VERTEX = 1,
132 RESULT_ON_A_BORDER_EDGE = 2,
133 RESULT_NOT_IN_TRIANGLE = 3,
135 RESULT_FORCE32 = 0xFFFFFFFF
147 class DynamicTriangulation
152 KY_INLINE DynamicTriangulation(MemoryHeap* heap) :
156 m_edgeIdxToProcess(heap),
157 m_userDataContent(DTI_UNKNOWN_VERTEX_USERDATA)
160 ~DynamicTriangulation() { Clear(); }
166 KyUInt32 AddVertex(
const AlignedCoordPos& coordPos,
KyFloat32 altitude = KyFloat32MAXVAL);
170 void AddVertex(
KyUInt32 vertexIdx,
const AlignedCoordPos& coordPos,
KyFloat32 altitude = KyFloat32MAXVAL);
174 KyResult BuildFromIndexedTriangleSoup(
const IndexedTriangleSoup2i* triangulation);
175 KyResult BuildIndexedTriangleSoup(IndexedTriangleSoup2i* triangulation);
179 void GetABetterTriangulation();
189 KyUInt32 InsertANewVertexInMesh(
const CoordPos& position, DynTriangulationInsertionResult& result);
193 DynTriangulationInsertionResult InsertANewVertexInMeshAndUpdateTriangulation(
194 const CoordPos& position, KyArrayDH_POD<KyUInt32>* impactedTrianglesIndices =
nullptr);
196 KY_INLINE
void LockEdge(
KyUInt32 halfEdgeIdx)
198 DynTriHalfEdge& edge = m_edges[halfEdgeIdx];
200 if (edge.m_status != DynTriHalfEdge::HalfEdgeStatus_Locked)
202 KY_DEBUG_ASSERTN(edge.m_status == DynTriHalfEdge::HalfEdgeStatus_NotOpen ,(
"Don't change edge status during process"));
203 edge.m_status = DynTriHalfEdge::HalfEdgeStatus_Locked;
206 if (edge.IsABorder() ==
false && m_edges[edge.m_pairEdgeIdx].m_status != DynTriHalfEdge::HalfEdgeStatus_Locked)
208 KY_DEBUG_ASSERTN(m_edges[edge.m_pairEdgeIdx].m_status == DynTriHalfEdge::HalfEdgeStatus_NotOpen ,(
"Don't change edge status during process"));
209 m_edges[edge.m_pairEdgeIdx].m_status = DynTriHalfEdge::HalfEdgeStatus_Locked;
214 void GetLocalTriangle3i(
KyUInt32 triangleIdx,
KyUInt32 pixelSize,
KyFloat32 rasterPrecision, Triangle3i& triangle3i)
const;
219 void UpdateTriangulationAfterVertexInsertion(
KyUInt32 newVertexIdx);
221 bool IsEdgeLegal(
KyUInt32 halfEdgeIdx);
222 bool IsEdgeLegalAfterPointInsertion(
KyUInt32 halfEdgeIdx,
KyUInt32 newVertexIdx);
225 KyUInt32 FindTriangleThatContainsAPosition(
const CoordPos& position, DynTriangulationInsertionResult& result);
227 void InsertANewVertexInsideATriangle(
KyUInt32 newVertexIdx,
KyUInt32 triangleIdx);
228 void InsertANewVertexInTheMiddleOfAnEdge(
KyUInt32 newVertexIdx,
KyUInt32 halfEdgeIdx);
229 void InsertANewVertexInTheMiddleOfABorderEdge(
KyUInt32 newVertexIdx,
KyUInt32 halfEdgeIdx);
231 void AddToEdgeToProcessIfNotOpen(
KyUInt32 halfEdgeIdx);
232 void AddToEdgeToProcessIfIllegalAndNotOpen(
KyUInt32 halfEdgeIdx);
234 static bool IsQuadrilateralConvex(
const AlignedCoordPos& a,
const AlignedCoordPos& b,
const AlignedCoordPos& c,
const AlignedCoordPos& d);
241 KyArrayDH<DynTriTriangle> m_triangles;
242 KyArrayDH<DynTriVertex> m_vertices;
243 KyArrayDH<DynTriHalfEdge> m_edges;
245 KyArrayDH_POD<KyUInt32> m_edgeIdxToProcess;
247 DynamicVertexIntUserDataContent m_userDataContent;
251 KY_INLINE
void DynamicTriangulation::AddVertex(
KyUInt32 vertexIdx,
const AlignedCoordPos& coordPos,
KyFloat32 altitude)
253 KY_ASSERT(vertexIdx < m_vertices.GetCount());
254 KY_LOG_ERROR_IF(((coordPos.x & 0xFFFFFF00) != 0 || (coordPos.y & 0xFFFFFF00) != 0), (
"Invalid coordinates : %d - %d", coordPos.x, coordPos.y));
255 DynTriVertex& vertex = m_vertices[vertexIdx];
257 vertex.m_idx = vertexIdx;
258 vertex.m_coordPos = coordPos;
259 vertex.m_altitude = altitude;
#define KyFloat32MAXVAL
KyFloat32 max value
Definition: types.h:71
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
Vec2i CoordPos
A type that represents the position of a point within the 2D integer grid.
Definition: navmeshtypes.h:20
#define KyInt32MAXVAL
KyInt32 max value
Definition: types.h:60
Navigation return code class.
Definition: types.h:108
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17
#define KyUInt32MAXVAL
KyUInt32 max value
Definition: types.h:68
float KyFloat32
float
Definition: types.h:32