FyroxEngine/Fyrox · warning
Tile set update page missing.
Error message
Tile set update page missing.
What it means
TileSet::swap applies a TileSetUpdate by iterating (handle, update) pairs; when the update references a page handle not present in the tile set, the library logs 'Tile set update page missing.' and skips that update entry. The update and tile set are then out of sync for those entries.
Solutions
- Validate that every handle.page() in the TileSetUpdate exists in tile_set.pages before calling swap.
- Rebuild the TileSetUpdate after any page insertion/removal so handles stay in sync.
- If a page may have been removed, create it in the tile set before swapping.
- Treat the logged skip as a signal: recompute the update rather than reusing stale ones.
Example fix
// before tile_set.swap(&mut update); // may reference removed pages // after update.retain(|handle, _| tile_set.pages.contains_key(&handle.page())); tile_set.swap(&mut update);
Defensive patterns
Strategy: validation
Validate before calling
for handle in update.handles() {
assert!(tile_set.pages.contains_key(&handle.page()), "update references missing page {:?}", handle.page());
} Prevention
- Invalidate cached TileSetUpdate handles when pages change.
- Rebuild updates right before calling swap; never persist them across edits.
- Guard undo/redo replay against the current tile set state.
When it happens
Trigger: Calling TileSet::swap with a TileSetUpdate containing TileSetUpdatePage handles whose page does not exist in the tile set (page removed before swap, or wrong handle keys).
Common situations: Editor code caching update handles across a page deletion; undo/redo stacks replaying updates against a modified tile set; concurrent edits removing pages between building the update and calling swap.
Understand the failure class
Background: "Not found" and "does not exist" errors: why "Task not found", "No such folder", and "Can't find" fire when a lookup comes back empty — this error's family across 14 libraries.
Related errors
- err.to_string()
- Failed to load brush tool data due to
- Tile set load failed! Reason
- Tile set load failed!
- Graphics context is uninitialized!
AI-assisted analysis of FyroxEngine/Fyrox@76c91aad8e (2026-09-10).
Data as JSON: /api/errors/f8dbc9ae19dc79c8.
Report an issue: GitHub.
Appendix: source
Thrown at fyrox-impl/src/scene/tilemap/tileset.rs:1627
/// Update the tile set using data stored in the given `TileSetUpdate`
/// and modify the `TileSetUpdate` to become the reverse of the changes by storing
/// the data that was removed from this TileSet.
///
/// [`rebuild_transform_sets`](Self::rebuild_transform_sets) is automatically called if a transform set page is
/// modified.
/// [`rebuild_animations`](Self::rebuild_animations) is automatically called if an animation page is
/// modified.
///
/// Wherever there is incompatibility between the tile set and the given update,
/// the tile set should gracefully ignore that part of the update, log the error,
/// and set the update to [`TileDataUpdate::DoNothing`], because that is the correct
/// reversal of nothing being done.
pub fn swap(&mut self, update: &mut TileSetUpdate) {
let mut transform_changes = false;
let mut animation_changes: bool = false;
for (handle, tile_update) in update.iter_mut() {
let Some(page) = self.pages.get_mut(&handle.page()) else {
Log::err("Tile set update page missing.");
continue;
};
if page.is_transform_set() {
transform_changes = true;
}
if page.is_animation() {
animation_changes = true;
}
page.swap_tile(handle.tile(), tile_update);
}
if transform_changes {
self.rebuild_transform_sets();
}
if animation_changes {
self.rebuild_animations();
}
}
/// Get the page at the given position.View on GitHub (pinned to 76c91aad8e)