From c909e2638a75724130b7b207985ee55645ca416c Mon Sep 17 00:00:00 2001 From: akimakinai <105044389+akimakinai@users.noreply.github.com> Date: Mon, 12 Aug 2024 20:09:48 +0900 Subject: [PATCH 1/4] Fix Gizmo joint rendering in webgpu --- crates/bevy_gizmos/src/lib.rs | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/crates/bevy_gizmos/src/lib.rs b/crates/bevy_gizmos/src/lib.rs index 9d5f533d713cd..31c1af17d2614 100644 --- a/crates/bevy_gizmos/src/lib.rs +++ b/crates/bevy_gizmos/src/lib.rs @@ -654,11 +654,23 @@ impl RenderCommand

for DrawLineJointGizmo { }; let instances = { - pass.set_vertex_buffer(0, line_gizmo.position_buffer.slice(..)); - pass.set_vertex_buffer(1, line_gizmo.position_buffer.slice(..)); - pass.set_vertex_buffer(2, line_gizmo.position_buffer.slice(..)); + let item_size = VertexFormat::Float32x3.size(); + // position_a + let buffer_size_a = line_gizmo.position_buffer.size() - item_size * 2; + pass.set_vertex_buffer(0, line_gizmo.position_buffer.slice(..buffer_size_a)); + // position_b + let buffer_size_b = line_gizmo.position_buffer.size() - item_size; + pass.set_vertex_buffer( + 1, + line_gizmo.position_buffer.slice(item_size..buffer_size_b), + ); + // position_c + pass.set_vertex_buffer(2, line_gizmo.position_buffer.slice(item_size * 2..)); - pass.set_vertex_buffer(3, line_gizmo.color_buffer.slice(..)); + // color + let item_size = VertexFormat::Float32x4.size(); + // This corresponds to the color of position_b, hence starts from `item_size` + pass.set_vertex_buffer(3, line_gizmo.color_buffer.slice(item_size..)); u32::max(line_gizmo.vertex_count, 2) - 2 }; @@ -749,7 +761,7 @@ fn line_joint_gizmo_vertex_buffer_layouts() -> Vec { step_mode: VertexStepMode::Instance, attributes: vec![VertexAttribute { format: Float32x4, - offset: Float32x4.size(), + offset: 0, shader_location: 3, }], }; @@ -758,12 +770,10 @@ fn line_joint_gizmo_vertex_buffer_layouts() -> Vec { position_layout.clone(), { position_layout.attributes[0].shader_location = 1; - position_layout.attributes[0].offset = Float32x3.size(); position_layout.clone() }, { position_layout.attributes[0].shader_location = 2; - position_layout.attributes[0].offset = 2 * Float32x3.size(); position_layout }, color_layout.clone(), From 8f4c6a25323b6a35da0d9b3df6d19da25d52d8c7 Mon Sep 17 00:00:00 2001 From: akimakinai <105044389+akimakinai@users.noreply.github.com> Date: Mon, 12 Aug 2024 20:43:38 +0900 Subject: [PATCH 2/4] Add end bound to color buffer slicing --- crates/bevy_gizmos/src/lib.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/crates/bevy_gizmos/src/lib.rs b/crates/bevy_gizmos/src/lib.rs index 31c1af17d2614..7161518c356ee 100644 --- a/crates/bevy_gizmos/src/lib.rs +++ b/crates/bevy_gizmos/src/lib.rs @@ -669,8 +669,9 @@ impl RenderCommand

for DrawLineJointGizmo { // color let item_size = VertexFormat::Float32x4.size(); + let buffer_size = dbg!(line_gizmo.color_buffer.size()) - item_size; // This corresponds to the color of position_b, hence starts from `item_size` - pass.set_vertex_buffer(3, line_gizmo.color_buffer.slice(item_size..)); + pass.set_vertex_buffer(3, line_gizmo.color_buffer.slice(item_size..buffer_size)); u32::max(line_gizmo.vertex_count, 2) - 2 }; From d26eb7400a510426d1f2cff9530cd3055bcbd957 Mon Sep 17 00:00:00 2001 From: akimakinai <105044389+akimakinai@users.noreply.github.com> Date: Mon, 12 Aug 2024 20:47:06 +0900 Subject: [PATCH 3/4] Remove dbg --- crates/bevy_gizmos/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/bevy_gizmos/src/lib.rs b/crates/bevy_gizmos/src/lib.rs index 7161518c356ee..67e0ecec3d71d 100644 --- a/crates/bevy_gizmos/src/lib.rs +++ b/crates/bevy_gizmos/src/lib.rs @@ -669,7 +669,7 @@ impl RenderCommand

for DrawLineJointGizmo { // color let item_size = VertexFormat::Float32x4.size(); - let buffer_size = dbg!(line_gizmo.color_buffer.size()) - item_size; + let buffer_size = line_gizmo.color_buffer.size() - item_size; // This corresponds to the color of position_b, hence starts from `item_size` pass.set_vertex_buffer(3, line_gizmo.color_buffer.slice(item_size..buffer_size)); From 142528d7f4d1e9c757a47b454157f55bacbef752 Mon Sep 17 00:00:00 2001 From: akimakinai <105044389+akimakinai@users.noreply.github.com> Date: Wed, 21 Aug 2024 08:24:20 +0900 Subject: [PATCH 4/4] Add system ordering between gizmo line and joint queing systems --- crates/bevy_gizmos/src/pipeline_2d.rs | 2 ++ crates/bevy_gizmos/src/pipeline_3d.rs | 2 ++ 2 files changed, 4 insertions(+) diff --git a/crates/bevy_gizmos/src/pipeline_2d.rs b/crates/bevy_gizmos/src/pipeline_2d.rs index 0f6552f787406..6154d8edc9e06 100644 --- a/crates/bevy_gizmos/src/pipeline_2d.rs +++ b/crates/bevy_gizmos/src/pipeline_2d.rs @@ -54,7 +54,9 @@ impl Plugin for LineGizmo2dPlugin { ) .add_systems( Render, + // FIXME: added `chain()` to workaround vertex buffer being not updated when sliced size changed (queue_line_gizmos_2d, queue_line_joint_gizmos_2d) + .chain() .in_set(GizmoRenderSystem::QueueLineGizmos2d) .after(prepare_assets::), ); diff --git a/crates/bevy_gizmos/src/pipeline_3d.rs b/crates/bevy_gizmos/src/pipeline_3d.rs index 8197623b3618c..37cf9b01db662 100644 --- a/crates/bevy_gizmos/src/pipeline_3d.rs +++ b/crates/bevy_gizmos/src/pipeline_3d.rs @@ -53,7 +53,9 @@ impl Plugin for LineGizmo3dPlugin { ) .add_systems( Render, + // FIXME: added `chain()` to workaround vertex buffer being not updated when sliced size changed (queue_line_gizmos_3d, queue_line_joint_gizmos_3d) + .chain() .in_set(GizmoRenderSystem::QueueLineGizmos3d) .after(prepare_assets::), );