Skip to content

Commit db97ffc

Browse files
committed
use channels
1 parent f6e1f97 commit db97ffc

File tree

12 files changed

+265
-180
lines changed

12 files changed

+265
-180
lines changed

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ bevy_gltf = ["bevy_internal/bevy_gltf", "bevy_asset", "bevy_scene", "bevy_pbr"]
8585
# Adds PBR rendering
8686
bevy_pbr = ["bevy_internal/bevy_pbr", "bevy_asset", "bevy_render", "bevy_core_pipeline"]
8787

88+
gpu_picking = []
89+
8890
# Provides rendering functionality
8991
bevy_render = ["bevy_internal/bevy_render"]
9092

crates/bevy_core_pipeline/src/core_3d/main_opaque_pass_3d_node.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use crate::{
77
use bevy_ecs::{prelude::*, query::QueryItem};
88
use bevy_render::{
99
camera::ExtractedCamera,
10-
picking::{EntityTextures, GpuPickingCamera},
10+
picking::{EntityTextures, ExtractedGpuPickingCamera},
1111
render_graph::{NodeRunError, RenderGraphContext, ViewNode},
1212
render_phase::RenderPhase,
1313
render_resource::{
@@ -35,7 +35,7 @@ impl ViewNode for MainOpaquePass3dNode {
3535
Option<&'static DepthPrepass>,
3636
Option<&'static NormalPrepass>,
3737
Option<&'static MotionVectorPrepass>,
38-
Option<&'static GpuPickingCamera>,
38+
Option<&'static ExtractedGpuPickingCamera>,
3939
Option<&'static SkyboxPipelineId>,
4040
Option<&'static SkyboxBindGroup>,
4141
Option<&'static EntityTextures>,
@@ -84,7 +84,7 @@ impl ViewNode for MainOpaquePass3dNode {
8484
load: match camera_3d.clear_color {
8585
ClearColorConfig::None => LoadOp::Load,
8686
// TODO clear this earlier?
87-
_ => LoadOp::Clear(EntityTextures::clear_color()),
87+
_ => LoadOp::Clear(EntityTextures::no_entity_color()),
8888
},
8989
store: true,
9090
})));

crates/bevy_core_pipeline/src/core_3d/main_transparent_pass_3d_node.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use crate::core_3d::Transparent3d;
22
use bevy_ecs::{prelude::*, query::QueryItem};
33
use bevy_render::{
44
camera::ExtractedCamera,
5-
picking::{EntityTextures, GpuPickingCamera},
5+
picking::{EntityTextures, ExtractedGpuPickingCamera},
66
render_graph::{NodeRunError, RenderGraphContext, ViewNode},
77
render_phase::RenderPhase,
88
render_resource::{LoadOp, Operations, RenderPassDepthStencilAttachment, RenderPassDescriptor},
@@ -22,7 +22,7 @@ impl ViewNode for MainTransparentPass3dNode {
2222
&'static RenderPhase<Transparent3d>,
2323
&'static ViewTarget,
2424
&'static ViewDepthTexture,
25-
Option<&'static GpuPickingCamera>,
25+
Option<&'static ExtractedGpuPickingCamera>,
2626
Option<&'static EntityTextures>,
2727
);
2828
fn run(

crates/bevy_core_pipeline/src/core_3d/mod.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ use bevy_ecs::prelude::*;
3636
use bevy_render::{
3737
camera::{Camera, ExtractedCamera},
3838
extract_component::ExtractComponentPlugin,
39-
picking::{EntityTextures, GpuPickingCamera, ENTITY_TEXTURE_FORMAT},
39+
picking::{EntityTextures, ExtractedGpuPickingCamera, ENTITY_TEXTURE_FORMAT},
4040
prelude::Msaa,
4141
render_graph::{EmptyNode, RenderGraphApp, ViewNodeRunner},
4242
render_phase::{
@@ -86,6 +86,7 @@ impl Plugin for Core3dPlugin {
8686
prepare_core_3d_depth_textures
8787
.in_set(RenderSet::Prepare)
8888
.after(bevy_render::view::prepare_windows),
89+
// #[cfg(feature = "gpu_picking")]
8990
prepare_entity_textures
9091
.in_set(RenderSet::Prepare)
9192
.after(bevy_render::view::prepare_windows),
@@ -322,13 +323,14 @@ pub fn prepare_core_3d_depth_textures(
322323
}
323324
}
324325

326+
/// Create the required buffers based on the camera size
325327
pub fn prepare_entity_textures(
326328
mut commands: Commands,
327329
mut texture_cache: ResMut<TextureCache>,
328330
msaa: Res<Msaa>,
329331
render_device: Res<RenderDevice>,
330332
views_3d: Query<
331-
(Entity, &ExtractedCamera, Option<&GpuPickingCamera>),
333+
(Entity, &ExtractedCamera, Option<&ExtractedGpuPickingCamera>),
332334
(With<RenderPhase<Opaque3d>>, With<RenderPhase<AlphaMask3d>>),
333335
>,
334336
) {
@@ -377,7 +379,6 @@ pub fn prepare_entity_textures(
377379
)
378380
}),
379381
};
380-
381382
commands.entity(entity).insert(entity_textures);
382383
}
383384
}

crates/bevy_core_pipeline/src/entity_index_buffer_copy/mod.rs

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use bevy_app::Plugin;
22
use bevy_ecs::{query::QueryItem, world::World};
33
use bevy_render::{
4-
picking::{EntityTextures, GpuPickingCamera},
4+
picking::{EntityTextures, ExtractedGpuPickingCamera},
55
render_graph::{RenderGraphApp, RenderGraphContext, ViewNode, ViewNodeRunner},
66
renderer::RenderContext,
77
RenderApp,
@@ -12,7 +12,7 @@ use crate::core_3d::CORE_3D;
1212
#[derive(Default)]
1313
pub struct EntityIndexBufferCopyNode;
1414
impl ViewNode for EntityIndexBufferCopyNode {
15-
type ViewQuery = (&'static EntityTextures, &'static GpuPickingCamera);
15+
type ViewQuery = (&'static EntityTextures, &'static ExtractedGpuPickingCamera);
1616

1717
fn run(
1818
&self,
@@ -21,29 +21,23 @@ impl ViewNode for EntityIndexBufferCopyNode {
2121
(entity_index_textures, gpu_picking_camera): QueryItem<Self::ViewQuery>,
2222
_world: &World,
2323
) -> Result<(), bevy_render::render_graph::NodeRunError> {
24-
let Ok(mut guard) = gpu_picking_camera.0.try_lock() else { return Ok(()); };
25-
let Some(buffers) = guard.as_mut() else { return Ok(()); };
24+
let Some(buffers) = gpu_picking_camera.buffers.as_ref() else {
25+
return Ok(());
26+
};
2627

27-
// copy entity index texture
2828
buffers.copy_texture_to_buffer(
2929
render_context.command_encoder(),
3030
&entity_index_textures.main.texture,
31-
&buffers.entity_buffer,
3231
);
3332

34-
// TODO copy depth
35-
3633
Ok(())
3734
}
3835
}
3936

4037
pub struct EntityIndexBufferCopyPlugin;
4138
impl Plugin for EntityIndexBufferCopyPlugin {
4239
fn build(&self, app: &mut bevy_app::App) {
43-
let render_app = match app.get_sub_app_mut(RenderApp) {
44-
Ok(render_app) => render_app,
45-
Err(_) => return,
46-
};
40+
let Ok(render_app) = app.get_sub_app_mut(RenderApp) else { return; };
4741

4842
// 3D
4943
use crate::core_3d::graph::node::*;

crates/bevy_gizmos/src/lib.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,16 @@ use bevy_reflect::{
3737
use bevy_render::{
3838
color::Color,
3939
mesh::Mesh,
40-
picking,
4140
primitives::Aabb,
4241
render_phase::AddRenderCommand,
4342
render_resource::{PrimitiveTopology, Shader, SpecializedMeshPipelines},
4443
Extract, ExtractSchedule, Render, RenderApp, RenderSet,
4544
};
4645
use bevy_transform::components::{GlobalTransform, Transform};
4746

47+
// #[cfg(feature = "gpu_picking")]
48+
use bevy_render::picking;
49+
4850
#[cfg(feature = "bevy_pbr")]
4951
use bevy_pbr::MeshUniform;
5052
#[cfg(feature = "bevy_sprite")]
@@ -326,6 +328,7 @@ fn extract_gizmo_data(
326328
transform,
327329
previous_transform: transform,
328330
inverse_transpose_model,
331+
// #[cfg(feature = "gpu_picking")]
329332
entity: picking::entity_as_uvec2(Entity::PLACEHOLDER),
330333
},
331334
),

crates/bevy_pbr/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ keywords = ["bevy"]
1010

1111
[features]
1212
webgl = []
13+
gpu_picking = []
1314

1415
[dependencies]
1516
# bevy

crates/bevy_pbr/src/material.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use bevy_reflect::{TypePath, TypeUuid};
2323
use bevy_render::{
2424
extract_component::ExtractComponentPlugin,
2525
mesh::{Mesh, MeshVertexBufferLayout},
26-
picking::{GpuPickingCamera, GpuPickingMesh},
26+
picking::{ExtractedGpuPickingCamera, GpuPickingMesh},
2727
prelude::Image,
2828
render_asset::{PrepareAssetSet, RenderAssets},
2929
render_phase::{
@@ -394,7 +394,7 @@ pub fn queue_material_meshes<M: Material>(
394394
Option<&DebandDither>,
395395
Option<&EnvironmentMapLight>,
396396
Option<&NormalPrepass>,
397-
Option<&GpuPickingCamera>,
397+
Option<&ExtractedGpuPickingCamera>,
398398
Option<&TemporalAntiAliasSettings>,
399399
&mut RenderPhase<Opaque3d>,
400400
&mut RenderPhase<AlphaMask3d>,

crates/bevy_pbr/src/render/mesh.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ pub struct MeshUniform {
132132
pub transform: Mat4,
133133
pub previous_transform: Mat4,
134134
pub inverse_transpose_model: Mat4,
135-
// TODO should probably be a separate uniform in case gpu picking is disabled
135+
// #[cfg(feature = "gpu_picking")]
136136
pub entity: UVec2,
137137
pub flags: u32,
138138
}
@@ -187,6 +187,7 @@ pub fn extract_meshes(
187187
flags: flags.bits(),
188188
transform,
189189
previous_transform,
190+
// #[cfg(feature = "gpu_picking")]
190191
entity: picking::entity_as_uvec2(entity),
191192
inverse_transpose_model: transform.inverse().transpose(),
192193
};

crates/bevy_render/src/lib.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ pub mod prelude {
4545
use bevy_window::{PrimaryWindow, RawHandleWrapper};
4646
use globals::GlobalsPlugin;
4747
pub use once_cell;
48-
use picking::GpuPickingPlugin;
4948
use renderer::{RenderAdapter, RenderAdapterInfo, RenderDevice, RenderQueue};
5049
use wgpu::Instance;
5150

@@ -336,8 +335,7 @@ impl Plugin for RenderPlugin {
336335
.add_plugin(CameraPlugin)
337336
.add_plugin(ViewPlugin)
338337
.add_plugin(MeshPlugin)
339-
.add_plugin(GlobalsPlugin)
340-
.add_plugin(GpuPickingPlugin);
338+
.add_plugin(GlobalsPlugin);
341339

342340
app.register_type::<color::Color>()
343341
.register_type::<primitives::Aabb>()

0 commit comments

Comments
 (0)