summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2023-10-21 20:46:48 +0200
committerStanislaw Halik <sthalik@misaki.pl>2023-10-21 20:47:15 +0200
commit0e4539dfcb89e19f9d3917a86879c9eb658db7e4 (patch)
treeba541ec19db70d7e912929881aa97e2ac2815c9d
parentd34bfc5be1d9de17470e7306be6104889e633b40 (diff)
a
-rw-r--r--src/dijkstra.cpp13
-rw-r--r--src/path-search.cpp26
-rw-r--r--test/save/quicksave - Copy (0028).datbin0 -> 4137 bytes
3 files changed, 22 insertions, 17 deletions
diff --git a/src/dijkstra.cpp b/src/dijkstra.cpp
index b742c276..5b50a8f0 100644
--- a/src/dijkstra.cpp
+++ b/src/dijkstra.cpp
@@ -126,7 +126,7 @@ path_search_result astar::Dijkstra(world& w, const point from_, const point to_,
clear();
cache.allocate(from_, max_dist);
- constexpr auto min_size = Vector2ui{div_size*3/2};
+ constexpr auto min_size = Vector2ui{div_size};
const auto own_size = Math::max(Vector2ui(own_size_), min_size);
constexpr auto goal_thres = (uint32_t)(div_size.length() + 1.5f);
@@ -147,20 +147,17 @@ path_search_result astar::Dijkstra(world& w, const point from_, const point to_,
return {};
cache.allocate(from_, max_dist);
- nodes.push_back({.dist = 0, .pt = from_, });
- add_to_heap(0);
- { const auto bb0 = bbox_from_pos(Vector2(from.local()), {}, own_size);
+ { const auto bb0 = bbox_from_pos(Vector2(from.local()), from_offset, own_size);
constexpr int8_t div_min = -div_factor*2, div_max = div_factor*2;
for (int8_t y = div_min; y <= div_max; y++)
for (int8_t x = div_min; x <= div_max; x++)
{
- auto off_ = Vector2i(x, y) * div_size;
- auto off = Vector2(off_);
- auto bb1 = bbox<float>{ bb0.min + off, bb0.max + off};
+ auto off = Vector2i(x, y) * div_size;
+ auto pt = object::normalize_coords({from, {}}, off);
+ auto bb1 = bbox_from_pos(Vector2(pt.local()), pt.offset(), own_size);
auto bb = bbox_union(bb0, bb1);
- auto pt = object::normalize_coords({from, {}}, off_);
auto dist = distance(from_, pt);
if (path_search::is_passable(w, from.chunk3(), bb, own_id, p))
diff --git a/src/path-search.cpp b/src/path-search.cpp
index d792befa..66a7e4af 100644
--- a/src/path-search.cpp
+++ b/src/path-search.cpp
@@ -7,6 +7,7 @@
#include <Corrade/Containers/PairStl.h>
#include <Magnum/Math/Functions.h>
#include <Magnum/Math/Range.h>
+#include <Magnum/Math/BitVector.h>
namespace floormat {
@@ -21,6 +22,11 @@ constexpr auto never_continue_ = path_search::pred{never_continue_1};
constexpr auto always_continue_1 = [](collision_data) constexpr { return path_search_continue::pass; };
constexpr auto always_continue_ = path_search::pred{always_continue_1};
+inline bool rect_intersects(Vector2 min1, Vector2 max1, Vector2 min2, Vector2 max2)
+{
+ return bool{min1 < max2} && bool{max1 > min2};
+}
+
} // namespace
auto path_search::never_continue() noexcept -> const pred& { return never_continue_; }
@@ -30,16 +36,18 @@ bool path_search::is_passable_1(chunk& c, Vector2 min, Vector2 max, object_id ow
{
auto& rt = *c.rtree();
bool is_passable = true;
- rt.Search(min.data(), max.data(), [&](uint64_t data, const auto&) {
- [[maybe_unused]] auto x = std::bit_cast<collision_data>(data);
- if (x.data != own_id)
+ rt.Search(min.data(), max.data(), [&](uint64_t data, const auto& r)
+ {
+ auto x = std::bit_cast<collision_data>(data);
+ if (x.data != own_id && x.pass != (uint64_t)pass_mode::pass)
{
- if (x.pass != (uint64_t)pass_mode::pass && p(x) != path_search_continue::pass)
- {
- is_passable = false;
- //[[maybe_unused]] auto obj = c.world().find_object(x.data);
- return false;
- }
+ if (rect_intersects(min, max, {r.m_min[0], r.m_min[1]}, {r.m_max[0], r.m_max[1]}))
+ if (p(x) != path_search_continue::pass)
+ {
+ is_passable = false;
+ //[[maybe_unused]] auto obj = c.world().find_object(x.data);
+ return false;
+ }
}
return true;
});
diff --git a/test/save/quicksave - Copy (0028).dat b/test/save/quicksave - Copy (0028).dat
new file mode 100644
index 00000000..a0fc36bd
--- /dev/null
+++ b/test/save/quicksave - Copy (0028).dat
Binary files differ