@@ -51,11 +51,14 @@ struct bg_t
5151 const layer& layer_instance;
5252 const tile_grid_base& grid;
5353
54+ tile_grid_base::tile_info oob_tile;
55+
5456 alignas (int ) bn::regular_bg_map_cell cells[ROWS * COLUMNS];
5557 bn::regular_bg_map_item map_item;
5658 bn::regular_bg_ptr bg_ptr;
5759 bn::regular_bg_map_ptr map_ptr;
5860 bool next_visible;
61+ bool force_reload;
5962 bool grid_bloated;
6063
6164 bg_t (const level& lv_, const layer& layer_, const bn::fixed_point& cam_applied_pos, const level_bgs_builder&);
@@ -156,18 +159,20 @@ bg_t::bg_t(const level& lv_, const layer& layer_, const bn::fixed_point& cam_app
156159 const level_bgs_builder& builder)
157160 : lv(lv_), layer_instance(layer_),
158161 grid (layer_.auto_layer_tiles() ? *layer_.auto_layer_tiles() : *layer_.grid_tiles()),
159- map_item(cells[0 ], bn::size(COLUMNS, ROWS)), bg_ptr(init_bg_ptr(layer_, cam_applied_pos, builder)),
160- map_ptr(bg_ptr.map()), next_visible(bg_ptr.visible()), grid_bloated(grid.bloated())
162+ oob_tile(builder.out_of_bound_tile_info(layer_.identifier())), map_item(cells[0 ], bn::size(COLUMNS, ROWS)),
163+ bg_ptr(init_bg_ptr(layer_, cam_applied_pos, builder)), map_ptr(bg_ptr.map()), next_visible(bg_ptr.visible()),
164+ force_reload(false ), grid_bloated(grid.bloated())
161165{
162166}
163167
164168void bg_t::update (const bn::fixed_point& next_cam_applied_pos, const bn::fixed_point& prev_cam_applied_pos)
165169{
166170 if (next_visible)
167171 {
168- if (!bg_ptr.visible ())
172+ if (force_reload || !bg_ptr.visible ())
169173 {
170174 update_all_cells (next_cam_applied_pos);
175+ force_reload = false ;
171176 }
172177 // Update cells when level position changed
173178 else if (next_cam_applied_pos != prev_cam_applied_pos)
@@ -300,9 +305,9 @@ void bg_t::reset_rows(const int level_8x8_first_y, const int level_8x8_last_y, c
300305
301306 if (mx < 0 || mx >= grid.c_width () || my < 0 || my >= grid.c_height ())
302307 {
303- m_tile_info.index = 0 ;
304- m_tile_info.x_flip = false ;
305- m_tile_info.y_flip = false ;
308+ m_tile_info.index = oob_tile. index ;
309+ m_tile_info.x_flip = oob_tile. x_flip ;
310+ m_tile_info.y_flip = oob_tile. y_flip ;
306311 }
307312 else
308313 {
@@ -380,9 +385,9 @@ void bg_t::reset_columns(const int level_8x8_first_y, const int level_8x8_last_y
380385
381386 if (mx < 0 || mx >= grid.c_width () || my < 0 || my >= grid.c_height ())
382387 {
383- m_tile_info.index = 0 ;
384- m_tile_info.x_flip = false ;
385- m_tile_info.y_flip = false ;
388+ m_tile_info.index = oob_tile. index ;
389+ m_tile_info.x_flip = oob_tile. x_flip ;
390+ m_tile_info.y_flip = oob_tile. y_flip ;
386391 }
387392 else
388393 {
@@ -872,4 +877,18 @@ void remove_camera(id_t id)
872877 lv->cam .reset ();
873878}
874879
880+ auto out_of_bound_tile_info (id_t id, gen::layer_ident layer_identifier) -> tile_grid_base::tile_info
881+ {
882+ auto lv = static_cast <const lv_t *>(id);
883+ return lv->get_bg (layer_identifier).oob_tile ;
884+ }
885+
886+ void set_out_of_bound_tile_info (id_t id, tile_grid_base::tile_info oob_tile_info, gen::layer_ident layer_identifier)
887+ {
888+ auto lv = static_cast <lv_t *>(id);
889+ auto & bg = lv->get_bg (layer_identifier);
890+ bg.oob_tile = oob_tile_info;
891+ bg.force_reload = true ;
892+ }
893+
875894} // namespace ldtk::level_bgs_manager
0 commit comments