summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/chunk-region.cpp40
-rw-r--r--src/chunk.cpp5
-rw-r--r--src/chunk.hpp13
-rw-r--r--src/object.cpp4
4 files changed, 9 insertions, 53 deletions
diff --git a/src/chunk-region.cpp b/src/chunk-region.cpp
index c976fd28..c0afe9f0 100644
--- a/src/chunk-region.cpp
+++ b/src/chunk-region.cpp
@@ -128,44 +128,14 @@ auto default_region_predicate(chunk& c) noexcept
} // namespace
-void chunk::delete_pass_region(pass_region*& ptr)
+auto chunk::make_pass_region() -> pass_region
{
- if (ptr)
- {
- delete ptr;
- ptr = nullptr;
- }
+ return make_pass_region(default_region_predicate(*this));
}
-auto chunk::get_pass_region() -> const pass_region*
+auto chunk::make_pass_region(const pred& f) -> pass_region
{
- if (!_region_modified)
- {
- fm_debug_assert(_region != nullptr);
- return _region;
- }
- _region_modified = false;
-
- if (!_region)
- _region = new pass_region;
- else
- _region->bits = {};
-
- make_pass_region(*_region);
- return _region;
-}
-
-bool chunk::is_region_modified() const noexcept { return _region_modified; }
-void chunk::mark_region_modified() noexcept { _region_modified = true; }
-
-void chunk::make_pass_region(pass_region& ret)
-{
- return make_pass_region(ret, default_region_predicate(*this));
-}
-
-void chunk::make_pass_region(pass_region& ret, const pred& f)
-{
- ret = {};
+ pass_region ret;
auto& tmp = get_tmp();
const auto nbs = _world->neighbors(_coord);
@@ -204,6 +174,8 @@ void chunk::make_pass_region(pass_region& ret, const pred& f)
tmp.append(ret.bits, pos);
}
}
+
+ return ret;
}
} // namespace floormat
diff --git a/src/chunk.cpp b/src/chunk.cpp
index 18b8a6f1..a3c03b81 100644
--- a/src/chunk.cpp
+++ b/src/chunk.cpp
@@ -126,7 +126,6 @@ void chunk::mark_passability_modified() noexcept
if (!_pass_modified && is_log_verbose()) [[unlikely]]
fm_debug("pass reload %zu", ++_reload_no_);
_pass_modified = true;
- _region_modified = true;
}
bool chunk::is_passability_modified() const noexcept { return _pass_modified; }
@@ -153,7 +152,6 @@ chunk::~chunk() noexcept
arrayResize(_objects, 0);
arrayShrink(_objects);
_rtree->RemoveAll();
- delete_pass_region(_region);
}
chunk::chunk(chunk&&) noexcept = default;
@@ -162,7 +160,6 @@ chunk& chunk::operator=(chunk&&) noexcept = default;
void chunk::add_object_unsorted(const std::shared_ptr<object>& e)
{
_objects_sorted = false;
- _region_modified = true;
if (!e->is_dynamic())
mark_scenery_modified();
if (bbox bb; _bbox_for_scenery(*e, bb))
@@ -185,7 +182,6 @@ void chunk::sort_objects()
void chunk::add_object(const std::shared_ptr<object>& e)
{
fm_assert(_objects_sorted);
- _region_modified = true;
if (!e->is_dynamic())
mark_scenery_modified();
if (bbox bb; _bbox_for_scenery(*e, bb))
@@ -199,7 +195,6 @@ void chunk::add_object(const std::shared_ptr<object>& e)
void chunk::remove_object(size_t i)
{
fm_assert(_objects_sorted);
- _region_modified = true;
auto& es = _objects;
fm_debug_assert(i < es.size());
const auto e = es[i];
diff --git a/src/chunk.hpp b/src/chunk.hpp
index 682482f7..e2b812fb 100644
--- a/src/chunk.hpp
+++ b/src/chunk.hpp
@@ -27,7 +27,6 @@ public:
friend struct tile_ref;
friend struct object;
friend class world;
- struct pass_region;
tile_ref operator[](size_t idx) noexcept;
tile_proto operator[](size_t idx) const noexcept;
@@ -63,12 +62,10 @@ public:
void mark_walls_modified() noexcept;
void mark_scenery_modified() noexcept;
void mark_passability_modified() noexcept;
- void mark_region_modified() noexcept;
void mark_modified() noexcept;
bool is_passability_modified() const noexcept;
bool is_scenery_modified() const noexcept;
- bool is_region_modified() const noexcept;
struct ground_mesh_tuple final {
GL::Mesh& mesh;
@@ -84,6 +81,7 @@ public:
struct object_draw_order;
struct scenery_mesh_tuple;
struct scenery_scratch_buffers;
+ struct pass_region;
struct vertex {
Vector3 position;
@@ -119,9 +117,8 @@ public:
static constexpr size_t max_wall_quad_count =
TILE_COUNT*Wall::Direction_COUNT*(Wall::Group_COUNT+4);
- const pass_region* get_pass_region();
- void make_pass_region(pass_region& ret);
- void make_pass_region(pass_region& ret, const Search::pred& f);
+ pass_region make_pass_region();
+ pass_region make_pass_region(const Search::pred& f);
private:
struct ground_stuff
@@ -140,7 +137,6 @@ private:
Pointer<ground_stuff> _ground;
Pointer<wall_stuff> _walls;
- pass_region* _region = nullptr;
Array<std::shared_ptr<object>> _objects;
class world* _world;
GL::Mesh ground_mesh{NoCreate}, wall_mesh{NoCreate}, scenery_mesh{NoCreate};
@@ -152,15 +148,12 @@ private:
_walls_modified : 1 = true,
_scenery_modified : 1 = true,
_pass_modified : 1 = true,
- _region_modified : 1 = true,
_teardown : 1 = false,
_objects_sorted : 1 = true;
void ensure_scenery_buffers(scenery_scratch_buffers bufs);
static topo_sort_data make_topo_sort_data(object& e, uint32_t mesh_idx);
- static void delete_pass_region(pass_region*& ptr);
-
struct bbox final
{
collision_data data;
diff --git a/src/object.cpp b/src/object.cpp
index 010c1aa5..307a2155 100644
--- a/src/object.cpp
+++ b/src/object.cpp
@@ -68,7 +68,6 @@ object::~object() noexcept
if (chunk::bbox bb; c->_bbox_for_scenery(*this, bb))
c->_remove_bbox(bb);
c->_world->do_kill_object(id);
- c->mark_region_modified();
const_cast<object_id&>(id) = 0;
}
@@ -241,7 +240,6 @@ void object::move_to(size_t& i, Vector2i delta, rotation new_r)
if (coord_.chunk() == coord.chunk())
{
c->_replace_bbox(bb0, bb1, b0, b1);
- c->mark_region_modified();
const_cast<global_coords&>(coord) = coord_;
set_bbox_(offset_, bb_offset, bb_size, pass);
const_cast<rotation&>(r) = new_r;
@@ -253,7 +251,6 @@ void object::move_to(size_t& i, Vector2i delta, rotation new_r)
c2.mark_scenery_modified();
c2._add_bbox(bb1);
c->remove_object(i);
- c->mark_region_modified();
auto& es = c2._objects;
auto it = std::lower_bound(es.cbegin(), es.cend(), e_, object_id_lessp);
const_cast<global_coords&>(coord) = coord_;
@@ -305,7 +302,6 @@ void object::set_bbox(Vector2b offset_, Vector2b bb_offset_, Vector2ub bb_size_,
set_bbox_(offset_, bb_offset_, bb_size_, pass);
const bool b = c->_bbox_for_scenery(*this, bb);
c->_replace_bbox(bb0, bb, b0, b);
- c->mark_region_modified();
}
bool object::can_activate(size_t) const { return false; }