Use Entity::PLACHOLDER
for dangling entities
#9199
Closed
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Objective
Prior to this (#7335), when mapping the scene, we used an
EntityMapper
that usedWorld
to establish a new mapping to a dead entity when the entity is not in theEntityMap
.But this means that entity mapping require mutable
World
access. And it may be not desirable for networking if you map entities often.Solution
So in this PR I tried a simpler approach: just mark all invalid entities with
Entity::PLACHOLDER
because this entity is always considered invalid.The only downside of it is that all dangling entities will correspond to the same entity instead of different entities, but I doubt that anyone want to do anything with these entities. This approach makes the code much simpler, avoids extra
Vec
allocation and allows mapping entities without mutableWorld
access.I also considered returning error instead, but this may not be desirable for scene filtering (hierarchy could contain dangling entities).
Changelog
Changed
Invalid entities on mapping now always point to
Entity::PLACEHOLDER
.Migration Guide
MapEntities
implementations should change from a &mut EntityMapper parameter to a &EntityMap parameter and returnResult
. Finally, they should switch from callingEntityMapper::get_or_reserve
to callingEntityMap::get_or_placeholder
.