pub struct SortedRenderPhase<I>where
I: SortedPhaseItem,{
pub items: Vec<I>,
}Expand description
A collection of all items to be rendered that will be encoded to GPU commands 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 PhaseItems 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 only for meshes that need to be sorted
back-to-front, such as transparent meshes. For items that don’t need strict
sorting, BinnedRenderPhase is preferred, for performance.
Fields§
§items: Vec<I>The items within this SortedRenderPhase.
Implementations§
Source§impl<I> SortedRenderPhase<I>where
I: SortedPhaseItem,
impl<I> SortedRenderPhase<I>where
I: SortedPhaseItem,
Sourcepub fn add(&mut self, item: I)
pub fn add(&mut self, item: I)
Adds a PhaseItem to this render phase.
Examples found in repository?
124fn queue_custom(
125 transparent_3d_draw_functions: Res<DrawFunctions<Transparent3d>>,
126 custom_pipeline: Res<CustomPipeline>,
127 mut pipelines: ResMut<SpecializedMeshPipelines<CustomPipeline>>,
128 pipeline_cache: Res<PipelineCache>,
129 meshes: Res<RenderAssets<RenderMesh>>,
130 render_mesh_instances: Res<RenderMeshInstances>,
131 material_meshes: Query<(Entity, &MainEntity), With<InstanceMaterialData>>,
132 mut transparent_render_phases: ResMut<ViewSortedRenderPhases<Transparent3d>>,
133 views: Query<(&ExtractedView, &Msaa)>,
134) {
135 let draw_custom = transparent_3d_draw_functions.read().id::<DrawCustom>();
136
137 for (view, msaa) in &views {
138 let Some(transparent_phase) = transparent_render_phases.get_mut(&view.retained_view_entity)
139 else {
140 continue;
141 };
142
143 let msaa_key = MeshPipelineKey::from_msaa_samples(msaa.samples());
144
145 let view_key = msaa_key | MeshPipelineKey::from_hdr(view.hdr);
146 let rangefinder = view.rangefinder3d();
147 for (entity, main_entity) in &material_meshes {
148 let Some(mesh_instance) = render_mesh_instances.render_mesh_queue_data(*main_entity)
149 else {
150 continue;
151 };
152 let Some(mesh) = meshes.get(mesh_instance.mesh_asset_id) else {
153 continue;
154 };
155 let key =
156 view_key | MeshPipelineKey::from_primitive_topology(mesh.primitive_topology());
157 let pipeline = pipelines
158 .specialize(&pipeline_cache, &custom_pipeline, key, &mesh.layout)
159 .unwrap();
160 transparent_phase.add(Transparent3d {
161 entity: (entity, *main_entity),
162 pipeline,
163 draw_function: draw_custom,
164 distance: rangefinder.distance_translation(&mesh_instance.translation),
165 batch_range: 0..1,
166 extra_index: PhaseItemExtraIndex::None,
167 indexed: true,
168 });
169 }
170 }
171}More examples
377pub fn queue_colored_mesh2d(
378 transparent_draw_functions: Res<DrawFunctions<Transparent2d>>,
379 colored_mesh2d_pipeline: Res<ColoredMesh2dPipeline>,
380 mut pipelines: ResMut<SpecializedRenderPipelines<ColoredMesh2dPipeline>>,
381 pipeline_cache: Res<PipelineCache>,
382 render_meshes: Res<RenderAssets<RenderMesh>>,
383 render_mesh_instances: Res<RenderColoredMesh2dInstances>,
384 mut transparent_render_phases: ResMut<ViewSortedRenderPhases<Transparent2d>>,
385 views: Query<(&RenderVisibleEntities, &ExtractedView, &Msaa)>,
386) {
387 if render_mesh_instances.is_empty() {
388 return;
389 }
390 // Iterate each view (a camera is a view)
391 for (visible_entities, view, msaa) in &views {
392 let Some(transparent_phase) = transparent_render_phases.get_mut(&view.retained_view_entity)
393 else {
394 continue;
395 };
396
397 let draw_colored_mesh2d = transparent_draw_functions.read().id::<DrawColoredMesh2d>();
398
399 let mesh_key = Mesh2dPipelineKey::from_msaa_samples(msaa.samples())
400 | Mesh2dPipelineKey::from_hdr(view.hdr);
401
402 // Queue all entities visible to that view
403 for (render_entity, visible_entity) in visible_entities.iter::<Mesh2d>() {
404 if let Some(mesh_instance) = render_mesh_instances.get(visible_entity) {
405 let mesh2d_handle = mesh_instance.mesh_asset_id;
406 let mesh2d_transforms = &mesh_instance.transforms;
407 // Get our specialized pipeline
408 let mut mesh2d_key = mesh_key;
409 let Some(mesh) = render_meshes.get(mesh2d_handle) else {
410 continue;
411 };
412 mesh2d_key |= Mesh2dPipelineKey::from_primitive_topology(mesh.primitive_topology());
413
414 let pipeline_id =
415 pipelines.specialize(&pipeline_cache, &colored_mesh2d_pipeline, mesh2d_key);
416
417 let mesh_z = mesh2d_transforms.world_from_local.translation.z;
418 transparent_phase.add(Transparent2d {
419 entity: (*render_entity, *visible_entity),
420 draw_function: draw_colored_mesh2d,
421 pipeline: pipeline_id,
422 // The 2d render items are sorted according to their z value before rendering,
423 // in order to get correct transparency
424 sort_key: FloatOrd(mesh_z),
425 // This material is not batched
426 batch_range: 0..1,
427 extra_index: PhaseItemExtraIndex::None,
428 extracted_index: usize::MAX,
429 indexed: mesh.indexed(),
430 });
431 }
432 }
433 }
434}496fn queue_custom_meshes(
497 custom_draw_functions: Res<DrawFunctions<Stencil3d>>,
498 mut pipelines: ResMut<SpecializedMeshPipelines<StencilPipeline>>,
499 pipeline_cache: Res<PipelineCache>,
500 custom_draw_pipeline: Res<StencilPipeline>,
501 render_meshes: Res<RenderAssets<RenderMesh>>,
502 render_mesh_instances: Res<RenderMeshInstances>,
503 mut custom_render_phases: ResMut<ViewSortedRenderPhases<Stencil3d>>,
504 mut views: Query<(&ExtractedView, &RenderVisibleEntities, &Msaa)>,
505 has_marker: Query<(), With<DrawStencil>>,
506) {
507 for (view, visible_entities, msaa) in &mut views {
508 let Some(custom_phase) = custom_render_phases.get_mut(&view.retained_view_entity) else {
509 continue;
510 };
511 let draw_custom = custom_draw_functions.read().id::<DrawMesh3dStencil>();
512
513 // Create the key based on the view.
514 // In this case we only care about MSAA and HDR
515 let view_key = MeshPipelineKey::from_msaa_samples(msaa.samples())
516 | MeshPipelineKey::from_hdr(view.hdr);
517
518 let rangefinder = view.rangefinder3d();
519 // Since our phase can work on any 3d mesh we can reuse the default mesh 3d filter
520 for (render_entity, visible_entity) in visible_entities.iter::<Mesh3d>() {
521 // We only want meshes with the marker component to be queued to our phase.
522 if has_marker.get(*render_entity).is_err() {
523 continue;
524 }
525 let Some(mesh_instance) = render_mesh_instances.render_mesh_queue_data(*visible_entity)
526 else {
527 continue;
528 };
529 let Some(mesh) = render_meshes.get(mesh_instance.mesh_asset_id) else {
530 continue;
531 };
532
533 // Specialize the key for the current mesh entity
534 // For this example we only specialize based on the mesh topology
535 // but you could have more complex keys and that's where you'd need to create those keys
536 let mut mesh_key = view_key;
537 mesh_key |= MeshPipelineKey::from_primitive_topology(mesh.primitive_topology());
538
539 let pipeline_id = pipelines.specialize(
540 &pipeline_cache,
541 &custom_draw_pipeline,
542 mesh_key,
543 &mesh.layout,
544 );
545 let pipeline_id = match pipeline_id {
546 Ok(id) => id,
547 Err(err) => {
548 error!("{}", err);
549 continue;
550 }
551 };
552 let distance = rangefinder.distance_translation(&mesh_instance.translation);
553 // At this point we have all the data we need to create a phase item and add it to our
554 // phase
555 custom_phase.add(Stencil3d {
556 // Sort the data based on the distance to the view
557 sort_key: FloatOrd(distance),
558 entity: (*render_entity, *visible_entity),
559 pipeline: pipeline_id,
560 draw_function: draw_custom,
561 // Sorted phase items aren't batched
562 batch_range: 0..1,
563 extra_index: PhaseItemExtraIndex::None,
564 indexed: mesh.indexed(),
565 });
566 }
567 }
568}Sourcepub fn iter_entities(&self) -> impl Iterator<Item = Entity>
pub fn iter_entities(&self) -> impl Iterator<Item = Entity>
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>
Renders all of its PhaseItems using their corresponding draw functions.
Examples found in repository?
584 fn run<'w>(
585 &self,
586 graph: &mut RenderGraphContext,
587 render_context: &mut RenderContext<'w>,
588 (camera, view, target, resolution_override): QueryItem<'w, '_, Self::ViewQuery>,
589 world: &'w World,
590 ) -> Result<(), NodeRunError> {
591 // First, we need to get our phases resource
592 let Some(stencil_phases) = world.get_resource::<ViewSortedRenderPhases<Stencil3d>>() else {
593 return Ok(());
594 };
595
596 // Get the view entity from the graph
597 let view_entity = graph.view_entity();
598
599 // Get the phase for the current view running our node
600 let Some(stencil_phase) = stencil_phases.get(&view.retained_view_entity) else {
601 return Ok(());
602 };
603
604 // Render pass setup
605 let mut render_pass = render_context.begin_tracked_render_pass(RenderPassDescriptor {
606 label: Some("stencil pass"),
607 // For the purpose of the example, we will write directly to the view target. A real
608 // stencil pass would write to a custom texture and that texture would be used in later
609 // passes to render custom effects using it.
610 color_attachments: &[Some(target.get_color_attachment())],
611 // We don't bind any depth buffer for this pass
612 depth_stencil_attachment: None,
613 timestamp_writes: None,
614 occlusion_query_set: None,
615 });
616
617 if let Some(viewport) =
618 Viewport::from_viewport_and_override(camera.viewport.as_ref(), resolution_override)
619 {
620 render_pass.set_camera_viewport(&viewport);
621 }
622
623 // Render the phase
624 // This will execute each draw functions of each phase items queued in this phase
625 if let Err(err) = stencil_phase.render(&mut render_pass, world, view_entity) {
626 error!("Error encountered while rendering the stencil phase {err:?}");
627 }
628
629 Ok(())
630 }Sourcepub fn render_range<'w>(
&self,
render_pass: &mut TrackedRenderPass<'w>,
world: &'w World,
view: Entity,
range: impl SliceIndex<[I], Output = [I]>,
) -> Result<(), DrawError>
pub fn render_range<'w>( &self, render_pass: &mut TrackedRenderPass<'w>, world: &'w World, view: Entity, range: impl SliceIndex<[I], Output = [I]>, ) -> Result<(), DrawError>
Renders all PhaseItems in the provided range (based on their index in self.items) using their corresponding draw functions.
Trait Implementations§
Source§impl<I> Default for SortedRenderPhase<I>where
I: SortedPhaseItem,
impl<I> Default for SortedRenderPhase<I>where
I: SortedPhaseItem,
Source§fn default() -> SortedRenderPhase<I>
fn default() -> SortedRenderPhase<I>
Auto Trait Implementations§
impl<I> Freeze for SortedRenderPhase<I>
impl<I> RefUnwindSafe for SortedRenderPhase<I>where
I: RefUnwindSafe,
impl<I> Send for SortedRenderPhase<I>
impl<I> Sync for SortedRenderPhase<I>
impl<I> Unpin for SortedRenderPhase<I>where
I: Unpin,
impl<I> UnwindSafe for SortedRenderPhase<I>where
I: 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> 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>. Box<dyn Any> can
then be further downcast into Box<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>. Rc<Any> 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> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<S> FromSample<S> for S
impl<S> FromSample<S> for S
fn from_sample_(s: S) -> S
Source§impl<T> FromWorld for Twhere
T: Default,
impl<T> FromWorld for Twhere
T: Default,
Source§fn from_world(_world: &mut World) -> T
fn from_world(_world: &mut World) -> T
Creates Self using default().
Source§impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
Source§impl<T> Identity for Twhere
T: ?Sized,
impl<T> Identity for Twhere
T: ?Sized,
Source§impl<T> InitializeFromFunction<T> for T
impl<T> InitializeFromFunction<T> for T
Source§fn initialize_from_function(f: fn() -> T) -> T
fn initialize_from_function(f: fn() -> T) -> 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 moreSource§impl<T> IntoResult<T> for T
impl<T> IntoResult<T> for T
Source§fn into_result(self) -> Result<T, RunSystemError>
fn into_result(self) -> Result<T, RunSystemError>
Source§impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
fn into_sample(self) -> T
Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<R, P> ReadPrimitive<R> for P
impl<R, P> ReadPrimitive<R> for P
Source§fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
ReadEndian::read_from_little_endian().Source§impl<Ret> SpawnIfAsync<(), Ret> for Ret
impl<Ret> SpawnIfAsync<(), Ret> for Ret
Source§impl<T, O> SuperFrom<T> for Owhere
O: From<T>,
impl<T, O> SuperFrom<T> for Owhere
O: From<T>,
Source§fn super_from(input: T) -> O
fn super_from(input: T) -> O
Source§impl<T, O, M> SuperInto<O, M> for Twhere
O: SuperFrom<T, M>,
impl<T, O, M> SuperInto<O, M> for Twhere
O: SuperFrom<T, M>,
Source§fn super_into(self) -> O
fn super_into(self) -> O
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.