diff --git a/pipelined/bevy_pbr2/src/render/light.rs b/pipelined/bevy_pbr2/src/render/light.rs index e9d678d4f9..de5b021160 100644 --- a/pipelined/bevy_pbr2/src/render/light.rs +++ b/pipelined/bevy_pbr2/src/render/light.rs @@ -433,12 +433,13 @@ impl Draw for DrawShadowMesh { &[view_uniform_offset.offset], ); + let transform_bindgroup_key = mesh_meta.mesh_transform_bind_group_key.unwrap(); pass.set_bind_group( 1, mesh_meta .into_inner() .mesh_transform_bind_group - .as_ref() + .get_value(transform_bindgroup_key) .unwrap(), &[extracted_mesh.transform_binding_offset], ); diff --git a/pipelined/bevy_pbr2/src/render/mod.rs b/pipelined/bevy_pbr2/src/render/mod.rs index 86066d94be..445d921d63 100644 --- a/pipelined/bevy_pbr2/src/render/mod.rs +++ b/pipelined/bevy_pbr2/src/render/mod.rs @@ -420,7 +420,8 @@ struct MeshDrawInfo { pub struct MeshMeta { transform_uniforms: DynamicUniformVec, material_bind_groups: FrameSlabMap, - mesh_transform_bind_group: Option, + mesh_transform_bind_group: FrameSlabMap, + mesh_transform_bind_group_key: Option>, mesh_draw_info: Vec, } @@ -502,16 +503,21 @@ pub fn queue_meshes( } let transform_uniforms = &mesh_meta.transform_uniforms; - mesh_meta.mesh_transform_bind_group.get_or_insert_with(|| { - render_device.create_bind_group(&BindGroupDescriptor { - entries: &[BindGroupEntry { - binding: 0, - resource: transform_uniforms.binding(), - }], - label: None, - layout: &pbr_shaders.mesh_layout, - }) - }); + mesh_meta.mesh_transform_bind_group.next_frame(); + mesh_meta.mesh_transform_bind_group_key = + Some(mesh_meta.mesh_transform_bind_group.get_or_insert_with( + transform_uniforms.uniform_buffer().unwrap().id(), + || { + render_device.create_bind_group(&BindGroupDescriptor { + entries: &[BindGroupEntry { + binding: 0, + resource: transform_uniforms.binding(), + }], + label: None, + layout: &pbr_shaders.mesh_layout, + }) + }, + )); for (entity, view, view_lights, mut transparent_phase) in views.iter_mut() { // TODO: cache this? let view_bind_group = render_device.create_bind_group(&BindGroupDescriptor { @@ -736,7 +742,10 @@ impl Draw for DrawPbr { ); pass.set_bind_group( 1, - mesh_meta.mesh_transform_bind_group.as_ref().unwrap(), + mesh_meta + .mesh_transform_bind_group + .get_value(mesh_meta.mesh_transform_bind_group_key.unwrap()) + .unwrap(), &[extracted_mesh.transform_binding_offset], ); let mesh_draw_info = &mesh_meta.mesh_draw_info[draw_key];