aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Kohaut2019-03-09 19:03:18 +0100
committerPeter Kohaut2019-03-09 19:20:28 +0100
commit1630cf0e6c4c278bc4913ecc0ba7503c5ff8eb06 (patch)
treea984c3a5ac60c24b122e817a5a6216ef772722e1
parent664dd4a8aab66452c997facb8bd547f307415330 (diff)
downloadscummvm-rg350-1630cf0e6c4c278bc4913ecc0ba7503c5ff8eb06.tar.gz
scummvm-rg350-1630cf0e6c4c278bc4913ecc0ba7503c5ff8eb06.tar.bz2
scummvm-rg350-1630cf0e6c4c278bc4913ecc0ba7503c5ff8eb06.zip
BLADERUNNER: Better fix for bug in pathfinding
Basically just more robust (but slower) fix to the intermittent assert in pathfinding code when polygons were touching only by a single corner.
-rw-r--r--engines/bladerunner/obstacles.cpp15
1 files changed, 6 insertions, 9 deletions
diff --git a/engines/bladerunner/obstacles.cpp b/engines/bladerunner/obstacles.cpp
index a0e9d7ab11..66f3f73382 100644
--- a/engines/bladerunner/obstacles.cpp
+++ b/engines/bladerunner/obstacles.cpp
@@ -191,7 +191,6 @@ bool Obstacles::mergePolygons(Polygon &polyA, Polygon &polyB) {
bool flagAddVertexToVertexList = true;
bool flagDidFindIntersection = false;
int vertIndex = 0;
- int lastIntersectionIndex = -1;
Polygon *startingPolygon = polyPrimary;
int flagDone = false;
@@ -205,7 +204,12 @@ bool Obstacles::mergePolygons(Polygon &polyA, Polygon &polyB) {
polyPrimaryType = polyPrimary->vertexType[vertIndex];
if (flagAddVertexToVertexList) {
- assert(polyMerged.verticeCount < kPolygonVertexCount);
+ // In some cases polygons will have only one intersection (touching corners) and because of that second SWAP never occure,
+ // algorithm will stop only when the merged polygon is full.
+ if (polyMerged.verticeCount >= kPolygonVertexCount) {
+ flagDidMergePolygons = false;
+ break;
+ }
polyMerged.vertices[polyMerged.verticeCount] = polyLine.start;
polyMerged.vertexType[polyMerged.verticeCount] = polyPrimaryType;
polyMerged.verticeCount++;
@@ -227,15 +231,8 @@ bool Obstacles::mergePolygons(Polygon &polyA, Polygon &polyB) {
SWAP(polyPrimary, polySecondary);
flagDidMergePolygons = true;
- lastIntersectionIndex = polySecondaryIntersectionIndex;
} else {
vertIndex = (vertIndex + 1) % polyPrimary->verticeCount;
- // In some cases polygons will have only one intersection (touching corners) and because of that second SWAP never occure and algorithm will never stop.
- // This can be avoided by stopping the algorithm after looping over whole polygon. Such polygons will not merge.
- if (vertIndex == lastIntersectionIndex) {
- flagDidMergePolygons = false;
- break;
- }
flagDidFindIntersection = false;
}
if (polyPrimary->vertices[vertIndex] == startingPolygon->vertices[0]) {