pub struct BinnedRenderPhase<BPI>where
BPI: BinnedPhaseItem,{
pub multidrawable_meshes: IndexMap<BPI::BatchSetKey, IndexMap<BPI::BinKey, RenderBin>>,
pub batchable_meshes: IndexMap<(BPI::BatchSetKey, BPI::BinKey), RenderBin>,
pub unbatchable_meshes: IndexMap<(BPI::BatchSetKey, BPI::BinKey), UnbatchableBinnedEntities>,
pub non_mesh_items: IndexMap<(BPI::BatchSetKey, BPI::BinKey), NonMeshEntities>,
/* private fields */
}
Expand description
A collection of all rendering instructions, that will be executed by the GPU, for a single render phase for a single view.
Each view (camera, or shadow-casting light, etc.) can have one or multiple render phases.
They are used to queue entities for rendering.
Multiple phases might be required due to different sorting/batching behaviors
(e.g. opaque: front to back, transparent: back to front) or because one phase depends on
the rendered texture of the previous phase (e.g. for screen-space reflections).
All PhaseItem
s are then rendered using a single TrackedRenderPass
.
The render pass might be reused for multiple phases to reduce GPU overhead.
This flavor of render phase is used for phases in which the ordering is less
critical: for example, Opaque3d
. It’s generally faster than the
alternative SortedRenderPhase
.
Fields§
§multidrawable_meshes: IndexMap<BPI::BatchSetKey, IndexMap<BPI::BinKey, RenderBin>>
The multidrawable bins.
Each batch set key maps to a batch set, which in this case is a set of meshes that can be drawn together in one multidraw call. Each batch set is subdivided into bins, each of which represents a particular mesh. Each bin contains the entity IDs of instances of that mesh.
So, for example, if there are two cubes and a sphere present in the scene, we would generally have one batch set containing two bins, assuming that the cubes and sphere meshes are allocated together and use the same pipeline. The first bin, corresponding to the cubes, will have two entities in it. The second bin, corresponding to the sphere, will have one entity in it.
batchable_meshes: IndexMap<(BPI::BatchSetKey, BPI::BinKey), RenderBin>
The bins corresponding to batchable items that aren’t multidrawable.
For multidrawable entities, use multidrawable_meshes
; for
unbatchable entities, use unbatchable_values
.
unbatchable_meshes: IndexMap<(BPI::BatchSetKey, BPI::BinKey), UnbatchableBinnedEntities>
The unbatchable bins.
Each entity here is rendered in a separate drawcall.
non_mesh_items: IndexMap<(BPI::BatchSetKey, BPI::BinKey), NonMeshEntities>
Items in the bin that aren’t meshes at all.
Bevy itself doesn’t place anything in this list, but plugins or your app can in order to execute custom drawing commands. Draw functions for each entity are simply called in order at rendering time.
See the custom_phase_item
example for an example of how to use this.
Implementations§
Source§impl<BPI> BinnedRenderPhase<BPI>where
BPI: BinnedPhaseItem,
impl<BPI> BinnedRenderPhase<BPI>where
BPI: BinnedPhaseItem,
Sourcepub fn add(
&mut self,
batch_set_key: BPI::BatchSetKey,
bin_key: BPI::BinKey,
(entity, main_entity): (Entity, MainEntity),
input_uniform_index: InputUniformIndex,
phase_type: BinnedRenderPhaseType,
change_tick: Tick,
)
pub fn add( &mut self, batch_set_key: BPI::BatchSetKey, bin_key: BPI::BinKey, (entity, main_entity): (Entity, MainEntity), input_uniform_index: InputUniformIndex, phase_type: BinnedRenderPhaseType, change_tick: Tick, )
Bins a new entity.
The phase_type
parameter specifies whether the entity is a
preprocessable mesh and whether it can be binned with meshes of the same
type.
Sourcepub fn update_cache(
&mut self,
main_entity: MainEntity,
cached_bin_key: Option<CachedBinKey<BPI>>,
change_tick: Tick,
)
pub fn update_cache( &mut self, main_entity: MainEntity, cached_bin_key: Option<CachedBinKey<BPI>>, change_tick: Tick, )
Inserts an entity into the cache with the given change tick.
Sourcepub fn render<'w>(
&self,
render_pass: &mut TrackedRenderPass<'w>,
world: &'w World,
view: Entity,
) -> Result<(), DrawError>
pub fn render<'w>( &self, render_pass: &mut TrackedRenderPass<'w>, world: &'w World, view: Entity, ) -> Result<(), DrawError>
Encodes the GPU commands needed to render all entities in this phase.
pub fn is_empty(&self) -> bool
pub fn prepare_for_new_frame(&mut self)
Sourcepub fn validate_cached_entity(
&mut self,
visible_entity: MainEntity,
current_change_tick: Tick,
) -> bool
pub fn validate_cached_entity( &mut self, visible_entity: MainEntity, current_change_tick: Tick, ) -> bool
Checks to see whether the entity is in a bin and returns true if it’s both in a bin and up to date.
If this function returns true, we also add the entry to the
valid_cached_entity_bin_keys
list.
Sourcepub fn sweep_old_entities(&mut self)
pub fn sweep_old_entities(&mut self)
Removes all entities not marked as clean from the bins.
During queue_material_meshes
, we process all visible entities and mark
each as clean as we come to it. Then, in sweep_old_entities
, we call
this method, which removes entities that aren’t marked as clean from the
bins.
Auto Trait Implementations§
impl<BPI> Freeze for BinnedRenderPhase<BPI>
impl<BPI> RefUnwindSafe for BinnedRenderPhase<BPI>where
<BPI as BinnedPhaseItem>::BinKey: RefUnwindSafe,
<BPI as BinnedPhaseItem>::BatchSetKey: RefUnwindSafe,
impl<BPI> Send for BinnedRenderPhase<BPI>
impl<BPI> Sync for BinnedRenderPhase<BPI>
impl<BPI> Unpin for BinnedRenderPhase<BPI>
impl<BPI> UnwindSafe for BinnedRenderPhase<BPI>where
<BPI as BinnedPhaseItem>::BinKey: UnwindSafe,
<BPI as BinnedPhaseItem>::BatchSetKey: UnwindSafe,
Blanket Implementations§
Source§impl<T, U> AsBindGroupShaderType<U> for T
impl<T, U> AsBindGroupShaderType<U> for T
Source§fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U
fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U
T
ShaderType
for self
. When used in AsBindGroup
derives, it is safe to assume that all images in self
exist.Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
, which can then be
downcast
into Box<dyn ConcreteType>
where ConcreteType
implements Trait
.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
, which can then be further
downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more