Skip to content

Commit c06a01f

Browse files
committed
Use observers and ExtractComponentPlugin for removal
1 parent 962e690 commit c06a01f

File tree

3 files changed

+34
-73
lines changed

3 files changed

+34
-73
lines changed

src/render/extract.rs

Lines changed: 2 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use bevy::math::Affine3A;
22
use bevy::render::primitives::{Aabb, Frustum};
33
use bevy::render::render_resource::FilterMode;
44
use bevy::render::render_resource::TextureFormat;
5-
use bevy::render::sync_world::{RenderEntity, TemporaryRenderEntity};
5+
use bevy::render::sync_world::RenderEntity;
66
use bevy::{prelude::*, render::Extract, utils::HashMap};
77

88
use crate::prelude::TilemapGridSize;
@@ -19,8 +19,7 @@ use crate::{
1919
FrustumCulling,
2020
};
2121

22-
use super::RemovedMapEntity;
23-
use super::{chunk::PackedTileData, RemovedTileEntity};
22+
use super::chunk::PackedTileData;
2423

2524
#[derive(Component)]
2625
pub struct ExtractedTile {
@@ -36,28 +35,6 @@ pub struct ExtractedTileBundle {
3635
tile: ExtractedTile,
3736
}
3837

39-
#[derive(Component)]
40-
pub struct ExtractedRemovedTile {
41-
pub entity: Entity,
42-
}
43-
44-
#[derive(Bundle)]
45-
pub struct ExtractedRemovedTileBundle {
46-
tile: ExtractedRemovedTile,
47-
temp: TemporaryRenderEntity,
48-
}
49-
50-
#[derive(Component)]
51-
pub struct ExtractedRemovedMap {
52-
pub entity: Entity,
53-
}
54-
55-
#[derive(Bundle)]
56-
pub struct ExtractedRemovedMapBundle {
57-
map: ExtractedRemovedMap,
58-
temp: TemporaryRenderEntity,
59-
}
60-
6138
#[derive(Bundle)]
6239
pub struct ExtractedTilemapBundle {
6340
transform: GlobalTransform,
@@ -383,29 +360,3 @@ pub fn extract(
383360
commands.insert_or_spawn_batch(extracted_tilemap_textures);
384361
commands.insert_resource(SecondsSinceStartup(time.elapsed_secs_f64() as f32));
385362
}
386-
387-
pub fn extract_removal(
388-
mut commands: Commands,
389-
removed_tiles_query: Extract<Query<&RemovedTileEntity>>,
390-
removed_maps_query: Extract<Query<&RemovedMapEntity>>,
391-
) {
392-
let mut removed_tiles: Vec<ExtractedRemovedTileBundle> = Vec::new();
393-
for removed in removed_tiles_query.iter() {
394-
removed_tiles.push(ExtractedRemovedTileBundle {
395-
tile: ExtractedRemovedTile { entity: removed.0 },
396-
temp: TemporaryRenderEntity,
397-
});
398-
}
399-
400-
commands.spawn_batch(removed_tiles);
401-
402-
let mut removed_maps: Vec<ExtractedRemovedMapBundle> = Vec::new();
403-
for removed in removed_maps_query.iter() {
404-
removed_maps.push(ExtractedRemovedMapBundle {
405-
map: ExtractedRemovedMap { entity: removed.0 },
406-
temp: TemporaryRenderEntity,
407-
});
408-
}
409-
410-
commands.spawn_batch(removed_maps);
411-
}

src/render/mod.rs

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@ use bevy::{
66
image::ImageSamplerDescriptor,
77
prelude::*,
88
render::{
9+
extract_component::{ExtractComponent, ExtractComponentPlugin},
910
extract_resource::{extract_resource, ExtractResource},
1011
mesh::MeshVertexAttribute,
1112
render_phase::AddRenderCommand,
1213
render_resource::{FilterMode, SpecializedRenderPipelines, VertexFormat},
14+
sync_world::RenderEntity,
1315
view::{check_visibility, VisibilitySystems},
1416
Render, RenderApp, RenderSet,
1517
},
@@ -114,7 +116,12 @@ impl Plugin for TilemapRenderingPlugin {
114116
app.add_systems(Update, set_texture_to_copy_src);
115117

116118
app.add_systems(First, clear_removed.in_set(TilemapFirstSet));
117-
app.add_systems(PostUpdate, (removal_helper, removal_helper_tilemap));
119+
120+
app.add_observer(on_remove_tile);
121+
app.add_observer(on_remove_tilemap);
122+
123+
app.add_plugins(ExtractComponentPlugin::<RemovedTileEntity>::default());
124+
app.add_plugins(ExtractComponentPlugin::<RemovedMapEntity>::default());
118125

119126
app.add_plugins(MaterialTilemapPlugin::<StandardTilemapMaterial>::default());
120127

@@ -246,11 +253,7 @@ impl Plugin for TilemapRenderingPlugin {
246253
.insert_resource(SecondsSinceStartup(0.0))
247254
.add_systems(
248255
ExtractSchedule,
249-
(
250-
extract::extract,
251-
extract::extract_removal,
252-
extract_resource::<ModifiedImageIds>,
253-
),
256+
(extract::extract, extract_resource::<ModifiedImageIds>),
254257
)
255258
.add_systems(
256259
Render,
@@ -303,24 +306,30 @@ pub const ATTRIBUTE_TEXTURE: MeshVertexAttribute =
303306
pub const ATTRIBUTE_COLOR: MeshVertexAttribute =
304307
MeshVertexAttribute::new("Color", 231497124, VertexFormat::Float32x4);
305308

306-
#[derive(Component)]
307-
pub struct RemovedTileEntity(pub Entity);
309+
#[derive(Component, ExtractComponent, Clone)]
308310

309-
#[derive(Component)]
310-
pub struct RemovedMapEntity(pub Entity);
311+
pub struct RemovedTileEntity(pub RenderEntity);
311312

312-
fn removal_helper(mut commands: Commands, mut removed_query: RemovedComponents<TilePos>) {
313-
for entity in removed_query.read() {
314-
commands.spawn(RemovedTileEntity(entity));
313+
#[derive(Component, ExtractComponent, Clone)]
314+
pub struct RemovedMapEntity(pub RenderEntity);
315+
316+
fn on_remove_tile(
317+
trigger: Trigger<OnRemove, TilePos>,
318+
mut commands: Commands,
319+
query: Query<&RenderEntity>,
320+
) {
321+
if let Ok(render_entity) = query.get(trigger.entity()) {
322+
commands.spawn(RemovedTileEntity(*render_entity));
315323
}
316324
}
317325

318-
fn removal_helper_tilemap(
326+
fn on_remove_tilemap(
327+
trigger: Trigger<OnRemove, TileStorage>,
319328
mut commands: Commands,
320-
mut removed_query: RemovedComponents<TileStorage>,
329+
query: Query<&RenderEntity>,
321330
) {
322-
for entity in removed_query.read() {
323-
commands.spawn(RemovedMapEntity(entity));
331+
if let Ok(render_entity) = query.get(trigger.entity()) {
332+
commands.spawn(RemovedMapEntity(*render_entity));
324333
}
325334
}
326335

src/render/prepare.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,10 @@ use bevy::{
2323

2424
use super::{
2525
chunk::{ChunkId, PackedTileData, RenderChunk2dStorage, TilemapUniformData},
26-
extract::{ExtractedRemovedMap, ExtractedRemovedTile, ExtractedTile, ExtractedTilemapTexture},
26+
extract::{ExtractedTile, ExtractedTilemapTexture},
2727
DynamicUniformIndex,
2828
};
29+
use super::{RemovedMapEntity, RemovedTileEntity};
2930

3031
#[derive(Resource, Default)]
3132
pub struct MeshUniformResource(pub DynamicUniformBuffer<MeshUniform>);
@@ -220,14 +221,14 @@ pub(crate) fn prepare(
220221

221222
pub fn prepare_removal(
222223
mut chunk_storage: ResMut<RenderChunk2dStorage>,
223-
removed_tiles: Query<&ExtractedRemovedTile>,
224-
removed_maps: Query<&ExtractedRemovedMap>,
224+
removed_tiles: Query<&RemovedTileEntity>,
225+
removed_maps: Query<&RemovedMapEntity>,
225226
) {
226227
for removed_tile in removed_tiles.iter() {
227-
chunk_storage.remove_tile_with_entity(removed_tile.entity)
228+
chunk_storage.remove_tile_with_entity(removed_tile.0.id())
228229
}
229230

230231
for removed_map in removed_maps.iter() {
231-
chunk_storage.remove_map(removed_map.entity);
232+
chunk_storage.remove_map(removed_map.0.id());
232233
}
233234
}

0 commit comments

Comments
 (0)