Skip to content

Commit

Permalink
Merge pull request #597 from FFXIV-CombatReborn/mergeWIP
Browse files Browse the repository at this point in the history
hitching is forbidden
  • Loading branch information
CarnifexOptimus authored Feb 9, 2025
2 parents e7cc31d + 1187f5c commit 3e2bf17
Showing 1 changed file with 35 additions and 37 deletions.
72 changes: 35 additions & 37 deletions BossMod/Util/Polygon.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Clipper2Lib;
using EarcutNet;
using System.Threading;

// currently we use Clipper2 library (based on Vatti algorithm) for boolean operations and Earcut.net library (earcutting) for triangulating
// note: the major user of these primitives is bounds clipper; since they operate in 'local' coordinates, we use WDir everywhere (offsets from center) and call that 'relative polygons' - i'm not quite happy with that, it's not very intuitive
Expand Down Expand Up @@ -89,50 +90,47 @@ public bool Contains(WDir p)
ref var edgeBuckets = ref _edgeBuckets;
if (edgeBuckets == null)
{
lock (_edgeBucketLock)
var holecount = HoleStarts.Count;
ContourEdgeBuckets[] holeEdgeBuckets;
var exteriorTask = Task.Run(() => BuildEdgeBucketsForContour(Exterior));
switch (holecount)
{
// Double-check to prevent race conditions
if (_edgeBuckets == null)
{
var exteriorTask = Task.Run(() => BuildEdgeBucketsForContour(Exterior));
var holecount = HoleStarts.Count;
ContourEdgeBuckets[] holeEdgeBuckets;
switch (holecount)
case 0:
holeEdgeBuckets = [];
break;
case 1:
holeEdgeBuckets = new ContourEdgeBuckets[1];
holeEdgeBuckets[0] = Task.Run(() => BuildEdgeBucketsForContour(Interior(0))).Result;
break;
default:
holeEdgeBuckets = new ContourEdgeBuckets[holecount];
var holeTasks = new Task[holecount];
for (var i = 0; i < holecount; ++i)
{
case 0:
holeEdgeBuckets = [];
break;
case 1:
holeEdgeBuckets = new ContourEdgeBuckets[1];
holeEdgeBuckets[0] = Task.Run(() => BuildEdgeBucketsForContour(Interior(0))).Result;
break;
default:
holeEdgeBuckets = new ContourEdgeBuckets[holecount];
var holeTasks = new Task[holecount];
for (var i = 0; i < holecount; ++i)
{
var index = i;
holeTasks[i] = Task.Run(() =>
{
holeEdgeBuckets[index] = BuildEdgeBucketsForContour(Interior(index));
});
}
Task.WaitAll(holeTasks);
break;
holeTasks[i] = Task.Run(() =>
{
holeEdgeBuckets[i] = BuildEdgeBucketsForContour(Interior(i));
});
}
edgeBuckets = new EdgeBuckets(exteriorTask.Result, holeEdgeBuckets);
}
Task.WaitAll(holeTasks);
break;
}
}

if (!InSimplePolygon(p, edgeBuckets!.ExteriorEdgeBuckets))
return false;
var newEdgeBuckets = new EdgeBuckets(exteriorTask.Result, holeEdgeBuckets);
var original = Interlocked.CompareExchange(ref _edgeBuckets, newEdgeBuckets, null);

for (var i = 0; i < edgeBuckets.HoleEdgeBuckets.Length; ++i)
{
if (InSimplePolygon(p, edgeBuckets.HoleEdgeBuckets[i]))
return false;
edgeBuckets = original ?? newEdgeBuckets;
}

if (!InSimplePolygon(p, edgeBuckets.ExteriorEdgeBuckets))
return false;
var len = edgeBuckets.HoleEdgeBuckets.Length;
if (len != 0)
for (var i = 0; i < len; ++i)
{
if (InSimplePolygon(p, edgeBuckets.HoleEdgeBuckets[i]))
return false;
}
return true;
}

Expand Down

0 comments on commit 3e2bf17

Please sign in to comment.