diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2023-10-07 23:48:21 +0200 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2023-10-07 23:48:21 +0200 |
commit | ef47c7d8bcf5c60d086ab24b5d2f9c31a65c57c0 (patch) | |
tree | 02d3ff558f1a92a99fef12dab83b69079d509a7e /src | |
parent | 823aeb462cd46114ac290c0a415879f96d69c18e (diff) |
a
Diffstat (limited to 'src')
-rw-r--r-- | src/object.cpp | 2 | ||||
-rw-r--r-- | src/object.hpp | 2 | ||||
-rw-r--r-- | src/path-search-dijkstra.cpp | 12 |
3 files changed, 14 insertions, 2 deletions
diff --git a/src/object.cpp b/src/object.cpp index 3c2be9ef..1d089bf6 100644 --- a/src/object.cpp +++ b/src/object.cpp @@ -112,7 +112,7 @@ void object::rotate(size_t, rotation new_r) template <typename T> constexpr T sgn(T val) { return T(T(0) < val) - T(val < T(0)); } -Pair<global_coords, Vector2b> object::normalize_coords(global_coords coord, Vector2b cur_offset, Vector2i new_offset) +point object::normalize_coords(global_coords coord, Vector2b cur_offset, Vector2i new_offset) { auto off_tmp = Vector2i(cur_offset) + new_offset; auto off_new = off_tmp % iTILE_SIZE2; diff --git a/src/object.hpp b/src/object.hpp index fca4640d..41ea1f97 100644 --- a/src/object.hpp +++ b/src/object.hpp @@ -75,7 +75,7 @@ struct object virtual void set_bbox(Vector2b offset, Vector2b bbox_offset, Vector2ub bbox_size, pass_mode pass); object_type type_of() const noexcept; - static Pair<global_coords, Vector2b> normalize_coords(global_coords coord, Vector2b cur_offset, Vector2i delta); + static point normalize_coords(global_coords coord, Vector2b cur_offset, Vector2i delta); virtual bool is_dynamic() const; bool can_rotate(rotation new_r); diff --git a/src/path-search-dijkstra.cpp b/src/path-search-dijkstra.cpp index beb87ddd..2fbc11e0 100644 --- a/src/path-search-dijkstra.cpp +++ b/src/path-search-dijkstra.cpp @@ -124,6 +124,14 @@ size_t astar::edge_hash::operator()(const edge& e) const #endif } +constexpr astar::edge make_edge(const point& a, const point& b) +{ + if (a < b) + return { a.coord, b.coord, a.offset, b.offset }; + else + return { b.coord, a.coord, b.offset, a.offset }; +} + path_search_result path_search::Dijkstra(world& w, Vector2ub own_size, const object_id own_id, const point from_, const point to_, const pred& p) { @@ -201,6 +209,10 @@ path_search_result path_search::Dijkstra(world& w, Vector2ub own_size, const obj continue; auto [new_coord, new_offset] = object::normalize_coords(node.coord, node.offset, vec); + + if (!astar.edges.insert(make_edge({node.coord, node.offset}, {new_coord, new_offset})).second) + continue; + auto [it, found] = astar.indexes.try_emplace({.coord = new_coord, .offset = new_offset}, (uint32_t)-1); if (!found) { |