Skip to content

Commit b75d4b1

Browse files
authored
Merge pull request #512 from StarArawn/move-render-settings
Moved render settings onto entity.
2 parents 86549e9 + 8bbafcd commit b75d4b1

File tree

11 files changed

+76
-68
lines changed

11 files changed

+76
-68
lines changed

examples/3d_iso.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,18 @@ fn startup(mut commands: Commands, asset_server: Res<AssetServer>) {
1010

1111
commands.spawn(helpers::tiled::TiledMapBundle {
1212
tiled_map: map_handle,
13+
render_settings: TilemapRenderSettings {
14+
// Map size is 12x12 so we'll have render chunks that are:
15+
// 12 tiles wide and 1 tile tall.
16+
render_chunk_size: UVec2::new(3, 1),
17+
y_sort: true,
18+
},
1319
..Default::default()
1420
});
1521
}
1622

1723
fn main() {
1824
App::new()
19-
.insert_resource(TilemapRenderSettings {
20-
// Map size is 12x12 so we'll have render chunks that are:
21-
// 12 tiles wide and 1 tile tall.
22-
render_chunk_size: UVec2::new(3, 1),
23-
y_sort: true,
24-
})
2525
.add_plugins(
2626
DefaultPlugins
2727
.set(WindowPlugin {

examples/bench.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ fn startup(mut commands: Commands, asset_server: Res<AssetServer>) {
3535
texture: TilemapTexture::Single(texture_handle),
3636
tile_size,
3737
transform: get_tilemap_center_transform(&map_size, &grid_size, &map_type, 0.0),
38+
render_settings: TilemapRenderSettings {
39+
render_chunk_size: UVec2::new(256, 256),
40+
..Default::default()
41+
},
3842
..Default::default()
3943
});
4044
}
@@ -52,10 +56,6 @@ fn main() {
5256
})
5357
.set(ImagePlugin::default_nearest()),
5458
)
55-
.insert_resource(TilemapRenderSettings {
56-
render_chunk_size: UVec2::new(256, 256),
57-
..Default::default()
58-
})
5959
.add_plugins(LogDiagnosticsPlugin::default())
6060
.add_plugins(FrameTimeDiagnosticsPlugin)
6161
.add_plugins(TilemapPlugin)

examples/chunking.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ fn spawn_chunk(commands: &mut Commands, asset_server: &AssetServer, chunk_pos: I
4545
texture: TilemapTexture::Single(texture_handle),
4646
tile_size: TILE_SIZE,
4747
transform,
48+
render_settings: TilemapRenderSettings {
49+
render_chunk_size: RENDER_CHUNK_SIZE,
50+
..Default::default()
51+
},
4852
..Default::default()
4953
});
5054
}
@@ -117,11 +121,6 @@ fn main() {
117121
})
118122
.set(ImagePlugin::default_nearest()),
119123
)
120-
// `TilemapRenderSettings` be added before the `TilemapPlugin`.
121-
.insert_resource(TilemapRenderSettings {
122-
render_chunk_size: RENDER_CHUNK_SIZE,
123-
..Default::default()
124-
})
125124
.add_plugins(TilemapPlugin)
126125
.insert_resource(ChunkManager::default())
127126
.add_systems(Startup, startup)

examples/helpers/tiled.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ pub struct TiledMapBundle {
6565
pub storage: TiledLayersStorage,
6666
pub transform: Transform,
6767
pub global_transform: GlobalTransform,
68+
pub render_settings: TilemapRenderSettings,
6869
}
6970

