2
2
//! pipeline for 2d meshes.
3
3
//! It doesn't use the [`Material2d`] abstraction, but changes the vertex buffer to include vertex color.
4
4
//! Check out the "mesh2d" example for simpler / higher level 2d meshes.
5
+ #![ allow( clippy:: type_complexity) ]
5
6
6
7
use bevy:: {
7
8
core_pipeline:: core_2d:: Transparent2d ,
@@ -21,8 +22,9 @@ use bevy::{
21
22
Extract , Render , RenderApp , RenderSet ,
22
23
} ,
23
24
sprite:: {
24
- DrawMesh2d , Mesh2dHandle , Mesh2dPipeline , Mesh2dPipelineKey , Mesh2dTransforms ,
25
- SetMesh2dBindGroup , SetMesh2dViewBindGroup ,
25
+ extract_mesh2d, DrawMesh2d , Material2dBindGroupId , Mesh2dHandle , Mesh2dPipeline ,
26
+ Mesh2dPipelineKey , Mesh2dTransforms , MeshFlags , RenderMesh2dInstance ,
27
+ RenderMesh2dInstances , SetMesh2dBindGroup , SetMesh2dViewBindGroup ,
26
28
} ,
27
29
utils:: FloatOrd ,
28
30
} ;
@@ -280,7 +282,10 @@ impl Plugin for ColoredMesh2dPlugin {
280
282
. unwrap ( )
281
283
. add_render_command :: < Transparent2d , DrawColoredMesh2d > ( )
282
284
. init_resource :: < SpecializedRenderPipelines < ColoredMesh2dPipeline > > ( )
283
- . add_systems ( ExtractSchedule , extract_colored_mesh2d)
285
+ . add_systems (
286
+ ExtractSchedule ,
287
+ extract_colored_mesh2d. after ( extract_mesh2d) ,
288
+ )
284
289
. add_systems ( Render , queue_colored_mesh2d. in_set ( RenderSet :: QueueMeshes ) ) ;
285
290
}
286
291
@@ -298,14 +303,32 @@ pub fn extract_colored_mesh2d(
298
303
mut previous_len : Local < usize > ,
299
304
// When extracting, you must use `Extract` to mark the `SystemParam`s
300
305
// which should be taken from the main world.
301
- query : Extract < Query < ( Entity , & ViewVisibility ) , With < ColoredMesh2d > > > ,
306
+ query : Extract <
307
+ Query < ( Entity , & ViewVisibility , & GlobalTransform , & Mesh2dHandle ) , With < ColoredMesh2d > > ,
308
+ > ,
309
+ mut render_mesh_instances : ResMut < RenderMesh2dInstances > ,
302
310
) {
303
311
let mut values = Vec :: with_capacity ( * previous_len) ;
304
- for ( entity, view_visibility) in & query {
312
+ for ( entity, view_visibility, transform , handle ) in & query {
305
313
if !view_visibility. get ( ) {
306
314
continue ;
307
315
}
316
+
317
+ let transforms = Mesh2dTransforms {
318
+ transform : ( & transform. affine ( ) ) . into ( ) ,
319
+ flags : MeshFlags :: empty ( ) . bits ( ) ,
320
+ } ;
321
+
308
322
values. push ( ( entity, ColoredMesh2d ) ) ;
323
+ render_mesh_instances. insert (
324
+ entity,
325
+ RenderMesh2dInstance {
326
+ mesh_asset_id : handle. 0 . id ( ) ,
327
+ transforms,
328
+ material_bind_group_id : Material2dBindGroupId :: default ( ) ,
329
+ automatic_batching : false ,
330
+ } ,
331
+ ) ;
309
332
}
310
333
* previous_len = values. len ( ) ;
311
334
commands. insert_or_spawn_batch ( values) ;
@@ -320,14 +343,14 @@ pub fn queue_colored_mesh2d(
320
343
pipeline_cache : Res < PipelineCache > ,
321
344
msaa : Res < Msaa > ,
322
345
render_meshes : Res < RenderAssets < Mesh > > ,
323
- colored_mesh2d : Query < ( & Mesh2dHandle , & Mesh2dTransforms ) , With < ColoredMesh2d > > ,
346
+ render_mesh_instances : Res < RenderMesh2dInstances > ,
324
347
mut views : Query < (
325
348
& VisibleEntities ,
326
349
& mut RenderPhase < Transparent2d > ,
327
350
& ExtractedView ,
328
351
) > ,
329
352
) {
330
- if colored_mesh2d . is_empty ( ) {
353
+ if render_mesh_instances . is_empty ( ) {
331
354
return ;
332
355
}
333
356
// Iterate each view (a camera is a view)
@@ -339,10 +362,12 @@ pub fn queue_colored_mesh2d(
339
362
340
363
// Queue all entities visible to that view
341
364
for visible_entity in & visible_entities. entities {
342
- if let Ok ( ( mesh2d_handle, mesh2d_transforms) ) = colored_mesh2d. get ( * visible_entity) {
365
+ if let Some ( mesh_instance) = render_mesh_instances. get ( visible_entity) {
366
+ let mesh2d_handle = mesh_instance. mesh_asset_id ;
367
+ let mesh2d_transforms = & mesh_instance. transforms ;
343
368
// Get our specialized pipeline
344
369
let mut mesh2d_key = mesh_key;
345
- if let Some ( mesh) = render_meshes. get ( & mesh2d_handle. 0 ) {
370
+ if let Some ( mesh) = render_meshes. get ( mesh2d_handle) {
346
371
mesh2d_key |=
347
372
Mesh2dPipelineKey :: from_primitive_topology ( mesh. primitive_topology ) ;
348
373
}
0 commit comments