diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/chunk-region.cpp | 40 | ||||
-rw-r--r-- | src/chunk.cpp | 5 | ||||
-rw-r--r-- | src/chunk.hpp | 13 | ||||
-rw-r--r-- | src/object.cpp | 4 |
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; } |