From cf91671b1a0c688c0a1d1ce47e4c465ce255d871 Mon Sep 17 00:00:00 2001 From: Rob Parrett Date: Thu, 21 Nov 2024 07:13:42 -0700 Subject: [PATCH 01/12] WIP: mouse_to_tile compiles --- examples/mouse_to_tile.rs | 60 ++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 36 deletions(-) diff --git a/examples/mouse_to_tile.rs b/examples/mouse_to_tile.rs index 031d3354..a4f4c8b6 100644 --- a/examples/mouse_to_tile.rs +++ b/examples/mouse_to_tile.rs @@ -117,12 +117,6 @@ fn spawn_tile_labels( tile_q: Query<&mut TilePos>, font_handle: Res, ) { - let text_style = TextStyle { - font: font_handle.clone(), - font_size: 20.0, - color: Color::BLACK, - }; - let text_justify = JustifyText::Center; for (map_transform, map_type, grid_size, tilemap_storage) in tilemap_q.iter() { for tile_entity in tilemap_storage.iter().flatten() { let tile_pos = tile_q.get(*tile_entity).unwrap(); @@ -130,15 +124,17 @@ fn spawn_tile_labels( let transform = *map_transform * Transform::from_translation(tile_center); let label_entity = commands - .spawn(Text2dBundle { - text: Text::from_section( - format!("{}, {}", tile_pos.x, tile_pos.y), - text_style.clone(), - ) - .with_justify(text_justify), + .spawn(( + Text2d::new(format!("{}, {}", tile_pos.x, tile_pos.y)), + TextFont { + font: font_handle.clone(), + font_size: 20.0, + ..default() + }, + TextColor(Color::BLACK), + TextLayout::new_with_justify(JustifyText::Center), transform, - ..default() - }) + )) .id(); commands .entity(*tile_entity) @@ -157,13 +153,6 @@ fn spawn_map_type_label( windows: Query<&Window>, map_type_q: Query<&TilemapType>, ) { - let text_style = TextStyle { - font: font_handle.clone(), - font_size: 20.0, - color: Color::BLACK, - }; - let text_alignment = JustifyText::Center; - for window in windows.iter() { for map_type in map_type_q.iter() { // Place the map type label somewhere in the top left side of the screen @@ -173,12 +162,15 @@ fn spawn_map_type_label( ..Default::default() }; commands.spawn(( - Text2dBundle { - text: Text::from_section(format!("{map_type:?}"), text_style.clone()) - .with_justify(text_alignment), - transform, + Text2d::new(format!("{map_type:?}")), + TextFont { + font: font_handle.clone(), + font_size: 20.0, ..default() }, + TextColor(Color::BLACK), + TextLayout::new_with_justify(JustifyText::Center), + transform, MapTypeLabel, )); } @@ -201,7 +193,7 @@ fn swap_map_type( (&TileLabel, &TilePos), (With, Without, Without), >, - mut map_type_label_q: Query<&mut Text, With>, + mut map_type_label_q: Query<&mut Text2d, With>, mut transform_q: Query<&mut Transform, Without>, tile_handle_square: Res, tile_handle_hex_row: Res, @@ -274,7 +266,7 @@ fn swap_map_type( } for mut label_text in map_type_label_q.iter_mut() { - label_text.sections[0].value = format!("{:?}", map_type.as_ref()); + label_text.0 = format!("{:?}", map_type.as_ref()); } } } @@ -324,15 +316,13 @@ fn highlight_tile_labels( )>, highlighted_tiles_q: Query>, tile_label_q: Query<&TileLabel>, - mut text_q: Query<&mut Text>, + mut text_q: Query<&mut TextColor>, ) { // Un-highlight any previously highlighted tile labels. for highlighted_tile_entity in highlighted_tiles_q.iter() { if let Ok(label) = tile_label_q.get(highlighted_tile_entity) { - if let Ok(mut tile_text) = text_q.get_mut(label.0) { - for section in tile_text.sections.iter_mut() { - section.style.color = Color::BLACK; - } + if let Ok(mut text_color) = text_q.get_mut(label.0) { + text_color.0 = Color::BLACK; commands .entity(highlighted_tile_entity) .remove::(); @@ -358,10 +348,8 @@ fn highlight_tile_labels( // Highlight the relevant tile's label if let Some(tile_entity) = tile_storage.get(&tile_pos) { if let Ok(label) = tile_label_q.get(tile_entity) { - if let Ok(mut tile_text) = text_q.get_mut(label.0) { - for section in tile_text.sections.iter_mut() { - section.style.color = palettes::tailwind::RED_600.into(); - } + if let Ok(mut text_color) = text_q.get_mut(label.0) { + text_color.0 = palettes::tailwind::RED_600.into(); commands.entity(tile_entity).insert(HighlightedLabel); } } From 1dab1533f4e79858ac891f0a101cf11e439dfb97 Mon Sep 17 00:00:00 2001 From: Rob Parrett Date: Thu, 21 Nov 2024 07:14:48 -0700 Subject: [PATCH 02/12] Fix Camera2dBundle deprecation --- examples/3d_iso.rs | 2 +- examples/accessing_tiles.rs | 2 +- examples/animation.rs | 2 +- examples/basic.rs | 2 +- examples/bench.rs | 2 +- examples/chunking.rs | 2 +- examples/colors.rs | 2 +- examples/custom_shader.rs | 2 +- examples/frustum_cull_test.rs | 2 +- examples/game_of_life.rs | 2 +- examples/hex_neighbors.rs | 2 +- examples/hex_neighbors_radius_chunks.rs | 2 +- examples/hexagon_column.rs | 2 +- examples/hexagon_generation.rs | 2 +- examples/hexagon_row.rs | 2 +- examples/iso_diamond.rs | 2 +- examples/iso_staggered.rs | 2 +- examples/layers.rs | 2 +- examples/ldtk.rs | 2 +- examples/mouse_to_tile.rs | 2 +- examples/move_tile.rs | 2 +- examples/random_map.rs | 2 +- examples/remove_tiles.rs | 2 +- examples/spacing.rs | 2 +- examples/texture_container.rs | 2 +- examples/texture_vec.rs | 2 +- examples/tiled.rs | 2 +- examples/tiled_rotated.rs | 2 +- examples/visibility.rs | 2 +- 29 files changed, 29 insertions(+), 29 deletions(-) diff --git a/examples/3d_iso.rs b/examples/3d_iso.rs index d13bc3d4..cdf0301d 100644 --- a/examples/3d_iso.rs +++ b/examples/3d_iso.rs @@ -4,7 +4,7 @@ use bevy_ecs_tilemap::prelude::*; mod helpers; fn startup(mut commands: Commands, asset_server: Res) { - commands.spawn(Camera2dBundle::default()); + commands.spawn(Camera2d); let map_handle = helpers::tiled::TiledMapHandle(asset_server.load("iso_map.tmx")); diff --git a/examples/accessing_tiles.rs b/examples/accessing_tiles.rs index 261e4d7a..a44acf5e 100644 --- a/examples/accessing_tiles.rs +++ b/examples/accessing_tiles.rs @@ -11,7 +11,7 @@ struct CurrentColor(u16); struct LastUpdate(f64); fn startup(mut commands: Commands, asset_server: Res) { - commands.spawn(Camera2dBundle::default()); + commands.spawn(Camera2d); let texture_handle: Handle = asset_server.load("tiles.png"); diff --git a/examples/animation.rs b/examples/animation.rs index 59ff5c20..59765714 100644 --- a/examples/animation.rs +++ b/examples/animation.rs @@ -123,7 +123,7 @@ fn create_animated_flowers(mut commands: Commands, asset_server: Res, ) { - commands.spawn(Camera2dBundle::default()); + commands.spawn(Camera2d); let texture_handle: Handle = asset_server.load("tiles.png"); diff --git a/examples/bench.rs b/examples/bench.rs index 3b3f9ffe..f7b6dd53 100644 --- a/examples/bench.rs +++ b/examples/bench.rs @@ -7,7 +7,7 @@ use bevy_ecs_tilemap::prelude::*; mod helpers; fn startup(mut commands: Commands, asset_server: Res) { - commands.spawn(Camera2dBundle::default()); + commands.spawn(Camera2d); let texture_handle: Handle = asset_server.load("tiles.png"); diff --git a/examples/chunking.rs b/examples/chunking.rs index c289ffc6..56ac4c2e 100644 --- a/examples/chunking.rs +++ b/examples/chunking.rs @@ -54,7 +54,7 @@ fn spawn_chunk(commands: &mut Commands, asset_server: &AssetServer, chunk_pos: I } fn startup(mut commands: Commands) { - commands.spawn(Camera2dBundle::default()); + commands.spawn(Camera2d); } fn camera_pos_to_chunk_pos(camera_pos: &Vec2) -> IVec2 { diff --git a/examples/colors.rs b/examples/colors.rs index 6b33e878..14a94dfe 100644 --- a/examples/colors.rs +++ b/examples/colors.rs @@ -7,7 +7,7 @@ mod helpers; const QUADRANT_SIDE_LENGTH: u32 = 64; fn startup(mut commands: Commands, asset_server: Res) { - commands.spawn(Camera2dBundle::default()); + commands.spawn(Camera2d); let texture_handle: Handle = asset_server.load("tiles.png"); diff --git a/examples/custom_shader.rs b/examples/custom_shader.rs index cd8c4d42..1e5ff477 100644 --- a/examples/custom_shader.rs +++ b/examples/custom_shader.rs @@ -22,7 +22,7 @@ fn startup( asset_server: Res, mut materials: ResMut>, ) { - commands.spawn(Camera2dBundle::default()); + commands.spawn(Camera2d); let my_material_handle = MaterialTilemapHandle::from(materials.add(MyMaterial { brightness: 0.5, diff --git a/examples/frustum_cull_test.rs b/examples/frustum_cull_test.rs index 19f0640a..83354ed5 100644 --- a/examples/frustum_cull_test.rs +++ b/examples/frustum_cull_test.rs @@ -75,7 +75,7 @@ impl FromWorld for FontHandle { // Generates the initial tilemap, which is a square grid. fn spawn_tilemap(mut commands: Commands, tile_handle_square: Res) { - commands.spawn(Camera2dBundle::default()); + commands.spawn(Camera2d); let map_size = TilemapSize { // Render chunks are of size 64, so let's create two render chunks diff --git a/examples/game_of_life.rs b/examples/game_of_life.rs index f1e5c978..65415b1a 100644 --- a/examples/game_of_life.rs +++ b/examples/game_of_life.rs @@ -5,7 +5,7 @@ use bevy_ecs_tilemap::prelude::*; mod helpers; fn startup(mut commands: Commands, asset_server: Res) { - commands.spawn(Camera2dBundle::default()); + commands.spawn(Camera2d); let texture_handle: Handle = asset_server.load("tiles.png"); diff --git a/examples/hex_neighbors.rs b/examples/hex_neighbors.rs index b2d96e4a..e56c0471 100644 --- a/examples/hex_neighbors.rs +++ b/examples/hex_neighbors.rs @@ -48,7 +48,7 @@ impl FromWorld for FontHandle { // Generates the initial tilemap, which is a hex grid. fn spawn_tilemap(mut commands: Commands, tile_handle_hex_row: Res) { - commands.spawn(Camera2dBundle::default()); + commands.spawn(Camera2d); let map_size = TilemapSize { x: MAP_SIDE_LENGTH_X, diff --git a/examples/hex_neighbors_radius_chunks.rs b/examples/hex_neighbors_radius_chunks.rs index 4169a87b..2f64f3a2 100644 --- a/examples/hex_neighbors_radius_chunks.rs +++ b/examples/hex_neighbors_radius_chunks.rs @@ -188,7 +188,7 @@ fn hex_neighbors_radius_from_tile_pos( } fn spawn_chunks(mut commands: Commands, tile_handle_hex_row: Res) { - commands.spawn(Camera2dBundle::default()); + commands.spawn(Camera2d); let map_size = TilemapSize { x: CHUNK_MAP_SIDE_LENGTH_X, diff --git a/examples/hexagon_column.rs b/examples/hexagon_column.rs index 597f83e2..2740e0f3 100644 --- a/examples/hexagon_column.rs +++ b/examples/hexagon_column.rs @@ -7,7 +7,7 @@ mod helpers; const QUADRANT_SIDE_LENGTH: u32 = 80; fn startup(mut commands: Commands, asset_server: Res) { - commands.spawn(Camera2dBundle::default()); + commands.spawn(Camera2d); let texture_handle: Handle = asset_server.load("flat_hex_tiles.png"); diff --git a/examples/hexagon_generation.rs b/examples/hexagon_generation.rs index 027d9981..15d20b1e 100644 --- a/examples/hexagon_generation.rs +++ b/examples/hexagon_generation.rs @@ -46,7 +46,7 @@ impl FromWorld for FontHandle { // Generates the initial tilemap, which is a square grid. fn spawn_tilemap(mut commands: Commands, tile_handle_hex_row: Res) { - commands.spawn(Camera2dBundle::default()); + commands.spawn(Camera2d); let map_size = TilemapSize { x: MAP_SIDE_LENGTH, diff --git a/examples/hexagon_row.rs b/examples/hexagon_row.rs index e99cd66e..2e34121d 100644 --- a/examples/hexagon_row.rs +++ b/examples/hexagon_row.rs @@ -6,7 +6,7 @@ mod helpers; const QUADRANT_SIDE_LENGTH: u32 = 80; fn startup(mut commands: Commands, asset_server: Res) { - commands.spawn(Camera2dBundle::default()); + commands.spawn(Camera2d); let texture_handle: Handle = asset_server.load("pointy_hex_tiles.png"); diff --git a/examples/iso_diamond.rs b/examples/iso_diamond.rs index 89ebc966..81fc9be9 100644 --- a/examples/iso_diamond.rs +++ b/examples/iso_diamond.rs @@ -8,7 +8,7 @@ mod helpers; const QUADRANT_SIDE_LENGTH: u32 = 80; fn startup(mut commands: Commands, asset_server: Res) { - commands.spawn(Camera2dBundle::default()); + commands.spawn(Camera2d); let texture_handle: Handle = asset_server.load("iso_color.png"); diff --git a/examples/iso_staggered.rs b/examples/iso_staggered.rs index 3070d852..6d0baedf 100644 --- a/examples/iso_staggered.rs +++ b/examples/iso_staggered.rs @@ -10,7 +10,7 @@ mod helpers; const QUADRANT_SIDE_LENGTH: u32 = 80; fn startup(mut commands: Commands, asset_server: Res) { - commands.spawn(Camera2dBundle::default()); + commands.spawn(Camera2d); let texture_handle: Handle = asset_server.load("iso_color.png"); diff --git a/examples/layers.rs b/examples/layers.rs index 85e488b7..fca24438 100644 --- a/examples/layers.rs +++ b/examples/layers.rs @@ -3,7 +3,7 @@ use bevy_ecs_tilemap::prelude::*; mod helpers; fn startup(mut commands: Commands, asset_server: Res) { - commands.spawn(Camera2dBundle::default()); + commands.spawn(Camera2d); let texture_handle: Handle = asset_server.load("tiles.png"); diff --git a/examples/ldtk.rs b/examples/ldtk.rs index d61b9129..2b0e56ff 100644 --- a/examples/ldtk.rs +++ b/examples/ldtk.rs @@ -14,7 +14,7 @@ use bevy_ecs_tilemap::*; mod helpers; fn startup(mut commands: Commands, asset_server: Res) { - commands.spawn(Camera2dBundle::default()); + commands.spawn(Camera2d); let handle = helpers::ldtk::LdtkMapHandle(asset_server.load("map.ldtk")); diff --git a/examples/mouse_to_tile.rs b/examples/mouse_to_tile.rs index a4f4c8b6..f79f88ac 100644 --- a/examples/mouse_to_tile.rs +++ b/examples/mouse_to_tile.rs @@ -72,7 +72,7 @@ impl FromWorld for FontHandle { // Generates the initial tilemap, which is a square grid. fn spawn_tilemap(mut commands: Commands, tile_handle_square: Res) { - commands.spawn(Camera2dBundle::default()); + commands.spawn(Camera2d); let map_size = TilemapSize { x: MAP_SIDE_LENGTH_X, diff --git a/examples/move_tile.rs b/examples/move_tile.rs index d88e2933..436d6988 100644 --- a/examples/move_tile.rs +++ b/examples/move_tile.rs @@ -3,7 +3,7 @@ use bevy_ecs_tilemap::prelude::*; mod helpers; fn startup(mut commands: Commands, asset_server: Res) { - commands.spawn(Camera2dBundle::default()); + commands.spawn(Camera2d); let texture_handle: Handle = asset_server.load("tiles.png"); diff --git a/examples/random_map.rs b/examples/random_map.rs index 49cadc2f..592311ef 100644 --- a/examples/random_map.rs +++ b/examples/random_map.rs @@ -8,7 +8,7 @@ use rand::{thread_rng, Rng}; mod helpers; fn startup(mut commands: Commands, asset_server: Res) { - commands.spawn(Camera2dBundle::default()); + commands.spawn(Camera2d); let texture_handle: Handle = asset_server.load("tiles.png"); diff --git a/examples/remove_tiles.rs b/examples/remove_tiles.rs index b7d0e930..bfa7e752 100644 --- a/examples/remove_tiles.rs +++ b/examples/remove_tiles.rs @@ -5,7 +5,7 @@ use rand::{thread_rng, Rng}; mod helpers; fn startup(mut commands: Commands, asset_server: Res) { - commands.spawn(Camera2dBundle::default()); + commands.spawn(Camera2d); let texture_handle: Handle = asset_server.load("tiles.png"); diff --git a/examples/spacing.rs b/examples/spacing.rs index 05929a5d..80f3dc47 100644 --- a/examples/spacing.rs +++ b/examples/spacing.rs @@ -3,7 +3,7 @@ use bevy_ecs_tilemap::prelude::*; mod helpers; fn startup(mut commands: Commands, asset_server: Res) { - commands.spawn(Camera2dBundle::default()); + commands.spawn(Camera2d); let texture_handle: Handle = asset_server.load("tiles-spaced.png"); diff --git a/examples/texture_container.rs b/examples/texture_container.rs index f716c132..d6c0f54a 100644 --- a/examples/texture_container.rs +++ b/examples/texture_container.rs @@ -20,7 +20,7 @@ mod no_atlas { #[cfg(not(feature = "atlas"))] fn startup(mut commands: Commands, asset_server: Res) { - commands.spawn(Camera2dBundle::default()); + commands.spawn(Camera2d); // Most of the work is happening bevy side. In this case, using the `ktx2` feature. If this // feature is not turned on, that the image won't properly be interpreted as a texture diff --git a/examples/texture_vec.rs b/examples/texture_vec.rs index 84202f97..60d5ed82 100644 --- a/examples/texture_vec.rs +++ b/examples/texture_vec.rs @@ -19,7 +19,7 @@ mod no_atlas { const COORD_SYS: HexCoordSystem = HexCoordSystem::Row; fn startup(mut commands: Commands, asset_server: Res) { - commands.spawn(Camera2dBundle::default()); + commands.spawn(Camera2d); let image_handles = vec![ asset_server.load("hex-tile-0.png"), diff --git a/examples/tiled.rs b/examples/tiled.rs index 17ec9fd9..7574ea4c 100644 --- a/examples/tiled.rs +++ b/examples/tiled.rs @@ -4,7 +4,7 @@ use bevy_ecs_tilemap::prelude::*; mod helpers; fn startup(mut commands: Commands, asset_server: Res) { - commands.spawn(Camera2dBundle::default()); + commands.spawn(Camera2d); let map_handle = helpers::tiled::TiledMapHandle(asset_server.load("map.tmx")); diff --git a/examples/tiled_rotated.rs b/examples/tiled_rotated.rs index 4cd9319e..a1616cbe 100644 --- a/examples/tiled_rotated.rs +++ b/examples/tiled_rotated.rs @@ -4,7 +4,7 @@ use bevy_ecs_tilemap::prelude::*; mod helpers; fn startup(mut commands: Commands, asset_server: Res) { - commands.spawn(Camera2dBundle::default()); + commands.spawn(Camera2d); let map_handle = helpers::tiled::TiledMapHandle(asset_server.load("rotate.tmx")); diff --git a/examples/visibility.rs b/examples/visibility.rs index edf70fe5..c10a1cad 100644 --- a/examples/visibility.rs +++ b/examples/visibility.rs @@ -5,7 +5,7 @@ use rand::{thread_rng, Rng}; mod helpers; fn startup(mut commands: Commands, asset_server: Res) { - commands.spawn(Camera2dBundle::default()); + commands.spawn(Camera2d); let texture_handle: Handle = asset_server.load("tiles.png"); From d3398d37f9b87d95baf0ce4cdd464ff5b4eaab06 Mon Sep 17 00:00:00 2001 From: Rob Parrett Date: Thu, 21 Nov 2024 09:14:25 -0700 Subject: [PATCH 03/12] Fix tiles/maps not syncing outside of the `basic` example --- examples/basic.rs | 38 ++++++++++++++++---------------------- src/lib.rs | 3 +++ src/tiles/mod.rs | 4 +++- 3 files changed, 22 insertions(+), 23 deletions(-) diff --git a/examples/basic.rs b/examples/basic.rs index 1791ef43..575c839f 100644 --- a/examples/basic.rs +++ b/examples/basic.rs @@ -1,4 +1,4 @@ -use bevy::{prelude::*, render::sync_world::SyncToRenderWorld}; +use bevy::prelude::*; use bevy_ecs_tilemap::prelude::*; mod helpers; @@ -35,14 +35,11 @@ fn startup( for y in 0..map_size.y { let tile_pos = TilePos { x, y }; let tile_entity = commands - .spawn(( - TileBundle { - position: tile_pos, - tilemap_id: TilemapId(tilemap_entity), - ..Default::default() - }, - SyncToRenderWorld, - )) + .spawn(TileBundle { + position: tile_pos, + tilemap_id: TilemapId(tilemap_entity), + ..Default::default() + }) .id(); tile_storage.set(&tile_pos, tile_entity); } @@ -52,19 +49,16 @@ fn startup( let grid_size = tile_size.into(); let map_type = TilemapType::default(); - commands.entity(tilemap_entity).insert(( - TilemapBundle { - grid_size, - map_type, - size: map_size, - storage: tile_storage, - texture: TilemapTexture::Single(texture_handle), - tile_size, - transform: get_tilemap_center_transform(&map_size, &grid_size, &map_type, 0.0), - ..Default::default() - }, - SyncToRenderWorld, - )); + commands.entity(tilemap_entity).insert(TilemapBundle { + grid_size, + map_type, + size: map_size, + storage: tile_storage, + texture: TilemapTexture::Single(texture_handle), + tile_size, + transform: get_tilemap_center_transform(&map_size, &grid_size, &map_type, 0.0), + ..Default::default() + }); // Add atlas to array texture loader so it's preprocessed before we need to use it. // Only used when the atlas feature is off and we are using array textures. diff --git a/src/lib.rs b/src/lib.rs index 26c0d340..4db09e98 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -20,6 +20,7 @@ use bevy::{ IntoSystemConfigs, IntoSystemSetConfigs, Plugin, Query, Reflect, ReflectComponent, SystemSet, Transform, ViewVisibility, Visibility, }, + render::sync_world::SyncToRenderWorld, time::TimeSystem, }; @@ -132,6 +133,7 @@ pub struct MaterialTilemapBundle { /// User indication of whether tilemap should be frustum culled. pub frustum_culling: FrustumCulling, pub material: MaterialTilemapHandle, + pub sync: SyncToRenderWorld, } #[cfg(not(feature = "render"))] @@ -156,6 +158,7 @@ pub struct StandardTilemapBundle { pub view_visibility: ViewVisibility, /// User indication of whether tilemap should be frustum culled. pub frustum_culling: FrustumCulling, + pub sync: SyncToRenderWorld, } /// A module which exports commonly used dependencies. diff --git a/src/tiles/mod.rs b/src/tiles/mod.rs index 8721044e..0be2f7cd 100644 --- a/src/tiles/mod.rs +++ b/src/tiles/mod.rs @@ -3,6 +3,7 @@ mod storage; use bevy::{ math::{UVec2, Vec2}, prelude::{Bundle, Color, Component, Reflect, ReflectComponent}, + render::sync_world::SyncToRenderWorld, }; pub use storage::*; @@ -108,7 +109,7 @@ pub struct TileFlip { } /// This an optional tile bundle with default components. -#[derive(Bundle, Default, Clone, Copy, Debug)] +#[derive(Bundle, Default, Clone, Debug)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct TileBundle { pub position: TilePos, @@ -118,6 +119,7 @@ pub struct TileBundle { pub flip: TileFlip, pub color: TileColor, pub old_position: TilePosOld, + pub sync: SyncToRenderWorld, } #[derive(Component, Reflect, Default, Clone, Copy, Debug)] From 53bbc0e0a87d0324cc3c86163324f8842262cf07 Mon Sep 17 00:00:00 2001 From: Rob Parrett Date: Thu, 21 Nov 2024 14:32:18 -0700 Subject: [PATCH 04/12] WIP: don't use insert_or_spawn_batch for removals Removals still seem pretty broken --- src/render/extract.rs | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/src/render/extract.rs b/src/render/extract.rs index 919e6920..1c2501b1 100644 --- a/src/render/extract.rs +++ b/src/render/extract.rs @@ -2,7 +2,7 @@ use bevy::math::Affine3A; use bevy::render::primitives::{Aabb, Frustum}; use bevy::render::render_resource::FilterMode; use bevy::render::render_resource::TextureFormat; -use bevy::render::sync_world::RenderEntity; +use bevy::render::sync_world::{RenderEntity, TemporaryRenderEntity}; use bevy::{prelude::*, render::Extract, utils::HashMap}; use crate::prelude::TilemapGridSize; @@ -44,6 +44,7 @@ pub struct ExtractedRemovedTile { #[derive(Bundle)] pub struct ExtractedRemovedTileBundle { tile: ExtractedRemovedTile, + temp: TemporaryRenderEntity, } #[derive(Component)] @@ -54,6 +55,7 @@ pub struct ExtractedRemovedMap { #[derive(Bundle)] pub struct ExtractedRemovedMapBundle { map: ExtractedRemovedMap, + temp: TemporaryRenderEntity, } #[derive(Bundle)] @@ -384,30 +386,26 @@ pub fn extract( pub fn extract_removal( mut commands: Commands, - removed_tiles_query: Extract>, - removed_maps_query: Extract>, + removed_tiles_query: Extract>, + removed_maps_query: Extract>, ) { - let mut removed_tiles: Vec<(Entity, ExtractedRemovedTileBundle)> = Vec::new(); - for (entity, removed) in removed_tiles_query.iter() { - removed_tiles.push(( - entity, - ExtractedRemovedTileBundle { - tile: ExtractedRemovedTile { entity: removed.0 }, - }, - )); + let mut removed_tiles: Vec = Vec::new(); + for removed in removed_tiles_query.iter() { + removed_tiles.push(ExtractedRemovedTileBundle { + tile: ExtractedRemovedTile { entity: removed.0 }, + temp: TemporaryRenderEntity, + }); } - commands.insert_or_spawn_batch(removed_tiles); + commands.spawn_batch(removed_tiles); - let mut removed_maps: Vec<(Entity, ExtractedRemovedMapBundle)> = Vec::new(); - for (entity, removed) in removed_maps_query.iter() { - removed_maps.push(( - entity, - ExtractedRemovedMapBundle { - map: ExtractedRemovedMap { entity: removed.0 }, - }, - )); + let mut removed_maps: Vec = Vec::new(); + for removed in removed_maps_query.iter() { + removed_maps.push(ExtractedRemovedMapBundle { + map: ExtractedRemovedMap { entity: removed.0 }, + temp: TemporaryRenderEntity, + }); } - commands.insert_or_spawn_batch(removed_maps); + commands.spawn_batch(removed_maps); } From b32b0970449a329859f14cba0e7e84ff93dac8bd Mon Sep 17 00:00:00 2001 From: Adrien BON <63343541+adrien-bon@users.noreply.github.com> Date: Mon, 25 Nov 2024 20:56:05 +0000 Subject: [PATCH 05/12] fix: properly detect tilemap changes --- src/render/extract.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/render/extract.rs b/src/render/extract.rs index 1c2501b1..a79f758f 100644 --- a/src/render/extract.rs +++ b/src/render/extract.rs @@ -228,7 +228,7 @@ pub fn extract( >, changed_tilemap_query: Extract< Query< - &RenderEntity, + Entity, Or<( Added, Changed, @@ -325,7 +325,7 @@ pub fn extract( } for tilemap_entity in changed_tilemap_query.iter() { - if let Ok(data) = tilemap_query.get(tilemap_entity.id()) { + if let Ok(data) = tilemap_query.get(tilemap_entity) { extracted_tilemaps.insert( data.0.id(), ( From 47d86b1423c923badd5df8d5da3d1b9499b48236 Mon Sep 17 00:00:00 2001 From: Rob Parrett Date: Mon, 2 Dec 2024 18:45:18 -0700 Subject: [PATCH 06/12] Use Bevy 0.15 Co-authored-by: Adrien BON <63343541+adrien-bon@users.noreply.github.com> --- Cargo.toml | 8 +++++--- src/array_texture_preload.rs | 6 ++---- src/render/mod.rs | 2 +- src/render/pipeline.rs | 3 ++- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 58c65e49..a84fa468 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,7 +16,7 @@ render = [] serde = ["dep:serde"] [dependencies] -bevy = { version = "0.15.0-rc.3", default-features = false, features = [ +bevy = { version = "0.15", default-features = false, features = [ "bevy_core_pipeline", "bevy_render", "bevy_asset", @@ -34,7 +34,7 @@ tiled = { version = "0.11.0", default-features = false } thiserror = { version = "1.0" } [dev-dependencies.bevy] -version = "0.15.0-rc.3" +version = "0.15" default-features = false features = [ "bevy_core_pipeline", @@ -43,6 +43,7 @@ features = [ "png", "ktx2", "bevy_winit", + "bevy_window", "bevy_text", "bevy_sprite", #"file_watcher", @@ -51,7 +52,7 @@ features = [ ] [target.'cfg(unix)'.dev-dependencies.bevy] -version = "0.15.0-rc.3" +version = "0.15" default-features = false features = [ "bevy_core_pipeline", @@ -60,6 +61,7 @@ features = [ "png", "ktx2", "bevy_winit", + "bevy_window", "wayland", "x11", "bevy_text", diff --git a/src/array_texture_preload.rs b/src/array_texture_preload.rs index 9a894237..28746eff 100644 --- a/src/array_texture_preload.rs +++ b/src/array_texture_preload.rs @@ -3,11 +3,9 @@ use crate::{ prelude::{TilemapSpacing, TilemapTileSize}, TilemapTexture, }; -use bevy::render::{ - render_resource::{FilterMode, TextureFormat}, - texture::BevyDefault, -}; +use bevy::render::render_resource::{FilterMode, TextureFormat}; use bevy::{ + image::BevyDefault, prelude::{Assets, Image, Res, ResMut, Resource}, render::Extract, }; diff --git a/src/render/mod.rs b/src/render/mod.rs index 2f0c7a56..a6348baa 100644 --- a/src/render/mod.rs +++ b/src/render/mod.rs @@ -3,13 +3,13 @@ use std::marker::PhantomData; use bevy::{ asset::load_internal_asset, core_pipeline::core_2d::Transparent2d, + image::ImageSamplerDescriptor, prelude::*, render::{ extract_resource::{extract_resource, ExtractResource}, mesh::MeshVertexAttribute, render_phase::AddRenderCommand, render_resource::{FilterMode, SpecializedRenderPipelines, VertexFormat}, - texture::ImageSamplerDescriptor, view::{check_visibility, VisibilitySystems}, Render, RenderApp, RenderSet, }, diff --git a/src/render/pipeline.rs b/src/render/pipeline.rs index 57e8053a..3a926455 100644 --- a/src/render/pipeline.rs +++ b/src/render/pipeline.rs @@ -1,5 +1,6 @@ use bevy::{ core_pipeline::core_2d::CORE_2D_DEPTH_FORMAT, + image::BevyDefault, prelude::{Component, FromWorld, Handle, Resource, Shader, World}, render::{ globals::GlobalsUniform, @@ -14,7 +15,6 @@ use bevy::{ VertexStepMode, }, renderer::RenderDevice, - texture::BevyDefault, view::{ViewTarget, ViewUniform}, }, }; @@ -259,6 +259,7 @@ impl SpecializedRenderPipeline for TilemapPipeline { }, label: Some("tilemap_pipeline".into()), push_constant_ranges: vec![], + zero_initialize_workgroup_memory: false, } } } From 962e690947f820f04aec2aa7337b44e723c40267 Mon Sep 17 00:00:00 2001 From: Rob Parrett Date: Mon, 2 Dec 2024 19:25:48 -0700 Subject: [PATCH 07/12] Fix panic in 3d_iso example due to bevy issue 16525 --- src/render/draw.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/render/draw.rs b/src/render/draw.rs index 52ff8baf..27d47379 100644 --- a/src/render/draw.rs +++ b/src/render/draw.rs @@ -206,6 +206,10 @@ impl RenderCommand for DrawMesh { &chunk.vertex_buffer, &chunk.index_buffer, ) { + if render_mesh.vertex_count == 0 { + return RenderCommandResult::Skip; + } + pass.set_vertex_buffer(0, vertex_buffer.slice(..)); match &render_mesh.buffer_info { RenderMeshBufferInfo::Indexed { From c06a01f1314a9987b15f3f3fbe2367ddd4c86d0d Mon Sep 17 00:00:00 2001 From: Rob Parrett Date: Tue, 3 Dec 2024 07:16:22 -0700 Subject: [PATCH 08/12] Use observers and ExtractComponentPlugin for removal --- src/render/extract.rs | 53 ++----------------------------------------- src/render/mod.rs | 43 +++++++++++++++++++++-------------- src/render/prepare.rs | 11 +++++---- 3 files changed, 34 insertions(+), 73 deletions(-) diff --git a/src/render/extract.rs b/src/render/extract.rs index a79f758f..8d2b7b14 100644 --- a/src/render/extract.rs +++ b/src/render/extract.rs @@ -2,7 +2,7 @@ use bevy::math::Affine3A; use bevy::render::primitives::{Aabb, Frustum}; use bevy::render::render_resource::FilterMode; use bevy::render::render_resource::TextureFormat; -use bevy::render::sync_world::{RenderEntity, TemporaryRenderEntity}; +use bevy::render::sync_world::RenderEntity; use bevy::{prelude::*, render::Extract, utils::HashMap}; use crate::prelude::TilemapGridSize; @@ -19,8 +19,7 @@ use crate::{ FrustumCulling, }; -use super::RemovedMapEntity; -use super::{chunk::PackedTileData, RemovedTileEntity}; +use super::chunk::PackedTileData; #[derive(Component)] pub struct ExtractedTile { @@ -36,28 +35,6 @@ pub struct ExtractedTileBundle { tile: ExtractedTile, } -#[derive(Component)] -pub struct ExtractedRemovedTile { - pub entity: Entity, -} - -#[derive(Bundle)] -pub struct ExtractedRemovedTileBundle { - tile: ExtractedRemovedTile, - temp: TemporaryRenderEntity, -} - -#[derive(Component)] -pub struct ExtractedRemovedMap { - pub entity: Entity, -} - -#[derive(Bundle)] -pub struct ExtractedRemovedMapBundle { - map: ExtractedRemovedMap, - temp: TemporaryRenderEntity, -} - #[derive(Bundle)] pub struct ExtractedTilemapBundle { transform: GlobalTransform, @@ -383,29 +360,3 @@ pub fn extract( commands.insert_or_spawn_batch(extracted_tilemap_textures); commands.insert_resource(SecondsSinceStartup(time.elapsed_secs_f64() as f32)); } - -pub fn extract_removal( - mut commands: Commands, - removed_tiles_query: Extract>, - removed_maps_query: Extract>, -) { - let mut removed_tiles: Vec = Vec::new(); - for removed in removed_tiles_query.iter() { - removed_tiles.push(ExtractedRemovedTileBundle { - tile: ExtractedRemovedTile { entity: removed.0 }, - temp: TemporaryRenderEntity, - }); - } - - commands.spawn_batch(removed_tiles); - - let mut removed_maps: Vec = Vec::new(); - for removed in removed_maps_query.iter() { - removed_maps.push(ExtractedRemovedMapBundle { - map: ExtractedRemovedMap { entity: removed.0 }, - temp: TemporaryRenderEntity, - }); - } - - commands.spawn_batch(removed_maps); -} diff --git a/src/render/mod.rs b/src/render/mod.rs index a6348baa..5e1f75ab 100644 --- a/src/render/mod.rs +++ b/src/render/mod.rs @@ -6,10 +6,12 @@ use bevy::{ image::ImageSamplerDescriptor, prelude::*, render::{ + extract_component::{ExtractComponent, ExtractComponentPlugin}, extract_resource::{extract_resource, ExtractResource}, mesh::MeshVertexAttribute, render_phase::AddRenderCommand, render_resource::{FilterMode, SpecializedRenderPipelines, VertexFormat}, + sync_world::RenderEntity, view::{check_visibility, VisibilitySystems}, Render, RenderApp, RenderSet, }, @@ -114,7 +116,12 @@ impl Plugin for TilemapRenderingPlugin { app.add_systems(Update, set_texture_to_copy_src); app.add_systems(First, clear_removed.in_set(TilemapFirstSet)); - app.add_systems(PostUpdate, (removal_helper, removal_helper_tilemap)); + + app.add_observer(on_remove_tile); + app.add_observer(on_remove_tilemap); + + app.add_plugins(ExtractComponentPlugin::::default()); + app.add_plugins(ExtractComponentPlugin::::default()); app.add_plugins(MaterialTilemapPlugin::::default()); @@ -246,11 +253,7 @@ impl Plugin for TilemapRenderingPlugin { .insert_resource(SecondsSinceStartup(0.0)) .add_systems( ExtractSchedule, - ( - extract::extract, - extract::extract_removal, - extract_resource::, - ), + (extract::extract, extract_resource::), ) .add_systems( Render, @@ -303,24 +306,30 @@ pub const ATTRIBUTE_TEXTURE: MeshVertexAttribute = pub const ATTRIBUTE_COLOR: MeshVertexAttribute = MeshVertexAttribute::new("Color", 231497124, VertexFormat::Float32x4); -#[derive(Component)] -pub struct RemovedTileEntity(pub Entity); +#[derive(Component, ExtractComponent, Clone)] -#[derive(Component)] -pub struct RemovedMapEntity(pub Entity); +pub struct RemovedTileEntity(pub RenderEntity); -fn removal_helper(mut commands: Commands, mut removed_query: RemovedComponents) { - for entity in removed_query.read() { - commands.spawn(RemovedTileEntity(entity)); +#[derive(Component, ExtractComponent, Clone)] +pub struct RemovedMapEntity(pub RenderEntity); + +fn on_remove_tile( + trigger: Trigger, + mut commands: Commands, + query: Query<&RenderEntity>, +) { + if let Ok(render_entity) = query.get(trigger.entity()) { + commands.spawn(RemovedTileEntity(*render_entity)); } } -fn removal_helper_tilemap( +fn on_remove_tilemap( + trigger: Trigger, mut commands: Commands, - mut removed_query: RemovedComponents, + query: Query<&RenderEntity>, ) { - for entity in removed_query.read() { - commands.spawn(RemovedMapEntity(entity)); + if let Ok(render_entity) = query.get(trigger.entity()) { + commands.spawn(RemovedMapEntity(*render_entity)); } } diff --git a/src/render/prepare.rs b/src/render/prepare.rs index 6e53bb1d..9e9f62a9 100644 --- a/src/render/prepare.rs +++ b/src/render/prepare.rs @@ -23,9 +23,10 @@ use bevy::{ use super::{ chunk::{ChunkId, PackedTileData, RenderChunk2dStorage, TilemapUniformData}, - extract::{ExtractedRemovedMap, ExtractedRemovedTile, ExtractedTile, ExtractedTilemapTexture}, + extract::{ExtractedTile, ExtractedTilemapTexture}, DynamicUniformIndex, }; +use super::{RemovedMapEntity, RemovedTileEntity}; #[derive(Resource, Default)] pub struct MeshUniformResource(pub DynamicUniformBuffer); @@ -220,14 +221,14 @@ pub(crate) fn prepare( pub fn prepare_removal( mut chunk_storage: ResMut, - removed_tiles: Query<&ExtractedRemovedTile>, - removed_maps: Query<&ExtractedRemovedMap>, + removed_tiles: Query<&RemovedTileEntity>, + removed_maps: Query<&RemovedMapEntity>, ) { for removed_tile in removed_tiles.iter() { - chunk_storage.remove_tile_with_entity(removed_tile.entity) + chunk_storage.remove_tile_with_entity(removed_tile.0.id()) } for removed_map in removed_maps.iter() { - chunk_storage.remove_map(removed_map.entity); + chunk_storage.remove_map(removed_map.0.id()); } } From d5ab754a0b11da706e61c2a3088524d8f1e34f1a Mon Sep 17 00:00:00 2001 From: Rob Parrett Date: Tue, 3 Dec 2024 07:27:17 -0700 Subject: [PATCH 09/12] Workaround for Bevy issue 16563 Co-authored-by: Adrien BON <63343541+adrien-bon@users.noreply.github.com> --- Cargo.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index a84fa468..ffb0e7ff 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,6 +21,8 @@ bevy = { version = "0.15", default-features = false, features = [ "bevy_render", "bevy_asset", "bevy_sprite", + # See Bevy#16563 + "png", ] } log = "0.4" serde = { version = "1", features = ["derive"], optional = true } From 0d0d052b6a3cd0e43572dfba97fb3679b067e1a6 Mon Sep 17 00:00:00 2001 From: Adrien BON <63343541+adrien-bon@users.noreply.github.com> Date: Mon, 25 Nov 2024 20:40:39 +0000 Subject: [PATCH 10/12] fix: compilation with `serde` feature --- src/tiles/mod.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tiles/mod.rs b/src/tiles/mod.rs index 0be2f7cd..b67dcfbe 100644 --- a/src/tiles/mod.rs +++ b/src/tiles/mod.rs @@ -119,6 +119,7 @@ pub struct TileBundle { pub flip: TileFlip, pub color: TileColor, pub old_position: TilePosOld, + #[cfg_attr(feature = "serde", serde(skip))] pub sync: SyncToRenderWorld, } From 477d94f33d0c594640b0421a41e10583099a7fce Mon Sep 17 00:00:00 2001 From: Adrien BON <63343541+adrien-bon@users.noreply.github.com> Date: Mon, 25 Nov 2024 20:46:24 +0000 Subject: [PATCH 11/12] chore: fix unused var --- src/render/material.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/render/material.rs b/src/render/material.rs index cd330cff..4a089c1c 100644 --- a/src/render/material.rs +++ b/src/render/material.rs @@ -391,7 +391,7 @@ fn prepare_material_tilemap( pub fn queue_material_tilemap_meshes( chunk_storage: Res, transparent_2d_draw_functions: Res>, - render_device: Res, + _render_device: Res, (material_tilemap_pipeline, mut material_pipelines): ( Res>, ResMut>>, @@ -415,7 +415,7 @@ pub fn queue_material_tilemap_meshes( M::Data: PartialEq + Eq + Hash + Clone, { #[cfg(not(feature = "atlas"))] - texture_array_cache.queue(&render_device, &render_queue, &gpu_images); + texture_array_cache.queue(&_render_device, &render_queue, &gpu_images); if standard_tilemap_meshes.is_empty() { return; From af2b21f7003a6247acd2c54eb1bb3149a60671cc Mon Sep 17 00:00:00 2001 From: Adrien BON <63343541+adrien-bon@users.noreply.github.com> Date: Mon, 2 Dec 2024 19:52:58 +0000 Subject: [PATCH 12/12] update various dependencies --- Cargo.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index ffb0e7ff..6bf30e98 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,10 +30,10 @@ serde = { version = "1", features = ["derive"], optional = true } [dev-dependencies] ldtk_rust = { version = "0.6" } rand = "0.8" -env_logger = "0.10" +env_logger = "0.11" serde_json = { version = "1.0" } -tiled = { version = "0.11.0", default-features = false } -thiserror = { version = "1.0" } +tiled = { version = "0.13", default-features = false } +thiserror = { version = "2.0" } [dev-dependencies.bevy] version = "0.15"