Skip to content

Commit 8f5fb95

Browse files
committed
Moved render settings onto entity.
1 parent b08a5d9 commit 8f5fb95

File tree

8 files changed

+47
-49
lines changed

8 files changed

+47
-49
lines changed

examples/bench.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ fn startup(mut commands: Commands, asset_server: Res<AssetServer>) {
3939
});
4040
}
4141

42+
fn display_t_entities(query: Query<Entity, With<Transform>>) {
43+
dbg!(query.iter().count());
44+
}
45+
4246
fn main() {
4347
App::new()
4448
.add_plugins(
@@ -60,6 +64,6 @@ fn main() {
6064
.add_plugins(FrameTimeDiagnosticsPlugin)
6165
.add_plugins(TilemapPlugin)
6266
.add_systems(Startup, startup)
63-
.add_systems(Update, helpers::camera::movement)
67+
.add_systems(Update, (helpers::camera::movement, display_t_entities))
6468
.run();
6569
}

src/lib.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ use map::{
2626
TilemapGridSize, TilemapSize, TilemapSpacing, TilemapTexture, TilemapTextureSize,
2727
TilemapTileSize, TilemapType,
2828
};
29-
use prelude::TilemapId;
29+
use prelude::{TilemapId, TilemapRenderSettings};
3030
#[cfg(feature = "render")]
3131
use render::material::{MaterialTilemap, StandardTilemapMaterial};
3232
use tiles::{
@@ -114,6 +114,7 @@ pub struct MaterialTilemapBundle<M: MaterialTilemap> {
114114
pub tile_size: TilemapTileSize,
115115
pub transform: Transform,
116116
pub global_transform: GlobalTransform,
117+
pub render_settings: TilemapRenderSettings,
117118
/// User indication of whether an entity is visible
118119
pub visibility: Visibility,
119120
/// Algorithmically-computed indication of whether an entity is visible and should be extracted
@@ -138,6 +139,7 @@ pub struct StandardTilemapBundle {
138139
pub tile_size: TilemapTileSize,
139140
pub transform: Transform,
140141
pub global_transform: GlobalTransform,
142+
pub render_settings: TilemapRenderSettings,
141143
/// User indication of whether an entity is visible
142144
pub visibility: Visibility,
143145
/// Algorithmically-computed indication of whether an entity is visible and should be extracted

src/map/mod.rs

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use bevy::asset::Assets;
22
use bevy::ecs::entity::{EntityMapper, MapEntities};
33
use bevy::ecs::reflect::ReflectMapEntities;
4-
use bevy::prelude::{ReflectComponent, Res, ResMut, Resource};
4+
use bevy::prelude::{ReflectComponent, Res, ResMut};
55
use bevy::render::render_resource::TextureUsages;
66
use bevy::{
77
math::{UVec2, Vec2},
@@ -10,20 +10,8 @@ use bevy::{
1010

1111
/// Custom parameters for the render pipeline.
1212
///
13-
/// It must be added as a resource before [`TilemapPlugin`](crate::TilemapPlugin). For example:
14-
/// ```ignore
15-
/// App::new()
16-
/// .insert_resource(WindowDescriptor {
17-
/// width: 1270.0,
18-
/// height: 720.0,
19-
/// })
20-
/// .insert_resource(TilemapRenderSettings {
21-
/// render_chunk_size: UVec2::new(32, 32),
22-
/// })
23-
/// .add_plugin(TilemapPlugin)
24-
/// .run();
25-
/// ```
26-
#[derive(Resource, Debug, Default, Copy, Clone)]
13+
/// It must be added as a component to the tilemap entity.
14+
#[derive(Component, Debug, Default, Copy, Clone)]
2715
pub struct TilemapRenderSettings {
2816
/// Dimensions of a "chunk" in tiles. Chunks are grouping of tiles combined and rendered as a
2917
/// single mesh by the render pipeline.

src/render/chunk.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ use crate::{
2222
FrustumCulling, TilemapGridSize, TilemapTileSize,
2323
};
2424

25+
use super::RenderChunkSize;
26+
2527
#[derive(Resource, Default, Clone, Debug)]
2628
pub struct RenderChunk2dStorage {
2729
chunks: HashMap<u32, HashMap<UVec3, RenderChunk2d>>,
@@ -51,6 +53,8 @@ impl RenderChunk2dStorage {
5153
transform: GlobalTransform,
5254
visibility: &InheritedVisibility,
5355
frustum_culling: &FrustumCulling,
56+
render_size: RenderChunkSize,
57+
y_sort: bool,
5458
) -> &mut RenderChunk2d {
5559
let pos = position.xyz();
5660

@@ -86,6 +90,8 @@ impl RenderChunk2dStorage {
8690
transform,
8791
visibility.get(),
8892
**frustum_culling,
93+
render_size,
94+
y_sort,
8995
);
9096
self.entity_to_chunk.insert(chunk_entity, pos);
9197
chunk_storage.insert(pos, chunk);
@@ -208,6 +214,8 @@ pub struct RenderChunk2d {
208214
pub dirty_mesh: bool,
209215
pub visible: bool,
210216
pub frustum_culling: bool,
217+
pub render_size: RenderChunkSize,
218+
pub y_sort: bool,
211219
}
212220

213221
impl RenderChunk2d {
@@ -227,6 +235,8 @@ impl RenderChunk2d {
227235
global_transform: GlobalTransform,
228236
visible: bool,
229237
frustum_culling: bool,
238+
render_size: RenderChunkSize,
239+
y_sort: bool,
230240
) -> Self {
231241
let position = chunk_index_to_world_space(index.xy(), size_in_tiles, &grid_size, &map_type);
232242
let local_transform = Transform::from_translation(position.extend(0.0));
@@ -258,6 +268,8 @@ impl RenderChunk2d {
258268
tiles: vec![None; (size_in_tiles.x * size_in_tiles.y) as usize],
259269
visible,
260270
frustum_culling,
271+
render_size,
272+
y_sort,
261273
}
262274
}
263275

src/render/extract.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use bevy::render::render_resource::TextureFormat;
77
use bevy::{math::Vec4, prelude::*, render::Extract, utils::HashMap};
88

99
use crate::prelude::TilemapGridSize;
10+
use crate::prelude::TilemapRenderSettings;
1011
use crate::render::{DefaultSampler, SecondsSinceStartup};
1112
use crate::tiles::AnimatedTile;
1213
use crate::tiles::TilePosOld;
@@ -68,6 +69,7 @@ pub struct ExtractedTilemapBundle {
6869
map_size: TilemapSize,
6970
visibility: InheritedVisibility,
7071
frustum_culling: FrustumCulling,
72+
render_settings: TilemapRenderSettings,
7173
}
7274

7375
#[derive(Component)]
@@ -220,6 +222,7 @@ pub fn extract(
220222
&TilemapSize,
221223
&InheritedVisibility,
222224
&FrustumCulling,
225+
&TilemapRenderSettings,
223226
)>,
224227
>,
225228
changed_tilemap_query: Extract<
@@ -236,6 +239,7 @@ pub fn extract(
236239
Changed<TilemapSize>,
237240
Changed<InheritedVisibility>,
238241
Changed<FrustumCulling>,
242+
Changed<TilemapRenderSettings>,
239243
)>,
240244
>,
241245
>,
@@ -300,6 +304,7 @@ pub fn extract(
300304
map_size: *data.7,
301305
visibility: *data.8,
302306
frustum_culling: *data.9,
307+
render_settings: *data.10,
303308
},
304309
),
305310
);
@@ -335,6 +340,7 @@ pub fn extract(
335340
map_size: *data.7,
336341
visibility: *data.8,
337342
frustum_culling: *data.9,
343+
render_settings: *data.10,
338344
},
339345
),
340346
);
@@ -345,7 +351,7 @@ pub fn extract(
345351
extracted_tilemaps.drain().map(|kv| kv.1).collect();
346352

347353
// Extracts tilemap textures.
348-
for (entity, _, tile_size, tile_spacing, _, _, texture, _, _, _) in tilemap_query.iter() {
354+
for (entity, _, tile_size, tile_spacing, _, _, texture, _, _, _, _) in tilemap_query.iter() {
349355
if texture.verify_ready(&images) {
350356
extracted_tilemap_textures.push((
351357
entity,

src/render/material.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ use super::{
3131
draw::DrawTilemapMaterial,
3232
pipeline::{TilemapPipeline, TilemapPipelineKey},
3333
queue::{ImageBindGroups, TilemapViewBindGroup},
34-
RenderYSort,
3534
};
3635

3736
#[cfg(not(feature = "atlas"))]
@@ -362,7 +361,6 @@ fn prepare_material_tilemap<M: MaterialTilemap>(
362361

363362
#[allow(clippy::too_many_arguments)]
364363
pub fn queue_material_tilemap_meshes<M: MaterialTilemap>(
365-
y_sort: Res<RenderYSort>,
366364
chunk_storage: Res<RenderChunk2dStorage>,
367365
transparent_2d_draw_functions: Res<DrawFunctions<Transparent2d>>,
368366
render_device: Res<RenderDevice>,
@@ -455,7 +453,7 @@ pub fn queue_material_tilemap_meshes<M: MaterialTilemap>(
455453
bind_group_data: material.key.clone(),
456454
},
457455
);
458-
let z = if **y_sort {
456+
let z = if chunk.y_sort {
459457
transform.translation.z
460458
+ (1.0
461459
- (transform.translation.y

src/render/mod.rs

Lines changed: 7 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@ use bevy::{
1616
#[cfg(not(feature = "atlas"))]
1717
use bevy::render::renderer::RenderDevice;
1818

19-
use crate::render::{
20-
material::{MaterialTilemapPlugin, StandardTilemapMaterial},
21-
prepare::{MeshUniformResource, TilemapUniformResource},
22-
};
19+
use crate::tiles::{TilePos, TileStorage};
2320
use crate::{
24-
prelude::{TilemapRenderSettings, TilemapTexture},
25-
tiles::{TilePos, TileStorage},
21+
prelude::TilemapTexture,
22+
render::{
23+
material::{MaterialTilemapPlugin, StandardTilemapMaterial},
24+
prepare::{MeshUniformResource, TilemapUniformResource},
25+
},
2626
};
2727

2828
use self::{
@@ -62,7 +62,7 @@ pub struct DefaultSampler(ImageSamplerDescriptor);
6262
///
6363
/// Initialized from [`TilemapRenderSettings`](crate::map::TilemapRenderSettings) resource, if
6464
/// provided. Otherwise, defaults to `64 x 64`.
65-
#[derive(Resource, Debug, Copy, Clone, Deref)]
65+
#[derive(Debug, Copy, Clone, Deref)]
6666
pub(crate) struct RenderChunkSize(UVec2);
6767

6868
impl RenderChunkSize {
@@ -85,13 +85,6 @@ impl RenderChunkSize {
8585
}
8686
}
8787

88-
/// Sorts chunks using Y sort during render.
89-
///
90-
/// Initialized from [`TilemapRenderSettings`](crate::map::TilemapRenderSettings) resource, if
91-
/// provided. Otherwise, defaults to false.
92-
#[derive(Resource, Debug, Copy, Clone, Deref)]
93-
pub struct RenderYSort(bool);
94-
9588
pub struct TilemapRenderingPlugin;
9689

9790
#[derive(Resource, Default, Deref, DerefMut)]
@@ -129,15 +122,6 @@ impl Plugin for TilemapRenderingPlugin {
129122
}
130123

131124
fn finish(&self, app: &mut App) {
132-
// Extract the chunk size from the TilemapRenderSettings used to initialize the
133-
// ChunkCoordinate resource to insert into the render pipeline
134-
let (chunk_size, y_sort) = {
135-
match app.world.get_resource::<TilemapRenderSettings>() {
136-
Some(settings) => (settings.render_chunk_size, settings.y_sort),
137-
None => (CHUNK_SIZE_2D, false),
138-
}
139-
};
140-
141125
let sampler = app.get_added_plugins::<ImagePlugin>().first().map_or_else(
142126
|| ImagePlugin::default_nearest().default_sampler,
143127
|plugin| plugin.default_sampler.clone(),
@@ -242,8 +226,6 @@ impl Plugin for TilemapRenderingPlugin {
242226

243227
render_app
244228
.insert_resource(DefaultSampler(sampler))
245-
.insert_resource(RenderChunkSize(chunk_size))
246-
.insert_resource(RenderYSort(y_sort))
247229
.insert_resource(RenderChunk2dStorage::default())
248230
.insert_resource(SecondsSinceStartup(0.0))
249231
.add_systems(

src/render/prepare.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use crate::map::{
44
TilemapId, TilemapSize, TilemapSpacing, TilemapTexture, TilemapTextureSize, TilemapTileSize,
55
TilemapType,
66
};
7+
use crate::prelude::TilemapRenderSettings;
78
use crate::render::extract::ExtractedFrustum;
89
use crate::{
910
prelude::TilemapGridSize, render::RenderChunkSize, render::SecondsSinceStartup, FrustumCulling,
@@ -42,7 +43,6 @@ pub(crate) fn prepare(
4243
mut chunk_storage: ResMut<RenderChunk2dStorage>,
4344
mut mesh_uniforms: ResMut<MeshUniformResource>,
4445
mut tilemap_uniforms: ResMut<TilemapUniformResource>,
45-
chunk_size: Res<RenderChunkSize>,
4646
extracted_tiles: Query<&ExtractedTile>,
4747
extracted_tilemaps: Query<(
4848
Entity,
@@ -56,6 +56,7 @@ pub(crate) fn prepare(
5656
&TilemapSize,
5757
&InheritedVisibility,
5858
&FrustumCulling,
59+
&TilemapRenderSettings,
5960
)>,
6061
extracted_tilemap_textures: Query<&ExtractedTilemapTexture>,
6162
extracted_frustum_query: Query<&ExtractedFrustum>,
@@ -69,7 +70,6 @@ pub(crate) fn prepare(
6970
chunk_storage.remove_tile_with_entity(tile.entity);
7071
}
7172

72-
let chunk_index = chunk_size.map_tile_to_chunk(&tile.position);
7373
let (
7474
_entity,
7575
transform,
@@ -82,7 +82,10 @@ pub(crate) fn prepare(
8282
map_size,
8383
visibility,
8484
frustum_culling,
85+
tilemap_render_settings,
8586
) = extracted_tilemaps.get(tile.tilemap_id.0).unwrap();
87+
let chunk_size = RenderChunkSize(tilemap_render_settings.render_chunk_size);
88+
let chunk_index = chunk_size.map_tile_to_chunk(&tile.position);
8689

8790
let chunk_data = UVec4::new(
8891
chunk_index.x,
@@ -97,7 +100,7 @@ pub(crate) fn prepare(
97100
in_chunk_tile_index,
98101
tile.tilemap_id.0,
99102
&chunk_data,
100-
**chunk_size,
103+
*chunk_size,
101104
*mesh_type,
102105
*tile_size,
103106
(*texture_size).into(),
@@ -108,6 +111,8 @@ pub(crate) fn prepare(
108111
*transform,
109112
visibility,
110113
frustum_culling,
114+
chunk_size,
115+
tilemap_render_settings.y_sort,
111116
);
112117
chunk.set(
113118
&in_chunk_tile_index.into(),
@@ -135,6 +140,7 @@ pub(crate) fn prepare(
135140
map_size,
136141
visibility,
137142
frustum_culling,
143+
_,
138144
) in extracted_tilemaps.iter()
139145
{
140146
let chunks = chunk_storage.get_chunk_storage(&UVec4::new(0, 0, 0, entity.index()));

0 commit comments

Comments
 (0)