7071
struct BytesResourceReader {
@@ -200,7 +201,11 @@ pub fn process_loaded_maps(
200201
mut map_events: EventReader<AssetEvent<TiledMap>>,
201202
maps: Res<Assets<TiledMap>>,
202203
tile_storage_query: Query<(Entity, &TileStorage)>,
203-
mut map_query: Query<(&Handle<TiledMap>, &mut TiledLayersStorage)>,
204+
mut map_query: Query<(
205+
&Handle<TiledMap>,
206+
&mut TiledLayersStorage,
207+
&TilemapRenderSettings,
208+
)>,
204209
new_maps: Query<&Handle<TiledMap>, Added<Handle<TiledMap>>>,
205210
) {
206211
let mut changed_maps = Vec::<AssetId<TiledMap>>::default();
@@ -230,7 +235,7 @@ pub fn process_loaded_maps(
230235
}
231236

232237
for changed_map in changed_maps.iter() {
233-
for (map_handle, mut layer_storage) in map_query.iter_mut() {
238+
for (map_handle, mut layer_storage, render_settings) in map_query.iter_mut() {
234239
// only deal with currently changed map
235240
if map_handle.id() != *changed_map {
236241
continue;
@@ -382,6 +387,7 @@ pub fn process_loaded_maps(
382387
layer_index as f32,
383388
) * Transform::from_xyz(offset_x, -offset_y, 0.0),
384389
map_type,
390+
render_settings: *render_settings,
385391
..Default::default()
386392
});
387393

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: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,20 @@
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},
88
prelude::{Component, Entity, Handle, Image, Reflect},
99
};
1010

11+
/// The default chunk_size (in tiles) used per mesh.
12+
pub const CHUNK_SIZE_2D: UVec2 = UVec2::from_array([64, 64]);
13+
1114
/// Custom parameters for the render pipeline.
1215
///
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)]
16+
/// It must be added as a component to the tilemap entity.
17+
#[derive(Component, Debug, Copy, Clone)]
2718
pub struct TilemapRenderSettings {
2819
/// Dimensions of a "chunk" in tiles. Chunks are grouping of tiles combined and rendered as a
2920
/// single mesh by the render pipeline.
@@ -41,6 +32,15 @@ pub struct TilemapRenderSettings {
4132
pub y_sort: bool,
4233
}
4334

35+
impl Default for TilemapRenderSettings {
36+
fn default() -> Self {
37+
Self {
38+
render_chunk_size: CHUNK_SIZE_2D,
39+
y_sort: false,
40+
}
41+
}
42+
}
43+
4444
/// A component which stores a reference to the tilemap entity.
4545
#[derive(Component, Reflect, Clone, Copy, Debug, Hash)]
4646
#[reflect(Component, MapEntities)]

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 & 28 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::{
@@ -49,9 +49,6 @@ use self::extract::ExtractedTilemapTexture;
4949
#[cfg(not(feature = "atlas"))]
5050
pub(crate) use self::texture_array_cache::TextureArrayCache;
5151

52-
/// The default chunk_size (in tiles) used per mesh.
53-
const CHUNK_SIZE_2D: UVec2 = UVec2::from_array([64, 64]);
54-
5552
#[derive(Copy, Clone, Debug, Component)]
5653
pub(crate) struct ExtractedFilterMode(FilterMode);
5754

@@ -62,7 +59,7 @@ pub struct DefaultSampler(ImageSamplerDescriptor);
6259
///
6360
/// Initialized from [`TilemapRenderSettings`](crate::map::TilemapRenderSettings) resource, if
6461
/// provided. Otherwise, defaults to `64 x 64`.
65-
#[derive(Resource, Debug, Copy, Clone, Deref)]
62+
#[derive(Debug, Copy, Clone, Deref)]
6663
pub(crate) struct RenderChunkSize(UVec2);
6764

6865
impl RenderChunkSize {
@@ -85,13 +82,6 @@ impl RenderChunkSize {
8582
}
8683
}
8784

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-
9585
pub struct TilemapRenderingPlugin;
9686

9787
#[derive(Resource, Default, Deref, DerefMut)]
@@ -129,15 +119,6 @@ impl Plugin for TilemapRenderingPlugin {
129119
}
130120

131121
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-
141122
let sampler = app.get_added_plugins::<ImagePlugin>().first().map_or_else(
142123
|| ImagePlugin::default_nearest().default_sampler,
143124
|plugin| plugin.default_sampler.clone(),
@@ -242,8 +223,6 @@ impl Plugin for TilemapRenderingPlugin {
242223

243224
render_app
244225
.insert_resource(DefaultSampler(sampler))
245-
.insert_resource(RenderChunkSize(chunk_size))
246-
.insert_resource(RenderYSort(y_sort))
247226
.insert_resource(RenderChunk2dStorage::default())
248227
.insert_resource(SecondsSinceStartup(0.0))
249228
.add_systems(

0 commit comments

Comments
 (0)