diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/chunk.cpp | 19 | ||||
-rw-r--r-- | src/chunk.hpp | 2 | ||||
-rw-r--r-- | src/entity.cpp | 9 | ||||
-rw-r--r-- | src/world.cpp | 3 |
4 files changed, 20 insertions, 13 deletions
diff --git a/src/chunk.cpp b/src/chunk.cpp index e0a09012..3adce5de 100644 --- a/src/chunk.cpp +++ b/src/chunk.cpp @@ -63,13 +63,11 @@ void chunk::mark_walls_modified() noexcept mark_passability_modified(); } -void chunk::mark_scenery_modified(bool collision_too) noexcept // todo remove bool +void chunk::mark_scenery_modified() noexcept { if (!_scenery_modified && !is_log_quiet()) fm_debug("scenery reload %zu", ++_reload_no_); _scenery_modified = true; - if (collision_too) - mark_passability_modified(); } void chunk::mark_passability_modified() noexcept @@ -86,7 +84,7 @@ void chunk::mark_modified() noexcept { mark_ground_modified(); mark_walls_modified(); - mark_scenery_modified(false); + mark_scenery_modified(); mark_passability_modified(); } @@ -110,7 +108,7 @@ void chunk::add_entity_unsorted(const std::shared_ptr<entity>& e) { _entities_sorted = false; if (!e->is_dynamic()) - mark_scenery_modified(false); + mark_scenery_modified(); if (bbox bb; _bbox_for_scenery(*e, bb)) _add_bbox(bb); _entities.push_back(e); @@ -118,8 +116,11 @@ void chunk::add_entity_unsorted(const std::shared_ptr<entity>& e) void chunk::sort_entities() { + if (_entities_sorted) + return; + _entities_sorted = true; - mark_scenery_modified(false); + mark_scenery_modified(); std::sort(_entities.begin(), _entities.end(), [](const auto& a, const auto& b) { return a->ordinal() < b->ordinal(); @@ -129,8 +130,8 @@ void chunk::sort_entities() void chunk::add_entity(const std::shared_ptr<entity>& e) { fm_assert(_entities_sorted); - if (e->atlas->info().fps == 0) - mark_scenery_modified(false); + if (!e->is_dynamic()) + mark_scenery_modified(); if (bbox bb; _bbox_for_scenery(*e, bb)) _add_bbox(bb); @@ -147,7 +148,7 @@ void chunk::remove_entity(std::size_t i) fm_debug_assert(i < _entities.size()); const auto& e = _entities[i]; if (!e->is_dynamic()) - mark_scenery_modified(false); + mark_scenery_modified(); if (bbox bb; _bbox_for_scenery(*e, bb)) _remove_bbox(bb); diff --git a/src/chunk.hpp b/src/chunk.hpp index e51c55ac..d22ce7fe 100644 --- a/src/chunk.hpp +++ b/src/chunk.hpp @@ -59,7 +59,7 @@ struct chunk final void mark_ground_modified() noexcept; void mark_walls_modified() noexcept; - void mark_scenery_modified(bool collision_too = true) noexcept; + void mark_scenery_modified() noexcept; void mark_passability_modified() noexcept; void mark_modified() noexcept; diff --git a/src/entity.cpp b/src/entity.cpp index d06cf52a..efa4655f 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -91,6 +91,8 @@ void entity::rotate(std::size_t, rotation new_r) { fm_assert(atlas->check_rotation(new_r)); set_bbox(offset, rotate_point(bbox_offset, r, new_r), rotate_size(bbox_size, r, new_r), pass); + if (r != new_r && !is_dynamic()) + c->mark_scenery_modified(); const_cast<rotation&>(r) = new_r; } @@ -152,7 +154,7 @@ std::size_t entity::move(std::size_t i, Vector2i delta, rotation new_r) return i; if (!e.is_dynamic()) - c->mark_scenery_modified(false); + c->mark_scenery_modified(); chunk::bbox bb0, bb1; const auto bb_offset = rotate_point(bbox_offset, r, new_r); @@ -185,7 +187,7 @@ std::size_t entity::move(std::size_t i, Vector2i delta, rotation new_r) //fm_debug("change-chunk (%hd;%hd|%hhd;%hhd)", coord_.chunk().x, coord_.chunk().y, coord_.local().x, coord_.local().y); auto& c2 = w[coord_.chunk()]; if (!e.is_dynamic()) - c2.mark_scenery_modified(false); + c2.mark_scenery_modified(); c2._add_bbox(bb1); c->remove_entity(i); auto& es = c2._entities; @@ -225,6 +227,9 @@ entity::operator entity_proto() const void entity::set_bbox(Vector2b offset_, Vector2b bbox_offset_, Vector2ub bbox_size_, pass_mode pass) { + if (offset != offset_ && !is_dynamic()) + c->mark_scenery_modified(); + chunk::bbox bb0, bb; const bool b0 = c->_bbox_for_scenery(*this, bb0); set_bbox_(offset_, bbox_offset_, bbox_size_, pass); diff --git a/src/world.cpp b/src/world.cpp index f519a91f..d6099302 100644 --- a/src/world.cpp +++ b/src/world.cpp @@ -39,7 +39,8 @@ world::~world() noexcept for (auto& [k, v] : _chunks) { v._teardown = true; - v.mark_scenery_modified(true); + v.mark_scenery_modified(); + v.mark_passability_modified(); _last_chunk = {}; v._entities.clear(); } |