pub struct DrawFunctions<P>where
P: PhaseItem,{ /* private fields */ }
Expand description
Stores all draw functions for the PhaseItem
type hidden behind a reader-writer lock.
To access them the DrawFunctions::read
and DrawFunctions::write
methods are used.
Implementations§
Source§impl<P> DrawFunctions<P>where
P: PhaseItem,
impl<P> DrawFunctions<P>where
P: PhaseItem,
Sourcepub fn read(&self) -> RwLockReadGuard<'_, DrawFunctionsInternal<P>>
pub fn read(&self) -> RwLockReadGuard<'_, DrawFunctionsInternal<P>>
Accesses the draw functions in read mode.
Examples found in repository?
examples/shader/custom_shader_instancing.rs (line 137)
126fn queue_custom(
127 transparent_3d_draw_functions: Res<DrawFunctions<Transparent3d>>,
128 custom_pipeline: Res<CustomPipeline>,
129 mut pipelines: ResMut<SpecializedMeshPipelines<CustomPipeline>>,
130 pipeline_cache: Res<PipelineCache>,
131 meshes: Res<RenderAssets<RenderMesh>>,
132 render_mesh_instances: Res<RenderMeshInstances>,
133 material_meshes: Query<(Entity, &MainEntity), With<InstanceMaterialData>>,
134 mut transparent_render_phases: ResMut<ViewSortedRenderPhases<Transparent3d>>,
135 views: Query<(&ExtractedView, &Msaa)>,
136) {
137 let draw_custom = transparent_3d_draw_functions.read().id::<DrawCustom>();
138
139 for (view, msaa) in &views {
140 let Some(transparent_phase) = transparent_render_phases.get_mut(&view.retained_view_entity)
141 else {
142 continue;
143 };
144
145 let msaa_key = MeshPipelineKey::from_msaa_samples(msaa.samples());
146
147 let view_key = msaa_key | MeshPipelineKey::from_hdr(view.hdr);
148 let rangefinder = view.rangefinder3d();
149 for (entity, main_entity) in &material_meshes {
150 let Some(mesh_instance) = render_mesh_instances.render_mesh_queue_data(*main_entity)
151 else {
152 continue;
153 };
154 let Some(mesh) = meshes.get(mesh_instance.mesh_asset_id) else {
155 continue;
156 };
157 let key =
158 view_key | MeshPipelineKey::from_primitive_topology(mesh.primitive_topology());
159 let pipeline = pipelines
160 .specialize(&pipeline_cache, &custom_pipeline, key, &mesh.layout)
161 .unwrap();
162 transparent_phase.add(Transparent3d {
163 entity: (entity, *main_entity),
164 pipeline,
165 draw_function: draw_custom,
166 distance: rangefinder.distance_translation(&mesh_instance.translation),
167 batch_range: 0..1,
168 extra_index: PhaseItemExtraIndex::None,
169 indexed: true,
170 });
171 }
172 }
173}
More examples
examples/2d/mesh2d_manual.rs (line 395)
375pub fn queue_colored_mesh2d(
376 transparent_draw_functions: Res<DrawFunctions<Transparent2d>>,
377 colored_mesh2d_pipeline: Res<ColoredMesh2dPipeline>,
378 mut pipelines: ResMut<SpecializedRenderPipelines<ColoredMesh2dPipeline>>,
379 pipeline_cache: Res<PipelineCache>,
380 render_meshes: Res<RenderAssets<RenderMesh>>,
381 render_mesh_instances: Res<RenderColoredMesh2dInstances>,
382 mut transparent_render_phases: ResMut<ViewSortedRenderPhases<Transparent2d>>,
383 views: Query<(&RenderVisibleEntities, &ExtractedView, &Msaa)>,
384) {
385 if render_mesh_instances.is_empty() {
386 return;
387 }
388 // Iterate each view (a camera is a view)
389 for (visible_entities, view, msaa) in &views {
390 let Some(transparent_phase) = transparent_render_phases.get_mut(&view.retained_view_entity)
391 else {
392 continue;
393 };
394
395 let draw_colored_mesh2d = transparent_draw_functions.read().id::<DrawColoredMesh2d>();
396
397 let mesh_key = Mesh2dPipelineKey::from_msaa_samples(msaa.samples())
398 | Mesh2dPipelineKey::from_hdr(view.hdr);
399
400 // Queue all entities visible to that view
401 for (render_entity, visible_entity) in visible_entities.iter::<Mesh2d>() {
402 if let Some(mesh_instance) = render_mesh_instances.get(visible_entity) {
403 let mesh2d_handle = mesh_instance.mesh_asset_id;
404 let mesh2d_transforms = &mesh_instance.transforms;
405 // Get our specialized pipeline
406 let mut mesh2d_key = mesh_key;
407 let Some(mesh) = render_meshes.get(mesh2d_handle) else {
408 continue;
409 };
410 mesh2d_key |= Mesh2dPipelineKey::from_primitive_topology(mesh.primitive_topology());
411
412 let pipeline_id =
413 pipelines.specialize(&pipeline_cache, &colored_mesh2d_pipeline, mesh2d_key);
414
415 let mesh_z = mesh2d_transforms.world_from_local.translation.z;
416 transparent_phase.add(Transparent2d {
417 entity: (*render_entity, *visible_entity),
418 draw_function: draw_colored_mesh2d,
419 pipeline: pipeline_id,
420 // The 2d render items are sorted according to their z value before rendering,
421 // in order to get correct transparency
422 sort_key: FloatOrd(mesh_z),
423 // This material is not batched
424 batch_range: 0..1,
425 extra_index: PhaseItemExtraIndex::None,
426 extracted_index: usize::MAX,
427 indexed: mesh.indexed(),
428 });
429 }
430 }
431 }
432}
examples/shader/custom_phase_item.rs (line 232)
222fn queue_custom_phase_item(
223 pipeline_cache: Res<PipelineCache>,
224 custom_phase_pipeline: Res<CustomPhasePipeline>,
225 mut opaque_render_phases: ResMut<ViewBinnedRenderPhases<Opaque3d>>,
226 opaque_draw_functions: Res<DrawFunctions<Opaque3d>>,
227 mut specialized_render_pipelines: ResMut<SpecializedRenderPipelines<CustomPhasePipeline>>,
228 views: Query<(&ExtractedView, &RenderVisibleEntities, &Msaa)>,
229 mut next_tick: Local<Tick>,
230) {
231 let draw_custom_phase_item = opaque_draw_functions
232 .read()
233 .id::<DrawCustomPhaseItemCommands>();
234
235 // Render phases are per-view, so we need to iterate over all views so that
236 // the entity appears in them. (In this example, we have only one view, but
237 // it's good practice to loop over all views anyway.)
238 for (view, view_visible_entities, msaa) in views.iter() {
239 let Some(opaque_phase) = opaque_render_phases.get_mut(&view.retained_view_entity) else {
240 continue;
241 };
242
243 // Find all the custom rendered entities that are visible from this
244 // view.
245 for &entity in view_visible_entities.get::<CustomRenderedEntity>().iter() {
246 // Ordinarily, the [`SpecializedRenderPipeline::Key`] would contain
247 // some per-view settings, such as whether the view is HDR, but for
248 // simplicity's sake we simply hard-code the view's characteristics,
249 // with the exception of number of MSAA samples.
250 let pipeline_id = specialized_render_pipelines.specialize(
251 &pipeline_cache,
252 &custom_phase_pipeline,
253 *msaa,
254 );
255
256 // Bump the change tick in order to force Bevy to rebuild the bin.
257 let this_tick = next_tick.get() + 1;
258 next_tick.set(this_tick);
259
260 // Add the custom render item. We use the
261 // [`BinnedRenderPhaseType::NonMesh`] type to skip the special
262 // handling that Bevy has for meshes (preprocessing, indirect
263 // draws, etc.)
264 //
265 // The asset ID is arbitrary; we simply use [`AssetId::invalid`],
266 // but you can use anything you like. Note that the asset ID need
267 // not be the ID of a [`Mesh`].
268 opaque_phase.add(
269 Opaque3dBatchSetKey {
270 draw_function: draw_custom_phase_item,
271 pipeline: pipeline_id,
272 material_bind_group_index: None,
273 lightmap_slab: None,
274 vertex_slab: default(),
275 index_slab: None,
276 },
277 Opaque3dBinKey {
278 asset_id: AssetId::<Mesh>::invalid().untyped(),
279 },
280 entity,
281 InputUniformIndex::default(),
282 BinnedRenderPhaseType::NonMesh,
283 *next_tick,
284 );
285 }
286 }
287}
examples/shader/custom_render_phase.rs (line 515)
500fn queue_custom_meshes(
501 custom_draw_functions: Res<DrawFunctions<Stencil3d>>,
502 mut pipelines: ResMut<SpecializedMeshPipelines<StencilPipeline>>,
503 pipeline_cache: Res<PipelineCache>,
504 custom_draw_pipeline: Res<StencilPipeline>,
505 render_meshes: Res<RenderAssets<RenderMesh>>,
506 render_mesh_instances: Res<RenderMeshInstances>,
507 mut custom_render_phases: ResMut<ViewSortedRenderPhases<Stencil3d>>,
508 mut views: Query<(&ExtractedView, &RenderVisibleEntities, &Msaa)>,
509 has_marker: Query<(), With<DrawStencil>>,
510) {
511 for (view, visible_entities, msaa) in &mut views {
512 let Some(custom_phase) = custom_render_phases.get_mut(&view.retained_view_entity) else {
513 continue;
514 };
515 let draw_custom = custom_draw_functions.read().id::<DrawMesh3dStencil>();
516
517 // Create the key based on the view.
518 // In this case we only care about MSAA and HDR
519 let view_key = MeshPipelineKey::from_msaa_samples(msaa.samples())
520 | MeshPipelineKey::from_hdr(view.hdr);
521
522 let rangefinder = view.rangefinder3d();
523 // Since our phase can work on any 3d mesh we can reuse the default mesh 3d filter
524 for (render_entity, visible_entity) in visible_entities.iter::<Mesh3d>() {
525 // We only want meshes with the marker component to be queued to our phase.
526 if has_marker.get(*render_entity).is_err() {
527 continue;
528 }
529 let Some(mesh_instance) = render_mesh_instances.render_mesh_queue_data(*visible_entity)
530 else {
531 continue;
532 };
533 let Some(mesh) = render_meshes.get(mesh_instance.mesh_asset_id) else {
534 continue;
535 };
536
537 // Specialize the key for the current mesh entity
538 // For this example we only specialize based on the mesh topology
539 // but you could have more complex keys and that's where you'd need to create those keys
540 let mut mesh_key = view_key;
541 mesh_key |= MeshPipelineKey::from_primitive_topology(mesh.primitive_topology());
542
543 let pipeline_id = pipelines.specialize(
544 &pipeline_cache,
545 &custom_draw_pipeline,
546 mesh_key,
547 &mesh.layout,
548 );
549 let pipeline_id = match pipeline_id {
550 Ok(id) => id,
551 Err(err) => {
552 error!("{}", err);
553 continue;
554 }
555 };
556 let distance = rangefinder.distance_translation(&mesh_instance.translation);
557 // At this point we have all the data we need to create a phase item and add it to our
558 // phase
559 custom_phase.add(Stencil3d {
560 // Sort the data based on the distance to the view
561 sort_key: FloatOrd(distance),
562 entity: (*render_entity, *visible_entity),
563 pipeline: pipeline_id,
564 draw_function: draw_custom,
565 // Sorted phase items aren't batched
566 batch_range: 0..1,
567 extra_index: PhaseItemExtraIndex::None,
568 indexed: mesh.indexed(),
569 });
570 }
571 }
572}
examples/shader/specialized_mesh_pipeline.rs (line 312)
274fn queue_custom_mesh_pipeline(
275 pipeline_cache: Res<PipelineCache>,
276 custom_mesh_pipeline: Res<CustomMeshPipeline>,
277 (mut opaque_render_phases, opaque_draw_functions): (
278 ResMut<ViewBinnedRenderPhases<Opaque3d>>,
279 Res<DrawFunctions<Opaque3d>>,
280 ),
281 mut specialized_mesh_pipelines: ResMut<SpecializedMeshPipelines<CustomMeshPipeline>>,
282 views: Query<(
283 &RenderVisibleEntities,
284 &ExtractedView,
285 &Msaa,
286 Has<NoIndirectDrawing>,
287 Has<OcclusionCulling>,
288 )>,
289 (render_meshes, render_mesh_instances): (
290 Res<RenderAssets<RenderMesh>>,
291 Res<RenderMeshInstances>,
292 ),
293 param: StaticSystemParam<<MeshPipeline as GetBatchData>::Param>,
294 mut phase_batched_instance_buffers: ResMut<
295 PhaseBatchedInstanceBuffers<Opaque3d, <MeshPipeline as GetBatchData>::BufferData>,
296 >,
297 mut phase_indirect_parameters_buffers: ResMut<PhaseIndirectParametersBuffers<Opaque3d>>,
298 mut change_tick: Local<Tick>,
299) {
300 let system_param_item = param.into_inner();
301
302 let UntypedPhaseBatchedInstanceBuffers {
303 ref mut data_buffer,
304 ref mut work_item_buffers,
305 ref mut late_indexed_indirect_parameters_buffer,
306 ref mut late_non_indexed_indirect_parameters_buffer,
307 ..
308 } = phase_batched_instance_buffers.buffers;
309
310 // Get the id for our custom draw function
311 let draw_function_id = opaque_draw_functions
312 .read()
313 .id::<DrawSpecializedPipelineCommands>();
314
315 // Render phases are per-view, so we need to iterate over all views so that
316 // the entity appears in them. (In this example, we have only one view, but
317 // it's good practice to loop over all views anyway.)
318 for (view_visible_entities, view, msaa, no_indirect_drawing, gpu_occlusion_culling) in
319 views.iter()
320 {
321 let Some(opaque_phase) = opaque_render_phases.get_mut(&view.retained_view_entity) else {
322 continue;
323 };
324
325 // Create *work item buffers* if necessary. Work item buffers store the
326 // indices of meshes that are to be rendered when indirect drawing is
327 // enabled.
328 let work_item_buffer = gpu_preprocessing::get_or_create_work_item_buffer::<Opaque3d>(
329 work_item_buffers,
330 view.retained_view_entity,
331 no_indirect_drawing,
332 gpu_occlusion_culling,
333 );
334
335 // Initialize those work item buffers in preparation for this new frame.
336 gpu_preprocessing::init_work_item_buffers(
337 work_item_buffer,
338 late_indexed_indirect_parameters_buffer,
339 late_non_indexed_indirect_parameters_buffer,
340 );
341
342 // Create the key based on the view. In this case we only care about MSAA and HDR
343 let view_key = MeshPipelineKey::from_msaa_samples(msaa.samples())
344 | MeshPipelineKey::from_hdr(view.hdr);
345
346 // Set up a slot to hold information about the batch set we're going to
347 // create. If there are any of our custom meshes in the scene, we'll
348 // need this information in order for Bevy to kick off the rendering.
349 let mut mesh_batch_set_info = None;
350
351 // Find all the custom rendered entities that are visible from this
352 // view.
353 for &(render_entity, visible_entity) in
354 view_visible_entities.get::<CustomRenderedEntity>().iter()
355 {
356 // Get the mesh instance
357 let Some(mesh_instance) = render_mesh_instances.render_mesh_queue_data(visible_entity)
358 else {
359 continue;
360 };
361
362 // Get the mesh data
363 let Some(mesh) = render_meshes.get(mesh_instance.mesh_asset_id) else {
364 continue;
365 };
366
367 // Specialize the key for the current mesh entity
368 // For this example we only specialize based on the mesh topology
369 // but you could have more complex keys and that's where you'd need to create those keys
370 let mut mesh_key = view_key;
371 mesh_key |= MeshPipelineKey::from_primitive_topology(mesh.primitive_topology());
372
373 // Initialize the batch set information if this was the first custom
374 // mesh we saw. We'll need that information later to create the
375 // batch set.
376 if mesh_batch_set_info.is_none() {
377 mesh_batch_set_info = Some(MeshBatchSetInfo {
378 indirect_parameters_index: phase_indirect_parameters_buffers
379 .buffers
380 .allocate(mesh.indexed(), 1),
381 is_indexed: mesh.indexed(),
382 });
383 }
384 let mesh_info = mesh_batch_set_info.unwrap();
385
386 // Allocate some input and output indices. We'll need these to
387 // create the *work item* below.
388 let Some(input_index) =
389 MeshPipeline::get_binned_index(&system_param_item, visible_entity)
390 else {
391 continue;
392 };
393 let output_index = data_buffer.add() as u32;
394
395 // Finally, we can specialize the pipeline based on the key
396 let pipeline_id = specialized_mesh_pipelines
397 .specialize(
398 &pipeline_cache,
399 &custom_mesh_pipeline,
400 mesh_key,
401 &mesh.layout,
402 )
403 // This should never with this example, but if your pipeline specialization
404 // can fail you need to handle the error here
405 .expect("Failed to specialize mesh pipeline");
406
407 // Bump the change tick so that Bevy is forced to rebuild the bin.
408 let next_change_tick = change_tick.get() + 1;
409 change_tick.set(next_change_tick);
410
411 // Add the mesh with our specialized pipeline
412 opaque_phase.add(
413 Opaque3dBatchSetKey {
414 draw_function: draw_function_id,
415 pipeline: pipeline_id,
416 material_bind_group_index: None,
417 vertex_slab: default(),
418 index_slab: None,
419 lightmap_slab: None,
420 },
421 // The asset ID is arbitrary; we simply use [`AssetId::invalid`],
422 // but you can use anything you like. Note that the asset ID need
423 // not be the ID of a [`Mesh`].
424 Opaque3dBinKey {
425 asset_id: AssetId::<Mesh>::invalid().untyped(),
426 },
427 (render_entity, visible_entity),
428 mesh_instance.current_uniform_index,
429 // This example supports batching, but if your pipeline doesn't
430 // support it you can use `BinnedRenderPhaseType::UnbatchableMesh`
431 BinnedRenderPhaseType::BatchableMesh,
432 *change_tick,
433 );
434
435 // Create a *work item*. A work item tells the Bevy renderer to
436 // transform the mesh on GPU.
437 work_item_buffer.push(
438 mesh.indexed(),
439 PreprocessWorkItem {
440 input_index: input_index.into(),
441 output_or_indirect_parameters_index: if no_indirect_drawing {
442 output_index
443 } else {
444 mesh_info.indirect_parameters_index
445 },
446 },
447 );
448 }
449
450 // Now if there were any meshes, we need to add a command to the
451 // indirect parameters buffer, so that the renderer will end up
452 // enqueuing a command to draw the mesh.
453 if let Some(mesh_info) = mesh_batch_set_info {
454 phase_indirect_parameters_buffers
455 .buffers
456 .add_batch_set(mesh_info.is_indexed, mesh_info.indirect_parameters_index);
457 }
458 }
459}
Sourcepub fn write(&self) -> RwLockWriteGuard<'_, DrawFunctionsInternal<P>>
pub fn write(&self) -> RwLockWriteGuard<'_, DrawFunctionsInternal<P>>
Accesses the draw functions in write mode.
Trait Implementations§
Source§impl<P> Default for DrawFunctions<P>where
P: PhaseItem,
impl<P> Default for DrawFunctions<P>where
P: PhaseItem,
Source§fn default() -> DrawFunctions<P>
fn default() -> DrawFunctions<P>
Returns the “default value” for a type. Read more
impl<P> Resource for DrawFunctions<P>
Auto Trait Implementations§
impl<P> !Freeze for DrawFunctions<P>
impl<P> RefUnwindSafe for DrawFunctions<P>
impl<P> Send for DrawFunctions<P>
impl<P> Sync for DrawFunctions<P>
impl<P> Unpin for DrawFunctions<P>
impl<P> UnwindSafe for DrawFunctions<P>
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
Return the
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
Mutably borrows from an owned value. Read more
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>
Converts
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>
Converts
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)
Converts
&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)
Converts
&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>
Convert
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>
Convert
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)
Convert
&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)
Convert
&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,
Causes
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,
Causes
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,
Causes
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,
Causes
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,
Causes
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,
Causes
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,
Causes
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,
Causes
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> 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> ⓘ
Converts
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> ⓘ
Converts
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<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,
Pipes by value. This is generally the method you want to use. Read more
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,
Borrows
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,
Mutably borrows
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
Borrows
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
Mutably borrows
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
Borrows
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>
Read this value from the supplied reader. Same as
ReadEndian::read_from_little_endian()
.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
Immutable access to the
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
Mutable access to the
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
Immutable access to the
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
Mutable access to the
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
Immutable access to the
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
Mutable access to the
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
Calls
.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
Calls
.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
Calls
.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
Calls
.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
Calls
.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
Calls
.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
Calls
.tap_deref()
only in debug builds, and is erased in release
builds.