diff --git a/crates/bevy_core_pipeline/src/core_3d/camera_3d.rs b/crates/bevy_core_pipeline/src/core_3d/camera_3d.rs index 366ac2c22a54c..e7c7b65c22a4c 100644 --- a/crates/bevy_core_pipeline/src/core_3d/camera_3d.rs +++ b/crates/bevy_core_pipeline/src/core_3d/camera_3d.rs @@ -8,14 +8,14 @@ use bevy_render::{ camera::{Camera, CameraRenderGraph, Projection}, extract_component::ExtractComponent, primitives::Frustum, - render_resource::LoadOp, + render_resource::{LoadOp, TextureUsages}, view::{ColorGrading, VisibleEntities}, }; use bevy_transform::prelude::{GlobalTransform, Transform}; use serde::{Deserialize, Serialize}; /// Configuration for the "main 3d render graph". -#[derive(Component, Reflect, Clone, Default, ExtractComponent)] +#[derive(Component, Reflect, Clone, ExtractComponent)] #[extract_component_filter(With)] #[reflect(Component)] pub struct Camera3d { @@ -23,6 +23,32 @@ pub struct Camera3d { pub clear_color: ClearColorConfig, /// The depth clear operation to perform for the main 3d pass. pub depth_load_op: Camera3dDepthLoadOp, + /// The texture usages for the depth texture created for the main 3d pass. + pub depth_texture_usages: Camera3dDepthTextureUsage, +} + +impl Default for Camera3d { + fn default() -> Self { + Self { + clear_color: ClearColorConfig::Default, + depth_load_op: Default::default(), + depth_texture_usages: TextureUsages::RENDER_ATTACHMENT.into(), + } + } +} + +#[derive(Clone, Copy, Reflect)] +pub struct Camera3dDepthTextureUsage(u32); + +impl From for Camera3dDepthTextureUsage { + fn from(value: TextureUsages) -> Self { + Self(value.bits()) + } +} +impl From for TextureUsages { + fn from(value: Camera3dDepthTextureUsage) -> Self { + Self::from_bits_truncate(value.0) + } } /// The depth clear operation to perform for the main 3d pass. diff --git a/crates/bevy_core_pipeline/src/core_3d/mod.rs b/crates/bevy_core_pipeline/src/core_3d/mod.rs index 50345ac371447..91b7f529e19b2 100644 --- a/crates/bevy_core_pipeline/src/core_3d/mod.rs +++ b/crates/bevy_core_pipeline/src/core_3d/mod.rs @@ -257,7 +257,7 @@ pub fn prepare_core_3d_depth_textures( msaa: Res, render_device: Res, views_3d: Query< - (Entity, &ExtractedCamera, Option<&DepthPrepass>), + (Entity, &ExtractedCamera, Option<&DepthPrepass>, &Camera3d), ( With>, With>, @@ -266,7 +266,7 @@ pub fn prepare_core_3d_depth_textures( >, ) { let mut textures = HashMap::default(); - for (entity, camera, depth_prepass) in &views_3d { + for (entity, camera, depth_prepass, camera_3d) in &views_3d { let Some(physical_target_size) = camera.physical_target_size else { continue; }; @@ -275,7 +275,7 @@ pub fn prepare_core_3d_depth_textures( .entry(camera.target.clone()) .or_insert_with(|| { // Default usage required to write to the depth texture - let mut usage = TextureUsages::RENDER_ATTACHMENT; + let mut usage = camera_3d.depth_texture_usages.into(); if depth_prepass.is_some() { // Required to read the output of the prepass usage |= TextureUsages::COPY_SRC;