Skip to content

Commit

Permalink
Enable breaking sprite batches
Browse files Browse the repository at this point in the history
  • Loading branch information
Davier committed Dec 28, 2021
1 parent a2dd029 commit 5f4f7f2
Show file tree
Hide file tree
Showing 5 changed files with 207 additions and 145 deletions.
12 changes: 8 additions & 4 deletions crates/bevy_sprite/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,8 @@ pub const SPRITE_SHADER_HANDLE: HandleUntyped =

#[derive(Debug, Hash, PartialEq, Eq, Clone, SystemLabel)]
pub enum SpriteSystem {
ExtractSprite,
ExtractSprites,
PrepareSprites,
}

impl Plugin for SpritePlugin {
Expand All @@ -65,15 +66,18 @@ impl Plugin for SpritePlugin {
.init_resource::<SpritePipeline>()
.init_resource::<SpecializedPipelines<SpritePipeline>>()
.init_resource::<SpriteMeta>()
.init_resource::<ExtractedSprites>()
.init_resource::<Extracted2dItems>()
.init_resource::<SpriteAssetEvents>()
.add_render_command::<Transparent2d, DrawSprite>()
.add_system_to_stage(
RenderStage::Extract,
render::extract_sprites.label(SpriteSystem::ExtractSprite),
render::extract_sprites.label(SpriteSystem::ExtractSprites),
)
.add_system_to_stage(RenderStage::Extract, render::extract_sprite_events)
.add_system_to_stage(RenderStage::Prepare, render::prepare_sprites)
.add_system_to_stage(
RenderStage::Prepare,
render::prepare_sprites.label(SpriteSystem::PrepareSprites),
)
.add_system_to_stage(RenderStage::Queue, queue_sprites);
}
}
20 changes: 14 additions & 6 deletions crates/bevy_sprite/src/mesh2d/mesh.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,12 @@ use bevy_render::{
renderer::{RenderDevice, RenderQueue},
texture::{BevyDefault, GpuImage, Image, TextureFormatPixelInfo},
view::{ComputedVisibility, ExtractedView, ViewUniform, ViewUniformOffset, ViewUniforms},
RenderApp, RenderStage,
RenderApp, RenderStage, RenderWorld,
};
use bevy_transform::components::GlobalTransform;

use crate::{Extracted2dItem, Extracted2dItems, SpriteSystem};

#[derive(Default, Clone, Component)]
pub struct Mesh2dHandle(pub Handle<Mesh>);

Expand Down Expand Up @@ -61,12 +63,12 @@ impl Plugin for Mesh2dRenderPlugin {
app.sub_app_mut(RenderApp)
.init_resource::<Mesh2dPipeline>()
.init_resource::<SpecializedPipelines<Mesh2dPipeline>>()
// .add_render_command::<Transparent2d, DrawMesh2dTest>()
.add_system_to_stage(RenderStage::Extract, extract_mesh2d)
.add_system_to_stage(
RenderStage::Extract,
extract_mesh2d.after(SpriteSystem::ExtractSprites),
)
.add_system_to_stage(RenderStage::Queue, queue_mesh2d_bind_group)
.add_system_to_stage(RenderStage::Queue, queue_mesh2d_view_bind_groups)
// .add_system_to_stage(RenderStage::Queue, queue_mesh2d_test)
;
.add_system_to_stage(RenderStage::Queue, queue_mesh2d_view_bind_groups);
}
}

Expand All @@ -88,16 +90,19 @@ bitflags::bitflags! {
}

pub fn extract_mesh2d(
mut render_world: ResMut<RenderWorld>,
mut commands: Commands,
mut previous_len: Local<usize>,
query: Query<(Entity, &ComputedVisibility, &GlobalTransform, &Mesh2dHandle)>,
) {
let mut extracted_sprites = render_world.get_resource_mut::<Extracted2dItems>().unwrap();
let mut values = Vec::with_capacity(*previous_len);
for (entity, computed_visibility, transform, handle) in query.iter() {
if !computed_visibility.is_visible {
continue;
}
let transform = transform.compute_matrix();
let z = transform.col(3).z;
values.push((
entity,
(
Expand All @@ -109,6 +114,9 @@ pub fn extract_mesh2d(
},
),
));
// Break sprite batches
// FIXME: this doesn't account for camera position
extracted_sprites.items.push(Extracted2dItem::Other { z });
}
*previous_len = values.len();
commands.insert_or_spawn_batch(values);
Expand Down
Loading

0 comments on commit 5f4f7f2

Please sign in to comment.