Customizable camera main texture usage (#11412)
# Objective - Some users want to change the default texture usage of the main camera but they are currently hardcoded ## Solution - Add a component that is used to configure the main texture usage field --- ## Changelog Added `CameraMainTextureUsage` Added `CameraMainTextureUsage` to `Camera3dBundle` and `Camera2dBundle` ## Migration Guide Add `main_texture_usages: Default::default()` to your camera bundle. # Notes Inspired by: #6815
This commit is contained in:
		
							parent
							
								
									03ee959809
								
							
						
					
					
						commit
						7125dcb268
					
				@ -2,7 +2,10 @@ use crate::tonemapping::{DebandDither, Tonemapping};
 | 
				
			|||||||
use bevy_ecs::prelude::*;
 | 
					use bevy_ecs::prelude::*;
 | 
				
			||||||
use bevy_reflect::Reflect;
 | 
					use bevy_reflect::Reflect;
 | 
				
			||||||
use bevy_render::{
 | 
					use bevy_render::{
 | 
				
			||||||
    camera::{Camera, CameraProjection, CameraRenderGraph, OrthographicProjection},
 | 
					    camera::{
 | 
				
			||||||
 | 
					        Camera, CameraMainTextureUsages, CameraProjection, CameraRenderGraph,
 | 
				
			||||||
 | 
					        OrthographicProjection,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    extract_component::ExtractComponent,
 | 
					    extract_component::ExtractComponent,
 | 
				
			||||||
    primitives::Frustum,
 | 
					    primitives::Frustum,
 | 
				
			||||||
    view::VisibleEntities,
 | 
					    view::VisibleEntities,
 | 
				
			||||||
@ -26,6 +29,7 @@ pub struct Camera2dBundle {
 | 
				
			|||||||
    pub camera_2d: Camera2d,
 | 
					    pub camera_2d: Camera2d,
 | 
				
			||||||
    pub tonemapping: Tonemapping,
 | 
					    pub tonemapping: Tonemapping,
 | 
				
			||||||
    pub deband_dither: DebandDither,
 | 
					    pub deband_dither: DebandDither,
 | 
				
			||||||
 | 
					    pub main_texture_usages: CameraMainTextureUsages,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl Default for Camera2dBundle {
 | 
					impl Default for Camera2dBundle {
 | 
				
			||||||
@ -55,6 +59,7 @@ impl Default for Camera2dBundle {
 | 
				
			|||||||
            camera_2d: Camera2d,
 | 
					            camera_2d: Camera2d,
 | 
				
			||||||
            tonemapping: Tonemapping::None,
 | 
					            tonemapping: Tonemapping::None,
 | 
				
			||||||
            deband_dither: DebandDither::Disabled,
 | 
					            deband_dither: DebandDither::Disabled,
 | 
				
			||||||
 | 
					            main_texture_usages: Default::default(),
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -93,6 +98,7 @@ impl Camera2dBundle {
 | 
				
			|||||||
            camera_2d: Camera2d,
 | 
					            camera_2d: Camera2d,
 | 
				
			||||||
            tonemapping: Tonemapping::None,
 | 
					            tonemapping: Tonemapping::None,
 | 
				
			||||||
            deband_dither: DebandDither::Disabled,
 | 
					            deband_dither: DebandDither::Disabled,
 | 
				
			||||||
 | 
					            main_texture_usages: Default::default(),
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -2,7 +2,7 @@ use crate::tonemapping::{DebandDither, Tonemapping};
 | 
				
			|||||||
use bevy_ecs::prelude::*;
 | 
					use bevy_ecs::prelude::*;
 | 
				
			||||||
use bevy_reflect::{Reflect, ReflectDeserialize, ReflectSerialize};
 | 
					use bevy_reflect::{Reflect, ReflectDeserialize, ReflectSerialize};
 | 
				
			||||||
use bevy_render::{
 | 
					use bevy_render::{
 | 
				
			||||||
    camera::{Camera, CameraRenderGraph, Projection},
 | 
					    camera::{Camera, CameraMainTextureUsages, CameraRenderGraph, Projection},
 | 
				
			||||||
    extract_component::ExtractComponent,
 | 
					    extract_component::ExtractComponent,
 | 
				
			||||||
    primitives::Frustum,
 | 
					    primitives::Frustum,
 | 
				
			||||||
    render_resource::{LoadOp, TextureUsages},
 | 
					    render_resource::{LoadOp, TextureUsages},
 | 
				
			||||||
@ -143,6 +143,7 @@ pub struct Camera3dBundle {
 | 
				
			|||||||
    pub tonemapping: Tonemapping,
 | 
					    pub tonemapping: Tonemapping,
 | 
				
			||||||
    pub dither: DebandDither,
 | 
					    pub dither: DebandDither,
 | 
				
			||||||
    pub color_grading: ColorGrading,
 | 
					    pub color_grading: ColorGrading,
 | 
				
			||||||
 | 
					    pub main_texture_usages: CameraMainTextureUsages,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NOTE: ideally Perspective and Orthographic defaults can share the same impl, but sadly it breaks rust's type inference
 | 
					// NOTE: ideally Perspective and Orthographic defaults can share the same impl, but sadly it breaks rust's type inference
 | 
				
			||||||
@ -160,6 +161,7 @@ impl Default for Camera3dBundle {
 | 
				
			|||||||
            tonemapping: Default::default(),
 | 
					            tonemapping: Default::default(),
 | 
				
			||||||
            dither: DebandDither::Enabled,
 | 
					            dither: DebandDither::Enabled,
 | 
				
			||||||
            color_grading: ColorGrading::default(),
 | 
					            color_grading: ColorGrading::default(),
 | 
				
			||||||
 | 
					            main_texture_usages: Default::default(),
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -24,6 +24,7 @@ use bevy_math::{
 | 
				
			|||||||
    primitives::Direction3d, vec2, Mat4, Ray3d, Rect, URect, UVec2, UVec4, Vec2, Vec3,
 | 
					    primitives::Direction3d, vec2, Mat4, Ray3d, Rect, URect, UVec2, UVec4, Vec2, Vec3,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
use bevy_reflect::prelude::*;
 | 
					use bevy_reflect::prelude::*;
 | 
				
			||||||
 | 
					use bevy_render_macros::ExtractComponent;
 | 
				
			||||||
use bevy_transform::components::GlobalTransform;
 | 
					use bevy_transform::components::GlobalTransform;
 | 
				
			||||||
use bevy_utils::{HashMap, HashSet};
 | 
					use bevy_utils::{HashMap, HashSet};
 | 
				
			||||||
use bevy_window::{
 | 
					use bevy_window::{
 | 
				
			||||||
@ -31,7 +32,7 @@ use bevy_window::{
 | 
				
			|||||||
    WindowScaleFactorChanged,
 | 
					    WindowScaleFactorChanged,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
use std::{borrow::Cow, ops::Range};
 | 
					use std::{borrow::Cow, ops::Range};
 | 
				
			||||||
use wgpu::{BlendState, LoadOp, TextureFormat};
 | 
					use wgpu::{BlendState, LoadOp, TextureFormat, TextureUsages};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use super::{ClearColorConfig, Projection};
 | 
					use super::{ClearColorConfig, Projection};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -750,6 +751,19 @@ pub fn camera_system<T: CameraProjection + Component>(
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// This component lets you control the [`TextureUsages`] field of the main texture generated for the camera
 | 
				
			||||||
 | 
					#[derive(Component, ExtractComponent, Clone, Copy)]
 | 
				
			||||||
 | 
					pub struct CameraMainTextureUsages(pub TextureUsages);
 | 
				
			||||||
 | 
					impl Default for CameraMainTextureUsages {
 | 
				
			||||||
 | 
					    fn default() -> Self {
 | 
				
			||||||
 | 
					        Self(
 | 
				
			||||||
 | 
					            TextureUsages::RENDER_ATTACHMENT
 | 
				
			||||||
 | 
					                | TextureUsages::TEXTURE_BINDING
 | 
				
			||||||
 | 
					                | TextureUsages::COPY_SRC,
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Component, Debug)]
 | 
					#[derive(Component, Debug)]
 | 
				
			||||||
pub struct ExtractedCamera {
 | 
					pub struct ExtractedCamera {
 | 
				
			||||||
    pub target: Option<NormalizedRenderTarget>,
 | 
					    pub target: Option<NormalizedRenderTarget>,
 | 
				
			||||||
 | 
				
			|||||||
@ -12,8 +12,8 @@ pub use manual_texture_view::*;
 | 
				
			|||||||
pub use projection::*;
 | 
					pub use projection::*;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use crate::{
 | 
					use crate::{
 | 
				
			||||||
    extract_resource::ExtractResourcePlugin, render_graph::RenderGraph, ExtractSchedule, Render,
 | 
					    extract_component::ExtractComponentPlugin, extract_resource::ExtractResourcePlugin,
 | 
				
			||||||
    RenderApp, RenderSet,
 | 
					    render_graph::RenderGraph, ExtractSchedule, Render, RenderApp, RenderSet,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
use bevy_app::{App, Plugin};
 | 
					use bevy_app::{App, Plugin};
 | 
				
			||||||
use bevy_ecs::schedule::IntoSystemConfigs;
 | 
					use bevy_ecs::schedule::IntoSystemConfigs;
 | 
				
			||||||
@ -39,6 +39,7 @@ impl Plugin for CameraPlugin {
 | 
				
			|||||||
                CameraProjectionPlugin::<PerspectiveProjection>::default(),
 | 
					                CameraProjectionPlugin::<PerspectiveProjection>::default(),
 | 
				
			||||||
                ExtractResourcePlugin::<ManualTextureViews>::default(),
 | 
					                ExtractResourcePlugin::<ManualTextureViews>::default(),
 | 
				
			||||||
                ExtractResourcePlugin::<ClearColor>::default(),
 | 
					                ExtractResourcePlugin::<ClearColor>::default(),
 | 
				
			||||||
 | 
					                ExtractComponentPlugin::<CameraMainTextureUsages>::default(),
 | 
				
			||||||
            ));
 | 
					            ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if let Ok(render_app) = app.get_sub_app_mut(RenderApp) {
 | 
					        if let Ok(render_app) = app.get_sub_app_mut(RenderApp) {
 | 
				
			||||||
 | 
				
			|||||||
@ -7,8 +7,8 @@ pub use window::*;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
use crate::{
 | 
					use crate::{
 | 
				
			||||||
    camera::{
 | 
					    camera::{
 | 
				
			||||||
        ClearColor, ClearColorConfig, ExposureSettings, ExtractedCamera, ManualTextureViews,
 | 
					        CameraMainTextureUsages, ClearColor, ClearColorConfig, ExposureSettings, ExtractedCamera,
 | 
				
			||||||
        MipBias, TemporalJitter,
 | 
					        ManualTextureViews, MipBias, TemporalJitter,
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    extract_resource::{ExtractResource, ExtractResourcePlugin},
 | 
					    extract_resource::{ExtractResource, ExtractResourcePlugin},
 | 
				
			||||||
    prelude::{Image, Shader},
 | 
					    prelude::{Image, Shader},
 | 
				
			||||||
@ -465,11 +465,16 @@ fn prepare_view_targets(
 | 
				
			|||||||
    clear_color_global: Res<ClearColor>,
 | 
					    clear_color_global: Res<ClearColor>,
 | 
				
			||||||
    render_device: Res<RenderDevice>,
 | 
					    render_device: Res<RenderDevice>,
 | 
				
			||||||
    mut texture_cache: ResMut<TextureCache>,
 | 
					    mut texture_cache: ResMut<TextureCache>,
 | 
				
			||||||
    cameras: Query<(Entity, &ExtractedCamera, &ExtractedView)>,
 | 
					    cameras: Query<(
 | 
				
			||||||
 | 
					        Entity,
 | 
				
			||||||
 | 
					        &ExtractedCamera,
 | 
				
			||||||
 | 
					        &ExtractedView,
 | 
				
			||||||
 | 
					        &CameraMainTextureUsages,
 | 
				
			||||||
 | 
					    )>,
 | 
				
			||||||
    manual_texture_views: Res<ManualTextureViews>,
 | 
					    manual_texture_views: Res<ManualTextureViews>,
 | 
				
			||||||
) {
 | 
					) {
 | 
				
			||||||
    let mut textures = HashMap::default();
 | 
					    let mut textures = HashMap::default();
 | 
				
			||||||
    for (entity, camera, view) in cameras.iter() {
 | 
					    for (entity, camera, view, texture_usage) in cameras.iter() {
 | 
				
			||||||
        if let (Some(target_size), Some(target)) = (camera.physical_target_size, &camera.target) {
 | 
					        if let (Some(target_size), Some(target)) = (camera.physical_target_size, &camera.target) {
 | 
				
			||||||
            if let (Some(out_texture_view), Some(out_texture_format)) = (
 | 
					            if let (Some(out_texture_view), Some(out_texture_format)) = (
 | 
				
			||||||
                target.get_texture_view(&windows, &images, &manual_texture_views),
 | 
					                target.get_texture_view(&windows, &images, &manual_texture_views),
 | 
				
			||||||
@ -502,9 +507,7 @@ fn prepare_view_targets(
 | 
				
			|||||||
                            sample_count: 1,
 | 
					                            sample_count: 1,
 | 
				
			||||||
                            dimension: TextureDimension::D2,
 | 
					                            dimension: TextureDimension::D2,
 | 
				
			||||||
                            format: main_texture_format,
 | 
					                            format: main_texture_format,
 | 
				
			||||||
                            usage: TextureUsages::RENDER_ATTACHMENT
 | 
					                            usage: texture_usage.0,
 | 
				
			||||||
                                | TextureUsages::TEXTURE_BINDING
 | 
					 | 
				
			||||||
                                | TextureUsages::COPY_SRC,
 | 
					 | 
				
			||||||
                            view_formats: match main_texture_format {
 | 
					                            view_formats: match main_texture_format {
 | 
				
			||||||
                                TextureFormat::Bgra8Unorm => &[TextureFormat::Bgra8UnormSrgb],
 | 
					                                TextureFormat::Bgra8Unorm => &[TextureFormat::Bgra8UnormSrgb],
 | 
				
			||||||
                                TextureFormat::Rgba8Unorm => &[TextureFormat::Rgba8UnormSrgb],
 | 
					                                TextureFormat::Rgba8Unorm => &[TextureFormat::Rgba8UnormSrgb],
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user