Fix several overculling artifacts

This commit is contained in:
Manuel Vögele
2022-03-02 23:31:21 +01:00
parent 4cdbd61259
commit 1783d26362
+15 -5
View File
@@ -48,19 +48,29 @@ export function findPath(from, to, token, previousWaypoints) {
if (path.length >= 2 && !stepCollidesWithWall(path[path.length - 2], currentNode.node, token)) if (path.length >= 2 && !stepCollidesWithWall(path[path.length - 2], currentNode.node, token))
// Replace last waypoint if the current waypoint leads to a valid path that isn't longer than the old path // Replace last waypoint if the current waypoint leads to a valid path that isn't longer than the old path
if (window.terrainRuler) { if (window.terrainRuler) {
let startNode = getCenterFromGridPositionObj(currentNode.node); let startNode = getCenterFromGridPositionObj(path[path.length - 2]);
let middleNode = getCenterFromGridPositionObj(path[path.length - 1]); let middleNode = getCenterFromGridPositionObj(path[path.length - 1]);
let endNode = getCenterFromGridPositionObj(path[path.length - 2]); let endNode = getCenterFromGridPositionObj(currentNode.node);
let oldPath = [{ray: new Ray(startNode, middleNode)}, {ray: new Ray(middleNode, endNode)}]; let oldPath = [{ray: new Ray(startNode, middleNode)}, {ray: new Ray(middleNode, endNode)}];
let newPath = [{ray: new Ray(startNode, endNode)}]; let newPath = [{ray: new Ray(startNode, endNode)}];
// TODO Use correct token shape
let costFunction = buildCostFunction(token, [{x: 0, y: 0}]);
// TODO Cache the used measurement for use in the next loop to improve performance // TODO Cache the used measurement for use in the next loop to improve performance
let oldDistance = terrainRuler.measureDistances(oldPath).reduce((a, b) => a + b); let oldDistance = terrainRuler.measureDistances(oldPath, {costFunction}).reduce((a, b) => a + b);
let newDistance = terrainRuler.measureDistances(newPath)[0]; let newDistance = terrainRuler.measureDistances(newPath, {costFunction})[0];
// TODO We might need to check if the diagonal count has increased on 5-10-5 // TODO We might need to check if the diagonal count has increased on 5-10-5
if (newDistance <= oldDistance) { if (newDistance < oldDistance) {
path.pop(); path.pop();
} }
else if (newDistance === oldDistance) {
let oldNoDiagonals = oldPath[1].ray.terrainRulerFinalState?.noDiagonals;
let newNoDiagonals = newPath[0].ray.terrainRulerFinalState?.noDiagonals;
// This uses === && < instead of <= because the variables might be undefined (which shall lead to a true result)
if (oldNoDiagonals === newNoDiagonals || newNoDiagonals < oldNoDiagonals) {
path.pop();
}
}
} }
else { else {
path.pop(); path.pop();