bevy_core_pipeline/core_2d/
camera_2d.rs

1#![expect(deprecated)]
2
3use crate::{
4    core_2d::graph::Core2d,
5    tonemapping::{DebandDither, Tonemapping},
6};
7use bevy_ecs::prelude::*;
8use bevy_reflect::{std_traits::ReflectDefault, Reflect};
9use bevy_render::sync_world::SyncToRenderWorld;
10use bevy_render::{
11    camera::{
12        Camera, CameraMainTextureUsages, CameraProjection, CameraRenderGraph,
13        OrthographicProjection,
14    },
15    extract_component::ExtractComponent,
16    prelude::Msaa,
17    primitives::Frustum,
18    view::VisibleEntities,
19};
20use bevy_transform::prelude::{GlobalTransform, Transform};
21
22/// A 2D camera component. Enables the 2D render graph for a [`Camera`].
23#[derive(Component, Default, Reflect, Clone, ExtractComponent)]
24#[extract_component_filter(With<Camera>)]
25#[reflect(Component, Default)]
26#[require(
27    Camera,
28    DebandDither,
29    CameraRenderGraph(|| CameraRenderGraph::new(Core2d)),
30    OrthographicProjection(OrthographicProjection::default_2d),
31    Frustum(|| OrthographicProjection::default_2d().compute_frustum(&GlobalTransform::from(Transform::default()))),
32    Tonemapping(|| Tonemapping::None),
33)]
34pub struct Camera2d;
35
36#[derive(Bundle, Clone)]
37#[deprecated(
38    since = "0.15.0",
39    note = "Use the `Camera2d` component instead. Inserting it will now also insert the other components required by it automatically."
40)]
41pub struct Camera2dBundle {
42    pub camera: Camera,
43    pub camera_render_graph: CameraRenderGraph,
44    pub projection: OrthographicProjection,
45    pub visible_entities: VisibleEntities,
46    pub frustum: Frustum,
47    pub transform: Transform,
48    pub global_transform: GlobalTransform,
49    pub camera_2d: Camera2d,
50    pub tonemapping: Tonemapping,
51    pub deband_dither: DebandDither,
52    pub main_texture_usages: CameraMainTextureUsages,
53    pub msaa: Msaa,
54    /// Marker component that indicates that its entity needs to be synchronized to the render world
55    pub sync: SyncToRenderWorld,
56}
57
58impl Default for Camera2dBundle {
59    fn default() -> Self {
60        let projection = OrthographicProjection::default_2d();
61        let transform = Transform::default();
62        let frustum = projection.compute_frustum(&GlobalTransform::from(transform));
63        Self {
64            camera_render_graph: CameraRenderGraph::new(Core2d),
65            projection,
66            visible_entities: VisibleEntities::default(),
67            frustum,
68            transform,
69            global_transform: Default::default(),
70            camera: Camera::default(),
71            camera_2d: Camera2d,
72            tonemapping: Tonemapping::None,
73            deband_dither: DebandDither::Disabled,
74            main_texture_usages: Default::default(),
75            msaa: Default::default(),
76            sync: Default::default(),
77        }
78    }
79}
80
81impl Camera2dBundle {
82    /// Create an orthographic projection camera with a custom `Z` position.
83    ///
84    /// The camera is placed at `Z=far-0.1`, looking toward the world origin `(0,0,0)`.
85    /// Its orthographic projection extends from `0.0` to `-far` in camera view space,
86    /// corresponding to `Z=far-0.1` (closest to camera) to `Z=-0.1` (furthest away from
87    /// camera) in world space.
88    pub fn new_with_far(far: f32) -> Self {
89        // we want 0 to be "closest" and +far to be "farthest" in 2d, so we offset
90        // the camera's translation by far and use a right handed coordinate system
91        let projection = OrthographicProjection {
92            far,
93            ..OrthographicProjection::default_2d()
94        };
95        let transform = Transform::from_xyz(0.0, 0.0, far - 0.1);
96        let frustum = projection.compute_frustum(&GlobalTransform::from(transform));
97        Self {
98            camera_render_graph: CameraRenderGraph::new(Core2d),
99            projection,
100            visible_entities: VisibleEntities::default(),
101            frustum,
102            transform,
103            global_transform: Default::default(),
104            camera: Camera::default(),
105            camera_2d: Camera2d,
106            tonemapping: Tonemapping::None,
107            deband_dither: DebandDither::Disabled,
108            main_texture_usages: Default::default(),
109            msaa: Default::default(),
110            sync: Default::default(),
111        }
112    }
113}