diff options
| author | Peter Kohaut | 2019-03-09 19:03:18 +0100 | 
|---|---|---|
| committer | Peter Kohaut | 2019-03-09 19:20:28 +0100 | 
| commit | 1630cf0e6c4c278bc4913ecc0ba7503c5ff8eb06 (patch) | |
| tree | a984c3a5ac60c24b122e817a5a6216ef772722e1 | |
| parent | 664dd4a8aab66452c997facb8bd547f307415330 (diff) | |
| download | scummvm-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.cpp | 15 | 
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]) {  | 
