pub struct SortedRenderPhase<I>where
I: SortedPhaseItem,{
pub items: IndexMap<(Entity, MainEntity), I, EntityHash>,
pub transient_items: Vec<(Entity, MainEntity)>,
}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: IndexMap<(Entity, MainEntity), I, EntityHash>The items within this SortedRenderPhase.
transient_items: Vec<(Entity, MainEntity)>Items within this render phase that will be automatically removed after this frame.
Implementations§
Source§impl<I> SortedRenderPhase<I>where
I: SortedPhaseItem,
impl<I> SortedRenderPhase<I>where
I: SortedPhaseItem,
Sourcepub fn add_retained(&mut self, item: I)
pub fn add_retained(&mut self, item: I)
Adds a PhaseItem to this render phase, which will persist between
frames until removed.
Examples found in repository?
137fn queue_custom(
138 transparent_3d_draw_functions: Res<DrawFunctions<Transparent3d>>,
139 custom_pipeline: Res<CustomPipeline>,
140 mut pipelines: ResMut<SpecializedMeshPipelines<CustomPipeline>>,
141 pipeline_cache: Res<PipelineCache>,
142 meshes: Res<RenderAssets<RenderMesh>>,
143 render_mesh_instances: Res<RenderMeshInstances>,
144 maybe_batched_instance_buffers: Option<
145 Res<BatchedInstanceBuffers<MeshUniform, MeshInputUniform>>,
146 >,
147 material_meshes: Query<(Entity, &MainEntity), With<InstanceMaterialData>>,
148 mut transparent_render_phases: ResMut<ViewSortedRenderPhases<Transparent3d>>,
149 views: Query<&ExtractedView>,
150 view_key_cache: Res<ViewKeyCache>,
151) {
152 let draw_custom = transparent_3d_draw_functions.read().id::<DrawCustom>();
153
154 for view in &views {
155 let Some(transparent_phase) = transparent_render_phases.get_mut(&view.retained_view_entity)
156 else {
157 continue;
158 };
159
160 let Some(&view_key) = view_key_cache.get(&view.retained_view_entity) else {
161 continue;
162 };
163
164 for (entity, main_entity) in &material_meshes {
165 let Some(mesh_instance) = render_mesh_instances.render_mesh_queue_data(*main_entity)
166 else {
167 continue;
168 };
169 let Some(mesh) = meshes.get(mesh_instance.mesh_asset_id()) else {
170 continue;
171 };
172 let key = view_key
173 | MeshPipelineKey::from_primitive_topology_and_strip_index(
174 mesh.primitive_topology(),
175 mesh.index_format(),
176 );
177 let pipeline = pipelines
178 .specialize(&pipeline_cache, &custom_pipeline, key, &mesh.layout)
179 .unwrap();
180 transparent_phase.add_retained(Transparent3d {
181 sorting_info: TransparentSortingInfo3d::Sorted {
182 mesh_center: pbr::get_mesh_instance_world_from_local(
183 *main_entity,
184 mesh_instance.current_uniform_index,
185 &render_mesh_instances,
186 maybe_batched_instance_buffers.as_deref(),
187 )
188 .transform_point3(
189 meshes
190 .get(mesh_instance.mesh_asset_id())
191 .unwrap()
192 .aabb_center,
193 ),
194 depth_bias: 0.0,
195 },
196 entity: (entity, *main_entity),
197 pipeline,
198 draw_function: draw_custom,
199 distance: 0.0,
200 batch_range: 0..1,
201 extra_index: PhaseItemExtraIndex::None,
202 indexed: true,
203 });
204 }
205 }
206}More examples
379pub fn queue_colored_mesh2d(
380 transparent_draw_functions: Res<DrawFunctions<Transparent2d>>,
381 colored_mesh2d_pipeline: Res<ColoredMesh2dPipeline>,
382 mut pipelines: ResMut<SpecializedRenderPipelines<ColoredMesh2dPipeline>>,
383 pipeline_cache: Res<PipelineCache>,
384 render_meshes: Res<RenderAssets<RenderMesh>>,
385 render_mesh_instances: Res<RenderColoredMesh2dInstances>,
386 mut transparent_render_phases: ResMut<ViewSortedRenderPhases<Transparent2d>>,
387 views: Query<(&RenderVisibleEntities, &ExtractedView, &Msaa)>,
388) {
389 if render_mesh_instances.is_empty() {
390 return;
391 }
392 // Iterate each view (a camera is a view)
393 for (visible_entities, view, msaa) in &views {
394 let Some(transparent_phase) = transparent_render_phases.get_mut(&view.retained_view_entity)
395 else {
396 continue;
397 };
398
399 let draw_colored_mesh2d = transparent_draw_functions.read().id::<DrawColoredMesh2d>();
400
401 let mesh_key = Mesh2dPipelineKey::from_msaa_samples(msaa.samples())
402 | Mesh2dPipelineKey::from_target_format(view.target_format);
403
404 // Queue all entities visible to that view
405 let Some(visible_entities) = visible_entities.get::<Mesh2d>() else {
406 continue;
407 };
408 for (render_entity, visible_entity) in visible_entities.iter_visible() {
409 if let Some(mesh_instance) = render_mesh_instances.get(visible_entity) {
410 let mesh2d_handle = mesh_instance.mesh_asset_id;
411 let mesh2d_transforms = &mesh_instance.transforms;
412 // Get our specialized pipeline
413 let mut mesh2d_key = mesh_key;
414 let Some(mesh) = render_meshes.get(mesh2d_handle) else {
415 continue;
416 };
417 mesh2d_key |= Mesh2dPipelineKey::from_primitive_topology_and_strip_index(
418 mesh.primitive_topology(),
419 mesh.index_format(),
420 );
421
422 let pipeline_id =
423 pipelines.specialize(&pipeline_cache, &colored_mesh2d_pipeline, mesh2d_key);
424
425 let mesh_z = mesh2d_transforms.world_from_local.translation.z;
426 transparent_phase.add_retained(Transparent2d {
427 entity: (*render_entity, *visible_entity),
428 draw_function: draw_colored_mesh2d,
429 pipeline: pipeline_id,
430 // The 2d render items are sorted according to their z value before rendering,
431 // in order to get correct transparency
432 sort_key: FloatOrd(mesh_z),
433 // This material is not batched
434 batch_range: 0..1,
435 extra_index: PhaseItemExtraIndex::None,
436 extracted_index: usize::MAX,
437 indexed: mesh.indexed(),
438 });
439 }
440 }
441 }
442}531fn queue_custom_meshes(
532 custom_draw_functions: Res<DrawFunctions<Stencil3d>>,
533 mut pipelines: ResMut<SpecializedMeshPipelines<StencilPipeline>>,
534 pipeline_cache: Res<PipelineCache>,
535 custom_draw_pipeline: Res<StencilPipeline>,
536 render_meshes: Res<RenderAssets<RenderMesh>>,
537 render_mesh_instances: Res<RenderMeshInstances>,
538 maybe_batched_instance_buffers: Option<
539 Res<BatchedInstanceBuffers<MeshUniform, MeshInputUniform>>,
540 >,
541 mut custom_render_phases: ResMut<ViewSortedRenderPhases<Stencil3d>>,
542 mut views: Query<(&ExtractedView, &RenderVisibleEntities)>,
543 view_key_cache: Res<ViewKeyCache>,
544 dirty_specializations: Res<DirtySpecializations>,
545 mut pending_custom_mesh_queues: ResMut<PendingCustomMeshQueues>,
546 has_marker: Query<(), With<DrawStencil>>,
547) {
548 for (view, visible_entities) in &mut views {
549 let Some(custom_phase) = custom_render_phases.get_mut(&view.retained_view_entity) else {
550 continue;
551 };
552 let draw_custom = custom_draw_functions.read().id::<DrawMesh3dStencil>();
553
554 let Some(&view_key) = view_key_cache.get(&view.retained_view_entity) else {
555 continue;
556 };
557
558 // Since our phase can work on any 3d mesh we can reuse the default mesh 3d filter
559 let Some(render_visible_mesh_entities) = visible_entities.get::<Mesh3d>() else {
560 continue;
561 };
562
563 let view_pending_custom_mesh_queues =
564 pending_custom_mesh_queues.prepare_for_new_frame(view.retained_view_entity);
565
566 // First, remove meshes that need to be respecialized, and those that were removed, from the bins.
567 for &main_entity in dirty_specializations
568 .iter_to_dequeue(view.retained_view_entity, render_visible_mesh_entities)
569 {
570 custom_phase.remove(Entity::PLACEHOLDER, main_entity);
571 }
572
573 for (render_entity, visible_entity) in dirty_specializations.iter_to_queue(
574 view.retained_view_entity,
575 render_visible_mesh_entities,
576 &view_pending_custom_mesh_queues.prev_frame,
577 ) {
578 // We only want meshes with the marker component to be queued to our phase.
579 if has_marker.get(*render_entity).is_err() {
580 continue;
581 }
582 let Some(mesh_instance) = render_mesh_instances.render_mesh_queue_data(*visible_entity)
583 else {
584 // We couldn't fetch the mesh, probably because it hasn't been
585 // loaded yet. Add the entity to the list of pending custom mesh
586 // queues and bail.
587 view_pending_custom_mesh_queues
588 .current_frame
589 .insert((*render_entity, *visible_entity));
590 continue;
591 };
592 let Some(mesh) = render_meshes.get(mesh_instance.mesh_asset_id()) else {
593 continue;
594 };
595
596 // Specialize the key for the current mesh entity
597 // For this example we only specialize based on the mesh topology
598 // but you could have more complex keys and that's where you'd need to create those keys
599 let mut mesh_key = view_key;
600 mesh_key |= MeshPipelineKey::from_primitive_topology_and_strip_index(
601 mesh.primitive_topology(),
602 mesh.index_format(),
603 );
604
605 let pipeline_id = pipelines.specialize(
606 &pipeline_cache,
607 &custom_draw_pipeline,
608 mesh_key,
609 &mesh.layout,
610 );
611 let pipeline_id = match pipeline_id {
612 Ok(id) => id,
613 Err(err) => {
614 error!("{}", err);
615 continue;
616 }
617 };
618 // At this point we have all the data we need to create a phase item and add it to our
619 // phase
620 custom_phase.add_retained(Stencil3d {
621 sorting_info: TransparentSortingInfo3d::Sorted {
622 mesh_center: pbr::get_mesh_instance_world_from_local(
623 *visible_entity,
624 mesh_instance.current_uniform_index,
625 &render_mesh_instances,
626 maybe_batched_instance_buffers.as_deref(),
627 )
628 .transform_point3(
629 render_meshes
630 .get(mesh_instance.mesh_asset_id())
631 .unwrap()
632 .aabb_center,
633 ),
634 depth_bias: 0.0,
635 },
636 distance: FloatOrd(0.0),
637 entity: (Entity::PLACEHOLDER, *visible_entity),
638 pipeline: pipeline_id,
639 draw_function: draw_custom,
640 // Sorted phase items aren't batched
641 batch_range: 0..1,
642 extra_index: PhaseItemExtraIndex::None,
643 indexed: mesh.indexed(),
644 });
645 }
646 }
647}Sourcepub fn add_transient(&mut self, item: I)
pub fn add_transient(&mut self, item: I)
Adds a PhaseItem to this render phase, which will be automatically
removed after this frame.
Sourcepub fn remove(&mut self, render_entity: Entity, main_entity: MainEntity)
pub fn remove(&mut self, render_entity: Entity, main_entity: MainEntity)
Removes the PhaseItem corresponding to the given main-world entity
from this render phase.
Examples found in repository?
531fn queue_custom_meshes(
532 custom_draw_functions: Res<DrawFunctions<Stencil3d>>,
533 mut pipelines: ResMut<SpecializedMeshPipelines<StencilPipeline>>,
534 pipeline_cache: Res<PipelineCache>,
535 custom_draw_pipeline: Res<StencilPipeline>,
536 render_meshes: Res<RenderAssets<RenderMesh>>,
537 render_mesh_instances: Res<RenderMeshInstances>,
538 maybe_batched_instance_buffers: Option<
539 Res<BatchedInstanceBuffers<MeshUniform, MeshInputUniform>>,
540 >,
541 mut custom_render_phases: ResMut<ViewSortedRenderPhases<Stencil3d>>,
542 mut views: Query<(&ExtractedView, &RenderVisibleEntities)>,
543 view_key_cache: Res<ViewKeyCache>,
544 dirty_specializations: Res<DirtySpecializations>,
545 mut pending_custom_mesh_queues: ResMut<PendingCustomMeshQueues>,
546 has_marker: Query<(), With<DrawStencil>>,
547) {
548 for (view, visible_entities) in &mut views {
549 let Some(custom_phase) = custom_render_phases.get_mut(&view.retained_view_entity) else {
550 continue;
551 };
552 let draw_custom = custom_draw_functions.read().id::<DrawMesh3dStencil>();
553
554 let Some(&view_key) = view_key_cache.get(&view.retained_view_entity) else {
555 continue;
556 };
557
558 // Since our phase can work on any 3d mesh we can reuse the default mesh 3d filter
559 let Some(render_visible_mesh_entities) = visible_entities.get::<Mesh3d>() else {
560 continue;
561 };
562
563 let view_pending_custom_mesh_queues =
564 pending_custom_mesh_queues.prepare_for_new_frame(view.retained_view_entity);
565
566 // First, remove meshes that need to be respecialized, and those that were removed, from the bins.
567 for &main_entity in dirty_specializations
568 .iter_to_dequeue(view.retained_view_entity, render_visible_mesh_entities)
569 {
570 custom_phase.remove(Entity::PLACEHOLDER, main_entity);
571 }
572
573 for (render_entity, visible_entity) in dirty_specializations.iter_to_queue(
574 view.retained_view_entity,
575 render_visible_mesh_entities,
576 &view_pending_custom_mesh_queues.prev_frame,
577 ) {
578 // We only want meshes with the marker component to be queued to our phase.
579 if has_marker.get(*render_entity).is_err() {
580 continue;
581 }
582 let Some(mesh_instance) = render_mesh_instances.render_mesh_queue_data(*visible_entity)
583 else {
584 // We couldn't fetch the mesh, probably because it hasn't been
585 // loaded yet. Add the entity to the list of pending custom mesh
586 // queues and bail.
587 view_pending_custom_mesh_queues
588 .current_frame
589 .insert((*render_entity, *visible_entity));
590 continue;
591 };
592 let Some(mesh) = render_meshes.get(mesh_instance.mesh_asset_id()) else {
593 continue;
594 };
595
596 // Specialize the key for the current mesh entity
597 // For this example we only specialize based on the mesh topology
598 // but you could have more complex keys and that's where you'd need to create those keys
599 let mut mesh_key = view_key;
600 mesh_key |= MeshPipelineKey::from_primitive_topology_and_strip_index(
601 mesh.primitive_topology(),
602 mesh.index_format(),
603 );
604
605 let pipeline_id = pipelines.specialize(
606 &pipeline_cache,
607 &custom_draw_pipeline,
608 mesh_key,
609 &mesh.layout,
610 );
611 let pipeline_id = match pipeline_id {
612 Ok(id) => id,
613 Err(err) => {
614 error!("{}", err);
615 continue;
616 }
617 };
618 // At this point we have all the data we need to create a phase item and add it to our
619 // phase
620 custom_phase.add_retained(Stencil3d {
621 sorting_info: TransparentSortingInfo3d::Sorted {
622 mesh_center: pbr::get_mesh_instance_world_from_local(
623 *visible_entity,
624 mesh_instance.current_uniform_index,
625 &render_mesh_instances,
626 maybe_batched_instance_buffers.as_deref(),
627 )
628 .transform_point3(
629 render_meshes
630 .get(mesh_instance.mesh_asset_id())
631 .unwrap()
632 .aabb_center,
633 ),
634 depth_bias: 0.0,
635 },
636 distance: FloatOrd(0.0),
637 entity: (Entity::PLACEHOLDER, *visible_entity),
638 pipeline: pipeline_id,
639 draw_function: draw_custom,
640 // Sorted phase items aren't batched
641 batch_range: 0..1,
642 extra_index: PhaseItemExtraIndex::None,
643 indexed: mesh.indexed(),
644 });
645 }
646 }
647}Sourcepub fn recalculate_sort_keys(&mut self, view: &ExtractedView)
pub fn recalculate_sort_keys(&mut self, view: &ExtractedView)
Populates whatever internal fields are necessary in order to perform the sort.
For example, for transparent 3D phases, this calculates the distance from each object to the view.
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?
649fn custom_draw_system(
650 world: &World,
651 view: ViewQuery<(
652 &ExtractedCamera,
653 &ExtractedView,
654 &ViewTarget,
655 Option<&MainPassResolutionOverride>,
656 )>,
657 stencil_phases: Res<ViewSortedRenderPhases<Stencil3d>>,
658 mut ctx: RenderContext,
659) {
660 let view_entity = view.entity();
661 let (camera, extracted_view, target, resolution_override) = view.into_inner();
662
663 let Some(stencil_phase) = stencil_phases.get(&extracted_view.retained_view_entity) else {
664 return;
665 };
666
667 let mut render_pass = ctx.begin_tracked_render_pass(RenderPassDescriptor {
668 label: Some("stencil pass"),
669 // For the purpose of the example, we will write directly to the view target. A real
670 // stencil pass would write to a custom texture and that texture would be used in later
671 // passes to render custom effects using it.
672 color_attachments: &[Some(target.get_color_attachment())],
673 // We don't bind any depth buffer for this pass
674 depth_stencil_attachment: None,
675 timestamp_writes: None,
676 occlusion_query_set: None,
677 multiview_mask: None,
678 });
679
680 if let Some(viewport) =
681 Viewport::from_viewport_and_override(camera.viewport.as_ref(), resolution_override)
682 {
683 render_pass.set_camera_viewport(&viewport);
684 }
685
686 if let Err(err) = stencil_phase.render(&mut render_pass, world, view_entity) {
687 error!("Error encountered while rendering the stencil phase {err:?}");
688 }
689}Sourcepub fn render_range<'w>(
&self,
render_pass: &mut TrackedRenderPass<'w>,
world: &'w World,
view: Entity,
range: impl RangeBounds<usize>,
) -> Result<(), DrawError>
pub fn render_range<'w>( &self, render_pass: &mut TrackedRenderPass<'w>, world: &'w World, view: Entity, range: impl RangeBounds<usize>, ) -> 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> UnsafeUnpin for SortedRenderPhase<I>
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
impl<T> ConditionalSend for Twhere
T: Send,
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
impl<S, T> Duplex<S> for Twhere
T: FromSample<S> + ToSample<S>,
impl<T> ErasedDestructor for Twhere
T: 'static,
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.impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
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().impl<T> Settings for T
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.