72 lines
1.5 KiB
C++
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);
|
|
}
|