dungeon/src/Pathfinder.h

72 lines
1.5 KiB
C++

#pragma once
#include "vec2i.h"
#include <vector>
class Tilemap;
namespace Pathfinder
{
struct AStarNode
{
vec2i pos;
float f, g, h = 0;
AStarNode* from = nullptr;
};
struct DijkstraMap {
float* tilemap = nullptr;
int width, height;
float get_value(int x, int y) {
if (x >= 0 && x < width && y >= 0 && y < height) {
return tilemap[y*width + x];
}
else {
return 99999999;
}
}
void setValue(int x, int y, float val) {
if (x >= 0 && x < width && y >= 0 && y < height) {
tilemap[y*width + x] = val;
}
}
void mult(float val) {
for (int i = 0; i < width * height; i++) {
tilemap[i] *= val;
}
}
void add(float val) {
for (int i = 0; i < width * height; i++) {
tilemap[i] += val;
}
}
void abs() {
for (int i = 0; i < width * height; i++) {
if (tilemap[i] < 0) {
tilemap[i] *= -1;
}
}
}
void clamp(float min, float max) {
for (int i = 0; i < width * height; i++) {
if (tilemap[i] < min) {
tilemap[i] = min;
}
else if (tilemap[i] > max) {
tilemap[i] = max;
}
}
}
};
float distance(vec2i a, vec2i b);
std::vector<vec2i> a_star(Tilemap* map, vec2i start, vec2i goal);
void calc_dijkstra_map(Tilemap& map, std::vector<vec2i>& goals, DijkstraMap& out, float maxValue = 32);
}