From 84d38e3daf4e03d00400441cce835da31c574921 Mon Sep 17 00:00:00 2001 From: yh1970 <162454703+yh1970@users.noreply.github.com> Date: Fri, 19 Dec 2025 16:55:13 +0100 Subject: [PATCH] Fix separate layers with lines and joints --- crates/bevy_gizmos_render/src/pipeline_2d.rs | 70 ++++++-------------- 1 file changed, 21 insertions(+), 49 deletions(-) diff --git a/crates/bevy_gizmos_render/src/pipeline_2d.rs b/crates/bevy_gizmos_render/src/pipeline_2d.rs index 5e745fd60ef27..15eff95c5d2bf 100644 --- a/crates/bevy_gizmos_render/src/pipeline_2d.rs +++ b/crates/bevy_gizmos_render/src/pipeline_2d.rs @@ -68,7 +68,7 @@ impl Plugin for LineGizmo2dPlugin { ) .add_systems( Render, - (queue_line_gizmos_2d, queue_line_joint_gizmos_2d) + queue_line_and_joint_gizmos_2d .in_set(GizmoRenderSystems::QueueLineGizmos2d) .after(prepare_assets::), ); @@ -287,10 +287,12 @@ type DrawLineJointGizmo2d = ( DrawLineJointGizmo, ); -fn queue_line_gizmos_2d( +fn queue_line_and_joint_gizmos_2d( draw_functions: Res>, - pipeline: Res, - mut pipelines: ResMut>, + line_gizmo_pipeline: Res, + line_joint_gizmo_pipeline: Res, + mut line_gizmo_pipelines: ResMut>, + mut line_joint_gizmo_pipelines: ResMut>, pipeline_cache: Res, line_gizmos: Query<(Entity, &MainEntity, &GizmoMeshConfig)>, line_gizmo_assets: Res>, @@ -298,10 +300,14 @@ fn queue_line_gizmos_2d( mut views: Query<(&ExtractedView, &Msaa, Option<&RenderLayers>)>, ) { let draw_function = draw_functions.read().get_id::().unwrap(); - let draw_function_strip = draw_functions + let draw_line_function_strip = draw_functions .read() .get_id::() .unwrap(); + let draw_line_joint_function = draw_functions + .read() + .get_id::() + .unwrap(); for (view, msaa, render_layers) in &mut views { let Some(transparent_phase) = transparent_render_phases.get_mut(&view.retained_view_entity) @@ -322,10 +328,11 @@ fn queue_line_gizmos_2d( continue; }; + // Draw lines if line_gizmo.list_vertex_count > 0 { - let pipeline = pipelines.specialize( + let pipeline = line_gizmo_pipelines.specialize( &pipeline_cache, - &pipeline, + &line_gizmo_pipeline, LineGizmoPipelineKey { mesh_key, strip: false, @@ -345,9 +352,9 @@ fn queue_line_gizmos_2d( } if line_gizmo.strip_vertex_count >= 2 { - let pipeline = pipelines.specialize( + let pipeline = line_gizmo_pipelines.specialize( &pipeline_cache, - &pipeline, + &line_gizmo_pipeline, LineGizmoPipelineKey { mesh_key, strip: true, @@ -356,7 +363,7 @@ fn queue_line_gizmos_2d( ); transparent_phase.add(Transparent2d { entity: (entity, *main_entity), - draw_function: draw_function_strip, + draw_function: draw_line_function_strip, pipeline, sort_key: FloatOrd(f32::INFINITY), batch_range: 0..1, @@ -365,50 +372,15 @@ fn queue_line_gizmos_2d( indexed: false, }); } - } - } -} -fn queue_line_joint_gizmos_2d( - draw_functions: Res>, - pipeline: Res, - mut pipelines: ResMut>, - pipeline_cache: Res, - line_gizmos: Query<(Entity, &MainEntity, &GizmoMeshConfig)>, - line_gizmo_assets: Res>, - mut transparent_render_phases: ResMut>, - mut views: Query<(&ExtractedView, &Msaa, Option<&RenderLayers>)>, -) { - let draw_function = draw_functions - .read() - .get_id::() - .unwrap(); - - for (view, msaa, render_layers) in &mut views { - let Some(transparent_phase) = transparent_render_phases.get_mut(&view.retained_view_entity) - else { - continue; - }; - - let mesh_key = Mesh2dPipelineKey::from_msaa_samples(msaa.samples()) - | Mesh2dPipelineKey::from_hdr(view.hdr); - - let render_layers = render_layers.unwrap_or_default(); - for (entity, main_entity, config) in &line_gizmos { - if !config.render_layers.intersects(render_layers) { - continue; - } - - let Some(line_gizmo) = line_gizmo_assets.get(&config.handle) else { - continue; - }; + // Draw line joints if line_gizmo.strip_vertex_count < 3 || config.line_joints == GizmoLineJoint::None { continue; } - let pipeline = pipelines.specialize( + let pipeline = line_joint_gizmo_pipelines.specialize( &pipeline_cache, - &pipeline, + &line_joint_gizmo_pipeline, LineJointGizmoPipelineKey { mesh_key, joints: config.line_joints, @@ -416,7 +388,7 @@ fn queue_line_joint_gizmos_2d( ); transparent_phase.add(Transparent2d { entity: (entity, *main_entity), - draw_function, + draw_function: draw_line_joint_function, pipeline, sort_key: FloatOrd(f32::INFINITY), batch_range: 0..1,