Rename variables in pathfinding.c to be more clear
This commit is contained in:
@@ -24,20 +24,25 @@ bool findPath(const PathfindingDesc *desc) {
|
||||
i8 x : 3;
|
||||
i8 y : 3;
|
||||
} Visited;
|
||||
Visited visited[map->width * map->height] = {};
|
||||
bzMemSet(visited, 0, sizeof(visited));
|
||||
Visited closedSet[map->width * map->height] = {};
|
||||
|
||||
PathNode *heap = desc->heap;
|
||||
if (!heap) heap = bzHeapCreate(PathNode, map->width * map->height);
|
||||
else bzHeapClear(heap);
|
||||
PathNode *openSet = desc->openSet;
|
||||
if (!openSet) openSet = bzHeapCreate(PathNode, map->width * map->height);
|
||||
else bzHeapClear(openSet);
|
||||
|
||||
i32 toTargetCost = dst(desc->start, desc->target);
|
||||
bzHeapPush(heap, (PathNode) {toTargetCost, 0, toTargetCost, desc->start});
|
||||
bzHeapPush(openSet, (PathNode) {
|
||||
.weight=toTargetCost,
|
||||
.gCost=0,
|
||||
.hCost=toTargetCost,
|
||||
.visited=false,
|
||||
.pos=desc->start
|
||||
});
|
||||
|
||||
bool foundPath = false;
|
||||
|
||||
while (!bzHeapIsEmpty(heap)) {
|
||||
PathNode node = bzHeapPop(heap);
|
||||
while (!bzHeapIsEmpty(openSet)) {
|
||||
PathNode node = bzHeapPop(openSet);
|
||||
if (node.pos.x == desc->target.x &&
|
||||
node.pos.y == desc->target.y) {
|
||||
// Found path
|
||||
@@ -45,8 +50,7 @@ bool findPath(const PathfindingDesc *desc) {
|
||||
break;
|
||||
}
|
||||
|
||||
visited[node.pos.y * map->width + node.pos.x].visited = true;
|
||||
|
||||
// Node edges
|
||||
for (int y = node.pos.y - 1; y <= node.pos.y + 1; y++) {
|
||||
for (int x = node.pos.x - 1; x <= node.pos.x + 1; x++) {
|
||||
if (x == node.pos.x && y == node.pos.y)
|
||||
@@ -54,22 +58,23 @@ bool findPath(const PathfindingDesc *desc) {
|
||||
if (y < 0 || y >= map->height ||
|
||||
x < 0 || x >= map->width)
|
||||
continue;
|
||||
// not walkable
|
||||
if (bzTileMapHasCollision(map, x, y))
|
||||
continue;
|
||||
Visited *curVisited = &visited[y * map->width + x];
|
||||
if (curVisited->visited)
|
||||
Visited *curClosed = &closedSet[y * map->width + x];
|
||||
if (curClosed->visited)
|
||||
continue;
|
||||
curVisited->visited = true;
|
||||
curClosed->visited = true;
|
||||
|
||||
TilePosition curPos = {x, y};
|
||||
i32 gCost = node.gCost + dst(node.pos, curPos);
|
||||
//if (gCost >= node.gCost) continue;
|
||||
toTargetCost = dst(curPos, desc->target);
|
||||
|
||||
curVisited->x = (i8) (curPos.x - node.pos.x);
|
||||
curVisited->y = (i8) (curPos.y - node.pos.y);
|
||||
curClosed->x = (i8) (curPos.x - node.pos.x);
|
||||
curClosed->y = (i8) (curPos.y - node.pos.y);
|
||||
|
||||
bzHeapPush(heap, (PathNode) {
|
||||
bzHeapPush(openSet, (PathNode) {
|
||||
.weight = gCost + toTargetCost,
|
||||
.gCost = gCost,
|
||||
.hCost = toTargetCost,
|
||||
@@ -108,7 +113,7 @@ bool findPath(const PathfindingDesc *desc) {
|
||||
pathData->waypoints[numWaypoints++] = waypoint;
|
||||
pathData->numWaypoints = numWaypoints;
|
||||
|
||||
Visited visit = visited[pos.y * map->width + pos.x];
|
||||
Visited visit = closedSet[pos.y * map->width + pos.x];
|
||||
BZ_ASSERT(visit.x != 0 || visit.y != 0);
|
||||
pos.x -= visit.x;
|
||||
pos.y -= visit.y;
|
||||
@@ -134,10 +139,8 @@ bool findPath(const PathfindingDesc *desc) {
|
||||
}
|
||||
}
|
||||
|
||||
if (!desc->heap) {
|
||||
bzHeapDestroy(heap);
|
||||
heap = NULL;
|
||||
}
|
||||
if (!desc->openSet)
|
||||
bzHeapDestroy(openSet);
|
||||
|
||||
return foundPath ? pathLen : -1;
|
||||
}
|
||||
Reference in New Issue
Block a user