bevy_core_pipeline/deferred/
mod.rs

1pub mod copy_lighting_id;
2pub mod node;
3
4use core::ops::Range;
5
6use crate::prepass::OpaqueNoLightmap3dBinKey;
7use bevy_ecs::prelude::*;
8use bevy_render::sync_world::MainEntity;
9use bevy_render::{
10    render_phase::{
11        BinnedPhaseItem, CachedRenderPipelinePhaseItem, DrawFunctionId, PhaseItem,
12        PhaseItemExtraIndex,
13    },
14    render_resource::{CachedRenderPipelineId, TextureFormat},
15};
16
17pub const DEFERRED_PREPASS_FORMAT: TextureFormat = TextureFormat::Rgba32Uint;
18pub const DEFERRED_LIGHTING_PASS_ID_FORMAT: TextureFormat = TextureFormat::R8Uint;
19pub const DEFERRED_LIGHTING_PASS_ID_DEPTH_FORMAT: TextureFormat = TextureFormat::Depth16Unorm;
20
21/// Opaque phase of the 3D Deferred pass.
22///
23/// Sorted by pipeline, then by mesh to improve batching.
24///
25/// Used to render all 3D meshes with materials that have no transparency.
26#[derive(PartialEq, Eq, Hash)]
27pub struct Opaque3dDeferred {
28    pub key: OpaqueNoLightmap3dBinKey,
29    pub representative_entity: (Entity, MainEntity),
30    pub batch_range: Range<u32>,
31    pub extra_index: PhaseItemExtraIndex,
32}
33
34impl PhaseItem for Opaque3dDeferred {
35    #[inline]
36    fn entity(&self) -> Entity {
37        self.representative_entity.0
38    }
39
40    fn main_entity(&self) -> MainEntity {
41        self.representative_entity.1
42    }
43
44    #[inline]
45    fn draw_function(&self) -> DrawFunctionId {
46        self.key.draw_function
47    }
48
49    #[inline]
50    fn batch_range(&self) -> &Range<u32> {
51        &self.batch_range
52    }
53
54    #[inline]
55    fn batch_range_mut(&mut self) -> &mut Range<u32> {
56        &mut self.batch_range
57    }
58
59    #[inline]
60    fn extra_index(&self) -> PhaseItemExtraIndex {
61        self.extra_index
62    }
63
64    #[inline]
65    fn batch_range_and_extra_index_mut(&mut self) -> (&mut Range<u32>, &mut PhaseItemExtraIndex) {
66        (&mut self.batch_range, &mut self.extra_index)
67    }
68}
69
70impl BinnedPhaseItem for Opaque3dDeferred {
71    type BinKey = OpaqueNoLightmap3dBinKey;
72
73    #[inline]
74    fn new(
75        key: Self::BinKey,
76        representative_entity: (Entity, MainEntity),
77        batch_range: Range<u32>,
78        extra_index: PhaseItemExtraIndex,
79    ) -> Self {
80        Self {
81            key,
82            representative_entity,
83            batch_range,
84            extra_index,
85        }
86    }
87}
88
89impl CachedRenderPipelinePhaseItem for Opaque3dDeferred {
90    #[inline]
91    fn cached_pipeline(&self) -> CachedRenderPipelineId {
92        self.key.pipeline
93    }
94}
95
96/// Alpha mask phase of the 3D Deferred pass.
97///
98/// Sorted by pipeline, then by mesh to improve batching.
99///
100/// Used to render all meshes with a material with an alpha mask.
101pub struct AlphaMask3dDeferred {
102    pub key: OpaqueNoLightmap3dBinKey,
103    pub representative_entity: (Entity, MainEntity),
104    pub batch_range: Range<u32>,
105    pub extra_index: PhaseItemExtraIndex,
106}
107
108impl PhaseItem for AlphaMask3dDeferred {
109    #[inline]
110    fn entity(&self) -> Entity {
111        self.representative_entity.0
112    }
113
114    #[inline]
115    fn main_entity(&self) -> MainEntity {
116        self.representative_entity.1
117    }
118
119    #[inline]
120    fn draw_function(&self) -> DrawFunctionId {
121        self.key.draw_function
122    }
123
124    #[inline]
125    fn batch_range(&self) -> &Range<u32> {
126        &self.batch_range
127    }
128
129    #[inline]
130    fn batch_range_mut(&mut self) -> &mut Range<u32> {
131        &mut self.batch_range
132    }
133
134    #[inline]
135    fn extra_index(&self) -> PhaseItemExtraIndex {
136        self.extra_index
137    }
138
139    #[inline]
140    fn batch_range_and_extra_index_mut(&mut self) -> (&mut Range<u32>, &mut PhaseItemExtraIndex) {
141        (&mut self.batch_range, &mut self.extra_index)
142    }
143}
144
145impl BinnedPhaseItem for AlphaMask3dDeferred {
146    type BinKey = OpaqueNoLightmap3dBinKey;
147
148    fn new(
149        key: Self::BinKey,
150        representative_entity: (Entity, MainEntity),
151        batch_range: Range<u32>,
152        extra_index: PhaseItemExtraIndex,
153    ) -> Self {
154        Self {
155            key,
156            representative_entity,
157            batch_range,
158            extra_index,
159        }
160    }
161}
162
163impl CachedRenderPipelinePhaseItem for AlphaMask3dDeferred {
164    #[inline]
165    fn cached_pipeline(&self) -> CachedRenderPipelineId {
166        self.key.pipeline
167    }
168}