156 Mesh.ReserveTriangles(ReserveTriangles);
166 for (
int32 Level(0); Level < 32; ++Level)
207 if (!
Edge.bTagged.test_and_set(std::memory_order_relaxed))
233 if (!
Edge.bTagged.test_and_set(std::memory_order_relaxed))
254 std::atomic<int32> NumNewTriangles(0);
259 if (!Mesh.IsValidTri(TriIndex))
268 check(SplitMask == 7);
295 NumNewTriangles.fetch_add(3, std::memory_order_relaxed);
297 else if (SplitMask == 1 || SplitMask == 2 || SplitMask == 4)
301 NumNewTriangles.fetch_add(1, std::memory_order_relaxed);
303 else if (SplitMask != 0)
306 NumNewTriangles.fetch_add(2, std::memory_order_relaxed);
313 const int32 TriIndex = TriSplitQueue[Idx];
314 check(ConcurrencyState.TriSplitRecords[TriIndex].SplitMask != 0);
316 if (ConcurrencyState.TriSplitRecords[TriIndex].IsSplit1())
319 for (int32 NbIdx=0; NbIdx<3; ++NbIdx)
321 const TPair<int32,int32> TriEdge = Mesh.GetAdjEdge(TriIndex, NbIdx);
322 if (TriEdge.Get<0>() != IndexConstants::InvalidID && ConcurrencyState.TriSplitRecords[TriEdge.Get<0>()].SplitMask != 0)
324 ConcurrencyState.TriSplitRecords[TriEdge.Get<0>()].GreenAdjMask.fetch_or(static_cast<uint16>(1u << TriEdge.Get<1>()));
352 const int32 EdgeIndex = EdgeSplitRequests[RequestIdx];
353 FEdgeSplitRecord& Edge = ConcurrencyState.EdgeSplitRecords[EdgeIndex];
355 Edge.NewEdge = PrevEdgeCount + RequestIdx;
356 Edge.SplitVertex = PrevVtxCount + RequestIdx;
358 FIndex2i VertexIndices, Tris;
360 Mesh.GetEdge(EdgeIndex, VertexIndices, Tris);
361 Mesh.InterpolateVertex(0.5f, Edge.SplitVertex, EdgeIndex);
362 RefinementPolicy.VertexAdded(Edge.SplitVertex, Tris);
370 Mesh.AddTriangles(NumNewTriangles.load());
377 const int32 TriIndex = TriSplitQueue[Idx];
378 check(ConcurrencyState.TriSplitRecords[TriIndex].SplitMask != 0);
380 if (ConcurrencyState.TriSplitRecords[TriIndex].IsSplit3())
382 const int32 FirstNewTri = Split3(TriIndex, ConcurrencyState);
385 const int32 QueueIdx = NumRefinementCand.fetch_add(4, std::memory_order_relaxed);
386 RefinementCand[QueueIdx+0] = FirstNewTri+0;
387 RefinementCand[QueueIdx+1] = FirstNewTri+1;
388 RefinementCand[QueueIdx+2] = FirstNewTri+2;
389 RefinementCand[QueueIdx+3] = TriIndex;
393 Split2(TriIndex, ConcurrencyState);
397 Split1(TriIndex, ConcurrencyState);