From 437038be02c16e62da4b7e05977d79074165043b Mon Sep 17 00:00:00 2001 From: Carter Anderson Date: Thu, 2 Jun 2022 14:33:48 -0700 Subject: [PATCH] Add "depth_load_op" configuration to 3d Cameras --- .../src/core_3d/camera_3d.rs | 36 +++++++++++++++++-- .../src/core_3d/main_pass_3d_node.rs | 3 +- examples/3d/render_to_texture.rs | 1 + examples/3d/two_passes.rs | 1 + 4 files changed, 37 insertions(+), 4 deletions(-) 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 a04a3df38d5fa1..a9bc38464f3b40 100644 --- a/crates/bevy_core_pipeline/src/core_3d/camera_3d.rs +++ b/crates/bevy_core_pipeline/src/core_3d/camera_3d.rs @@ -1,18 +1,50 @@ use crate::clear_color::ClearColorConfig; use bevy_ecs::{prelude::*, query::QueryItem}; -use bevy_reflect::Reflect; +use bevy_reflect::{Reflect, ReflectDeserialize}; use bevy_render::{ camera::{Camera, CameraRenderGraph, Projection}, extract_component::ExtractComponent, primitives::Frustum, + render_resource::LoadOp, view::VisibleEntities, }; use bevy_transform::prelude::{GlobalTransform, Transform}; +use serde::{Deserialize, Serialize}; -#[derive(Component, Default, Reflect, Clone)] +/// Configuration for the "main 3d render graph". +#[derive(Component, Reflect, Clone, Default)] #[reflect(Component)] pub struct Camera3d { + /// The clear color operation to perform for the main 3d pass. pub clear_color: ClearColorConfig, + /// The depth clear operation to perform for the main 3d pass. + pub depth_load_op: Camera3dDepthLoadOp, +} + +/// The depth clear operation to perform for the main 3d pass. +#[derive(Reflect, Serialize, Deserialize, Clone, Debug)] +#[reflect_value(Serialize, Deserialize)] +pub enum Camera3dDepthLoadOp { + /// Clear with a specified value. + /// Note that 0.0 is the far plane due to bevy's use of reverse-z projections. + Clear(f32), + /// Load from memory. + Load, +} + +impl Default for Camera3dDepthLoadOp { + fn default() -> Self { + Camera3dDepthLoadOp::Clear(0.0) + } +} + +impl From for LoadOp { + fn from(config: Camera3dDepthLoadOp) -> Self { + match config { + Camera3dDepthLoadOp::Clear(x) => LoadOp::Clear(x), + Camera3dDepthLoadOp::Load => LoadOp::Load, + } + } } impl ExtractComponent for Camera3d { diff --git a/crates/bevy_core_pipeline/src/core_3d/main_pass_3d_node.rs b/crates/bevy_core_pipeline/src/core_3d/main_pass_3d_node.rs index 5394a10b3928c9..3aa19e11f4f9cc 100644 --- a/crates/bevy_core_pipeline/src/core_3d/main_pass_3d_node.rs +++ b/crates/bevy_core_pipeline/src/core_3d/main_pass_3d_node.rs @@ -85,8 +85,7 @@ impl Node for MainPass3dNode { view: &depth.view, // NOTE: The opaque main pass loads the depth buffer and possibly overwrites it depth_ops: Some(Operations { - // NOTE: 0.0 is the far plane due to bevy's use of reverse-z projections - load: LoadOp::Clear(0.0), + load: camera_3d.depth_load_op.clone().into(), store: true, }), stencil_ops: None, diff --git a/examples/3d/render_to_texture.rs b/examples/3d/render_to_texture.rs index 76a88a293515b5..f9179d49b98a6b 100644 --- a/examples/3d/render_to_texture.rs +++ b/examples/3d/render_to_texture.rs @@ -95,6 +95,7 @@ fn setup( .spawn_bundle(Camera3dBundle { camera_3d: Camera3d { clear_color: ClearColorConfig::Custom(Color::WHITE), + ..default() }, camera: Camera { // render before the "main pass" camera diff --git a/examples/3d/two_passes.rs b/examples/3d/two_passes.rs index 1937a555817844..af83417a1298ea 100644 --- a/examples/3d/two_passes.rs +++ b/examples/3d/two_passes.rs @@ -49,6 +49,7 @@ fn setup( transform: Transform::from_xyz(10.0, 10., -5.0).looking_at(Vec3::ZERO, Vec3::Y), camera_3d: Camera3d { clear_color: ClearColorConfig::None, + ..default() }, camera: Camera { // renders after / on top of the main camera