Skip to main content

DrawFunctions

Struct DrawFunctions 

Source
pub struct DrawFunctions<P>
where P: PhaseItem,
{ /* private fields */ }
Available on crate feature bevy_render only.
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,

Source

pub fn read(&self) -> RwLockReadGuard<'_, DrawFunctionsInternal<P>>

Accesses the draw functions in read mode.

Examples found in repository?
examples/shader_advanced/manual_material.rs (line 161)
147    fn prepare_asset(
148        source_asset: Self::SourceAsset,
149        asset_id: AssetId<Self::SourceAsset>,
150        (
151            opaque_draw_functions,
152            material_layout,
153            asset_server,
154            bind_group_allocators,
155            render_material_bindings,
156            gpu_images,
157            image_material_sampler,
158        ): &mut SystemParamItem<Self::Param>,
159    ) -> std::result::Result<Self::ErasedAsset, PrepareAssetError<Self::SourceAsset>> {
160        let material_layout = material_layout.0.clone();
161        let draw_function_id = opaque_draw_functions.read().id::<DrawMaterial>();
162        let bind_group_allocator = bind_group_allocators
163            .get_mut(&TypeId::of::<ImageMaterial>())
164            .unwrap();
165        let Some(image) = gpu_images.get(&source_asset.image) else {
166            return Err(PrepareAssetError::RetryNextUpdate(source_asset));
167        };
168        let mut unprepared = BindGroupBuilder {
169            binding_resources: UnpreparedBindingResources(vec![
170                (
171                    0,
172                    UnpreparedBindingResource::TextureView(
173                        TextureViewDimension::D2,
174                        image.texture_view.clone(),
175                    ),
176                ),
177                (
178                    1,
179                    UnpreparedBindingResource::Sampler(
180                        SamplerBindingType::NonFiltering,
181                        image_material_sampler.0.clone(),
182                    ),
183                ),
184            ]),
185            data_buffer: vec![],
186        };
187        let binding = match render_material_bindings.entry(asset_id.into()) {
188            Entry::Occupied(mut occupied_entry) => {
189                bind_group_allocator.free(*occupied_entry.get());
190                let new_binding =
191                    bind_group_allocator.allocate_unprepared(&mut unprepared, &material_layout);
192                *occupied_entry.get_mut() = new_binding;
193                new_binding
194            }
195            Entry::Vacant(vacant_entry) => *vacant_entry.insert(
196                bind_group_allocator.allocate_unprepared(&mut unprepared, &material_layout),
197            ),
198        };
199
200        let mut properties = MaterialProperties {
201            material_layout: Some(material_layout),
202            mesh_pipeline_key_bits: ErasedMeshPipelineKey::new(MeshPipelineKey::empty()),
203            base_specialize: Some(base_specialize),
204            ..Default::default()
205        };
206        properties.add_draw_function(MainPassOpaqueDrawFunction, draw_function_id);
207        properties.add_shader(MaterialFragmentShader, asset_server.load(SHADER_ASSET_PATH));
208
209        Ok(PreparedMaterial {
210            binding,
211            properties: Arc::new(properties),
212        })
213    }
More examples
Hide additional examples
examples/shader_advanced/custom_shader_instancing.rs (line 152)
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}
examples/2d/mesh2d_manual.rs (line 587)
565fn queue_colored_mesh2d(
566    transparent_draw_functions: Res<DrawFunctions<TransparentColoredMesh2d>>,
567    colored_mesh2d_pipeline: Res<ColoredMesh2dPipeline>,
568    mut pipelines: ResMut<SpecializedRenderPipelines<ColoredMesh2dPipeline>>,
569    pipeline_cache: Res<PipelineCache>,
570    render_meshes: Res<RenderAssets<RenderMesh>>,
571    render_mesh_instances: Res<RenderColoredMesh2dInstances>,
572    mut transparent_render_phases: ResMut<ViewSortedRenderPhases<TransparentColoredMesh2d>>,
573    views: Query<(&RenderVisibleEntities, &ExtractedView, &Msaa)>,
574) {
575    if render_mesh_instances.is_empty() {
576        return;
577    }
578
579    // Iterate each view (a camera is a view)
580    for (visible_entities, view, msaa) in &views {
581        let Some(transparent_phase) = transparent_render_phases.get_mut(&view.retained_view_entity)
582        else {
583            continue;
584        };
585
586        let draw_colored_mesh2d = transparent_draw_functions
587            .read()
588            .id::<DrawTransparentColoredMesh2d>();
589
590        let mesh_key = Mesh2dPipelineKey::from_msaa_samples(msaa.samples())
591            | Mesh2dPipelineKey::from_target_format(view.target_format);
592
593        // Queue all entities visible to that view
594        let Some(visible_entities) = visible_entities.get::<Mesh2d>() else {
595            continue;
596        };
597        for (render_entity, visible_entity) in visible_entities.iter_visible() {
598            if let Some(mesh_instance) = render_mesh_instances.get(visible_entity) {
599                let mesh2d_handle = mesh_instance.mesh_asset_id;
600                let mesh2d_transforms = &mesh_instance.transforms;
601                // Get our specialized pipeline
602                let mut mesh2d_key = mesh_key;
603                let Some(mesh) = render_meshes.get(mesh2d_handle) else {
604                    continue;
605                };
606                mesh2d_key |= Mesh2dPipelineKey::from(
607                    BaseMeshPipelineKey::from_primitive_topology_and_strip_index(
608                        mesh.primitive_topology(),
609                        mesh.index_format(),
610                    )
611                    .bits(),
612                );
613
614                let pipeline_id =
615                    pipelines.specialize(&pipeline_cache, &colored_mesh2d_pipeline, mesh2d_key);
616
617                let mesh_z = mesh2d_transforms.world_from_local.translation.z;
618                transparent_phase.add_retained(TransparentColoredMesh2d {
619                    entity: (*render_entity, *visible_entity),
620                    draw_function: draw_colored_mesh2d,
621                    pipeline: pipeline_id,
622                    // The 2d render items are sorted according to their z value before rendering,
623                    // in order to get correct transparency
624                    sort_key: FloatOrd(mesh_z),
625                    // This material is not batched
626                    batch_range: 0..1,
627                    extra_index: PhaseItemExtraIndex::None,
628                    indexed: mesh.indexed(),
629                });
630            }
631        }
632    }
633}
examples/shader_advanced/custom_phase_item.rs (line 240)
229fn queue_custom_phase_item(
230    pipeline_cache: Res<PipelineCache>,
231    mut pipeline: ResMut<CustomPhasePipeline>,
232    mut opaque_render_phases: ResMut<ViewBinnedRenderPhases<Opaque3d>>,
233    opaque_draw_functions: Res<DrawFunctions<Opaque3d>>,
234    views: Query<(&ExtractedView, &RenderVisibleEntities, &Msaa)>,
235    dirty_specializations: Res<DirtySpecializations>,
236    mut pending_custom_phase_item_queues: ResMut<PendingCustomPhaseItemQueues>,
237    mut mesh_instances_queued_this_iteration_scratch_space: Local<MainEntityHashSet>,
238) {
239    let draw_custom_phase_item = opaque_draw_functions
240        .read()
241        .id::<DrawCustomPhaseItemCommands>();
242
243    // Render phases are per-view, so we need to iterate over all views so that
244    // the entity appears in them. (In this example, we have only one view, but
245    // it's good practice to loop over all views anyway.)
246    for (view, view_visible_entities, msaa) in views.iter() {
247        let Some(opaque_phase) = opaque_render_phases.get_mut(&view.retained_view_entity) else {
248            continue;
249        };
250
251        // Fetch the list of visible entities in the `CustomRenderedEntity`
252        // class. If there are no such entities, then we have no entities to
253        // render, and we're done.
254        let Some(render_visible_mesh_entities) =
255            view_visible_entities.get::<CustomRenderedEntity>()
256        else {
257            continue;
258        };
259
260        let view_pending_custom_phase_item_queues =
261            pending_custom_phase_item_queues.prepare_for_new_frame(view.retained_view_entity);
262
263        // First, remove meshes that need to be respecialized, and those that
264        // were removed, from the bins.
265        for &main_entity in dirty_specializations
266            .iter_to_dequeue(view.retained_view_entity, render_visible_mesh_entities)
267        {
268            opaque_phase.remove(main_entity);
269        }
270
271        // Find all the custom rendered entities that are visible from this
272        // view.
273        for (render_entity, main_entity) in dirty_specializations.iter_to_queue(
274            view.retained_view_entity,
275            render_visible_mesh_entities,
276            &view_pending_custom_phase_item_queues.prev_frame,
277            &mut mesh_instances_queued_this_iteration_scratch_space,
278        ) {
279            // Ordinarily, the [`SpecializedRenderPipeline::Key`] would contain
280            // some per-view settings, such as whether the view is HDR, but for
281            // simplicity's sake we simply hard-code the view's characteristics,
282            // with the exception of number of MSAA samples.
283            let Ok(pipeline_id) = pipeline
284                .variants
285                .specialize(&pipeline_cache, CustomPhaseKey(*msaa))
286            else {
287                continue;
288            };
289
290            // Add the custom render item. We use the
291            // [`BinnedRenderPhaseType::NonMesh`] type to skip the special
292            // handling that Bevy has for meshes (preprocessing, indirect
293            // draws, etc.)
294            //
295            // The asset ID is arbitrary; we simply use [`AssetId::default`],
296            // but you can use anything you like. Note that the asset ID need
297            // not be the ID of a [`Mesh`].
298            opaque_phase.add(
299                Opaque3dBatchSetKey {
300                    draw_function: draw_custom_phase_item,
301                    pipeline: pipeline_id,
302                    material_bind_group_index: None,
303                    lightmap_slab: None,
304                    slabs: MeshSlabs::default(),
305                },
306                Opaque3dBinKey {
307                    asset_id: AssetId::<Mesh>::default().untyped(),
308                },
309                (*render_entity, *main_entity),
310                InputUniformIndex::default(),
311                BinnedRenderPhaseType::NonMesh,
312            );
313        }
314    }
315}
examples/shader_advanced/custom_render_phase.rs (line 581)
559fn queue_custom_meshes(
560    custom_draw_functions: Res<DrawFunctions<Stencil3d>>,
561    mut pipelines: ResMut<SpecializedMeshPipelines<StencilPipeline>>,
562    pipeline_cache: Res<PipelineCache>,
563    custom_draw_pipeline: Res<StencilPipeline>,
564    render_meshes: Res<RenderAssets<RenderMesh>>,
565    render_mesh_instances: Res<RenderMeshInstances>,
566    maybe_batched_instance_buffers: Option<
567        Res<BatchedInstanceBuffers<MeshUniform, MeshInputUniform>>,
568    >,
569    mut custom_render_phases: ResMut<ViewSortedRenderPhases<Stencil3d>>,
570    mut views: Query<(&ExtractedView, &RenderVisibleEntities)>,
571    view_key_cache: Res<ViewKeyCache>,
572    dirty_specializations: Res<DirtySpecializations>,
573    mut pending_custom_mesh_queues: ResMut<PendingCustomMeshQueues>,
574    has_marker: Query<(), With<DrawStencil>>,
575    mut mesh_instances_queued_this_iteration_scratch_space: Local<MainEntityHashSet>,
576) {
577    for (view, visible_entities) in &mut views {
578        let Some(custom_phase) = custom_render_phases.get_mut(&view.retained_view_entity) else {
579            continue;
580        };
581        let draw_custom = custom_draw_functions.read().id::<DrawMesh3dStencil>();
582
583        let Some(&view_key) = view_key_cache.get(&view.retained_view_entity) else {
584            continue;
585        };
586
587        // Since our phase can work on any 3d mesh we can reuse the default mesh 3d filter
588        let Some(render_visible_mesh_entities) = visible_entities.get::<Mesh3d>() else {
589            continue;
590        };
591
592        let view_pending_custom_mesh_queues =
593            pending_custom_mesh_queues.prepare_for_new_frame(view.retained_view_entity);
594
595        // First, remove meshes that need to be respecialized, and those that were removed, from the bins.
596        for &main_entity in dirty_specializations
597            .iter_to_dequeue(view.retained_view_entity, render_visible_mesh_entities)
598        {
599            custom_phase.remove(Entity::PLACEHOLDER, main_entity);
600        }
601
602        for (render_entity, visible_entity) in dirty_specializations.iter_to_queue(
603            view.retained_view_entity,
604            render_visible_mesh_entities,
605            &view_pending_custom_mesh_queues.prev_frame,
606            &mut mesh_instances_queued_this_iteration_scratch_space,
607        ) {
608            // We only want meshes with the marker component to be queued to our phase.
609            if has_marker.get(*render_entity).is_err() {
610                continue;
611            }
612            let Some(mesh_instance) = render_mesh_instances.render_mesh_queue_data(*visible_entity)
613            else {
614                // We couldn't fetch the mesh, probably because it hasn't been
615                // loaded yet. Add the entity to the list of pending custom mesh
616                // queues and bail.
617                view_pending_custom_mesh_queues
618                    .current_frame
619                    .insert((*render_entity, *visible_entity));
620                continue;
621            };
622            let Some(mesh) = render_meshes.get(mesh_instance.mesh_asset_id()) else {
623                continue;
624            };
625
626            // Specialize the key for the current mesh entity
627            // For this example we only specialize based on the mesh topology
628            // but you could have more complex keys and that's where you'd need to create those keys
629            let mut mesh_key = view_key;
630            mesh_key |= MeshPipelineKey::from_primitive_topology_and_strip_index(
631                mesh.primitive_topology(),
632                mesh.index_format(),
633            );
634
635            let pipeline_id = pipelines.specialize(
636                &pipeline_cache,
637                &custom_draw_pipeline,
638                mesh_key,
639                &mesh.layout,
640            );
641            let pipeline_id = match pipeline_id {
642                Ok(id) => id,
643                Err(err) => {
644                    error!("{}", err);
645                    continue;
646                }
647            };
648            // At this point we have all the data we need to create a phase item and add it to our
649            // phase
650            custom_phase.add_retained(Stencil3d {
651                sorting_info: TransparentSortingInfo3d::Sorted {
652                    mesh_center: pbr::get_mesh_instance_world_from_local(
653                        *visible_entity,
654                        mesh_instance.current_uniform_index,
655                        &render_mesh_instances,
656                        maybe_batched_instance_buffers.as_deref(),
657                    )
658                    .transform_point3(
659                        render_meshes
660                            .get(mesh_instance.mesh_asset_id())
661                            .unwrap()
662                            .aabb_center,
663                    ),
664                    depth_bias: 0.0,
665                },
666                distance: FloatOrd(0.0),
667                entity: (Entity::PLACEHOLDER, *visible_entity),
668                pipeline: pipeline_id,
669                draw_function: draw_custom,
670                // Sorted phase items aren't batched
671                batch_range: 0..1,
672                extra_index: PhaseItemExtraIndex::None,
673                indexed: mesh.indexed(),
674            });
675        }
676    }
677}
examples/shader_advanced/specialized_mesh_pipeline.rs (line 335)
312fn queue_custom_mesh_pipeline(
313    pipeline_cache: Res<PipelineCache>,
314    custom_mesh_pipeline: Res<CustomMeshPipeline>,
315    (mut opaque_render_phases, opaque_draw_functions): (
316        ResMut<ViewBinnedRenderPhases<Opaque3d>>,
317        Res<DrawFunctions<Opaque3d>>,
318    ),
319    mut specialized_mesh_pipelines: ResMut<SpecializedMeshPipelines<CustomMeshPipeline>>,
320    views: Query<(&RenderVisibleEntities, &ExtractedView)>,
321    view_key_cache: Res<ViewKeyCache>,
322    (render_meshes, render_mesh_instances): (
323        Res<RenderAssets<RenderMesh>>,
324        Res<RenderMeshInstances>,
325    ),
326    mut change_tick: Local<Tick>,
327    mesh_allocator: Res<MeshAllocator>,
328    gpu_preprocessing_support: Res<GpuPreprocessingSupport>,
329    dirty_specializations: Res<DirtySpecializations>,
330    mut pending_custom_mesh_queues: ResMut<PendingCustomMeshQueues>,
331    mut mesh_instances_queued_this_iteration_scratch_space: Local<MainEntityHashSet>,
332) {
333    // Get the id for our custom draw function
334    let draw_function = opaque_draw_functions
335        .read()
336        .id::<DrawSpecializedPipelineCommands>();
337
338    // Render phases are per-view, so we need to iterate over all views so that
339    // the entity appears in them. (In this example, we have only one view, but
340    // it's good practice to loop over all views anyway.)
341    for (view_visible_entities, view) in views.iter() {
342        let Some(opaque_phase) = opaque_render_phases.get_mut(&view.retained_view_entity) else {
343            continue;
344        };
345
346        let Some(&view_key) = view_key_cache.get(&view.retained_view_entity) else {
347            continue;
348        };
349
350        let Some(render_visible_mesh_entities) =
351            view_visible_entities.get::<CustomRenderedEntity>()
352        else {
353            continue;
354        };
355
356        // Initialize the pending queues.
357        let view_pending_custom_mesh_queues =
358            pending_custom_mesh_queues.prepare_for_new_frame(view.retained_view_entity);
359
360        // First, remove meshes that need to be respecialized, and those that were removed, from the bins.
361        for &main_entity in dirty_specializations
362            .iter_to_dequeue(view.retained_view_entity, render_visible_mesh_entities)
363        {
364            opaque_phase.remove(main_entity);
365        }
366
367        // Find all the custom rendered entities that are visible from this
368        // view.
369        for (render_entity, visible_entity) in dirty_specializations.iter_to_queue(
370            view.retained_view_entity,
371            render_visible_mesh_entities,
372            &view_pending_custom_mesh_queues.prev_frame,
373            &mut mesh_instances_queued_this_iteration_scratch_space,
374        ) {
375            // Get the mesh instance
376            let Some(mesh_instance) = render_mesh_instances.render_mesh_queue_data(*visible_entity)
377            else {
378                // We couldn't fetch the mesh, probably because it hasn't been
379                // loaded yet. Add the entity to the list of pending custom
380                // meshes and bail.
381                view_pending_custom_mesh_queues
382                    .current_frame
383                    .insert((*render_entity, *visible_entity));
384                continue;
385            };
386
387            // Get the mesh data
388            let Some(mesh) = render_meshes.get(mesh_instance.mesh_asset_id()) else {
389                continue;
390            };
391
392            let Some(mesh_slabs) = mesh_allocator.mesh_slabs(&mesh_instance.mesh_asset_id()) else {
393                continue;
394            };
395
396            // Specialize the key for the current mesh entity
397            // For this example we only specialize based on the mesh topology
398            // but you could have more complex keys and that's where you'd need to create those keys
399            let mut mesh_key = view_key;
400            mesh_key |= MeshPipelineKey::from_primitive_topology_and_strip_index(
401                mesh.primitive_topology(),
402                mesh.index_format(),
403            );
404
405            // Finally, we can specialize the pipeline based on the key
406            let pipeline_id = specialized_mesh_pipelines
407                .specialize(
408                    &pipeline_cache,
409                    &custom_mesh_pipeline,
410                    mesh_key,
411                    &mesh.layout,
412                )
413                // This should never happen with this example, but if your pipeline
414                // specialization can fail you need to handle the error here
415                .expect("Failed to specialize mesh pipeline");
416
417            // Bump the change tick so that Bevy is forced to rebuild the bin.
418            let next_change_tick = change_tick.get() + 1;
419            change_tick.set(next_change_tick);
420
421            // Add the mesh with our specialized pipeline
422            opaque_phase.add(
423                Opaque3dBatchSetKey {
424                    draw_function,
425                    pipeline: pipeline_id,
426                    material_bind_group_index: None,
427                    slabs: mesh_slabs,
428                    lightmap_slab: None,
429                },
430                // For this example we can use the mesh asset id as the bin key,
431                // but you can use any asset_id as a key
432                Opaque3dBinKey {
433                    asset_id: mesh_instance.mesh_asset_id().into(),
434                },
435                (*render_entity, *visible_entity),
436                mesh_instance.current_uniform_index,
437                // This example supports batching and multi draw indirect,
438                // but if your pipeline doesn't support it you can use
439                // `BinnedRenderPhaseType::UnbatchableMesh`
440                BinnedRenderPhaseType::mesh(
441                    mesh_instance.should_batch(),
442                    &gpu_preprocessing_support,
443                ),
444            );
445        }
446    }
447}
Source

pub fn write(&self) -> RwLockWriteGuard<'_, DrawFunctionsInternal<P>>

Accesses the draw functions in write mode.

Trait Implementations§

Source§

impl<P> Component for DrawFunctions<P>
where P: PhaseItem, DrawFunctions<P>: Send + Sync + 'static,

Source§

const STORAGE_TYPE: StorageType = bevy_ecs::component::StorageType::SparseSet

A constant indicating the storage type used for this component.
Source§

type Mutability = Mutable

A marker type to assist Bevy with determining if this component is mutable, or immutable. Mutable components will have Component<Mutability = Mutable>, while immutable components will instead have Component<Mutability = Immutable>. Read more
Source§

fn register_required_components( _requiree: ComponentId, required_components: &mut RequiredComponentsRegistrator<'_, '_>, )

Registers required components. Read more
Source§

fn clone_behavior() -> ComponentCloneBehavior

Called when registering this component, allowing to override clone function (or disable cloning altogether) for this component. Read more
Source§

fn relationship_accessor() -> Option<ComponentRelationshipAccessor<DrawFunctions<P>>>

Returns ComponentRelationshipAccessor required for working with relationships in dynamic contexts. Read more
Source§

fn on_add() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>

Gets the on_add ComponentHook for this Component if one is defined.
Source§

fn on_insert() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>

Gets the on_insert ComponentHook for this Component if one is defined.
Source§

fn on_discard() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>

Gets the on_discard ComponentHook for this Component if one is defined.
Source§

fn on_remove() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>

Gets the on_remove ComponentHook for this Component if one is defined.
Source§

fn on_despawn() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>

Gets the on_despawn ComponentHook for this Component if one is defined.
Source§

fn map_entities<E>(_this: &mut Self, _mapper: &mut E)
where E: EntityMapper,

Maps the entities on this component using the given EntityMapper. This is used to remap entities in contexts like scenes and entity cloning. When deriving Component, this is populated by annotating fields containing entities with #[entities] Read more
Source§

const HAS_SUMMARY_TICK: bool = false

Set this constant to true if the component should track a summary tick. Read more
Source§

impl<P> Default for DrawFunctions<P>
where P: PhaseItem,

Source§

fn default() -> DrawFunctions<P>

Returns the “default value” for a type. Read more
Source§

impl<P> Resource for DrawFunctions<P>
where P: PhaseItem, DrawFunctions<P>: Send + Sync + 'static,

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T, U> AsBindGroupShaderType<U> for T
where U: ShaderType, &'a T: for<'a> Into<U>,

Source§

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> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<C> Bundle for C
where C: Component,

Source§

fn component_ids( components: &mut ComponentsRegistrator<'_>, ) -> impl Iterator<Item = ComponentId> + use<C>

Source§

fn get_component_ids( components: &Components, ) -> impl Iterator<Item = Option<ComponentId>>

Returns an iterator over this Bundle’s component ids. This will be None if the component has not been registered.
Source§

impl<C> BundleFromComponents for C
where C: Component,

Source§

unsafe fn from_components<T, F>(ctx: &mut T, func: &mut F) -> C
where F: for<'a> FnMut(&'a mut T) -> OwningPtr<'a>, C: Sized,

Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> ConditionalSend for T
where T: Send,

Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> Downcast for T
where T: Any,

Source§

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>

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)

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)

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 T
where T: Any,

Source§

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>

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)

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)

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
where T: Any + Send,

Source§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync> ⓘ

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<S, T> Duplex<S> for T
where T: FromSample<S> + ToSample<S>,

Source§

impl<C> DynamicBundle for C
where C: Component,

Source§

type Effect = ()

An operation on the entity that happens after inserting this bundle.
Source§

unsafe fn get_components( ptr: MovingPtr<'_, C>, func: &mut impl FnMut(StorageType, OwningPtr<'_>), ) -> <C as DynamicBundle>::Effect

Moves the components out of the bundle. Read more
Source§

unsafe fn apply_effect( _ptr: MovingPtr<'_, MaybeUninit<C>>, _entity: &mut EntityWorldMut<'_>, )

Applies the after-effects of spawning this bundle. Read more
Source§

impl<T> ErasedDestructor for T
where T: 'static,

Source§

impl<T> FmtForward for T

Source§

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,

Causes self to use its Display implementation when Debug-formatted.
Source§

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,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

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,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

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,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<S> FromSample<S> for S

Source§

fn from_sample_(s: S) -> S

Source§

impl<T> FromWorld for T
where T: Default,

Source§

fn from_world(_world: &mut World) -> T

Creates Self using default().

Source§

impl<T, W> HasTypeWitness<W> for T
where W: MakeTypeWitness<Arg = T>, T: ?Sized,

Source§

const WITNESS: W = W::MAKE

A constant of the type witness
Source§

impl<T> Identity for T
where T: ?Sized,

Source§

const TYPE_EQ: TypeEq<T, <T as Identity>::Type> = TypeEq::NEW

Proof that Self is the same type as Self::Type, provides methods for casting between Self and Self::Type.
Source§

type Type = T

The same type as Self, used to emulate type equality bounds (T == U) with associated type equality constraints (T: Identity<Type = U>).
Source§

impl<T> InitializeFromFunction<T> for T

Source§

fn initialize_from_function(f: fn() -> T) -> T

Create an instance of this type from an initialization function
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

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 more
Source§

impl<T> IntoResult<T> for T

Source§

fn into_result(self) -> Result<T, RunSystemError>

Converts this type into the system output type.
Source§

impl<F, T> IntoSample<T> for F
where T: FromSample<F>,

Source§

fn into_sample(self) -> T

Source§

impl<A> Is for A
where A: Any,

Source§

fn is<T>() -> bool
where T: Any,

Checks if the current type “is” another type, using a TypeId equality comparison. This is most useful in the context of generic logic. Read more
Source§

impl<T> NoneValue for T
where T: Default,

Source§

type NoneType = T

Source§

fn null_value() -> T

The none-equivalent value.
Source§

impl<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where 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) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

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
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

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
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<R, P> ReadPrimitive<R> for P
where R: Read + ReadEndian<P>, P: Default,

Source§

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§

fn read_from_big_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_big_endian().
Source§

fn read_from_native_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_native_endian().
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<C> SceneEffect for C
where C: Component,

Source§

fn apply( self, context: &mut TemplateContext<'_, '_>, bundle_writer: &mut BundleWriter<'_>, )

Applies the scene effect to the current context.
Source§

impl<T> Settings for T
where T: 'static + Send + Sync,

Source§

impl<Ret> SpawnIfAsync<(), Ret> for Ret

Source§

fn spawn(self) -> Ret

Spawn the value into the dioxus runtime if it is an async block
Source§

impl<T, O> SuperFrom<T> for O
where O: From<T>,

Source§

fn super_from(input: T) -> O

Convert from a type to another type.
Source§

impl<T, O, M> SuperInto<O, M> for T
where O: SuperFrom<T, M>,

Source§

fn super_into(self) -> O

Convert from a type to another type.
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

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

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
where Self: Borrow<B>, B: ?Sized,

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
where Self: BorrowMut<B>, B: ?Sized,

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
where Self: AsRef<R>, R: ?Sized,

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
where Self: AsMut<R>, R: ?Sized,

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
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T, U> ToSample<U> for T
where U: FromSample<T>,

Source§

fn to_sample_(self) -> U

Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WasmNotSend for T
where T: Send,

Source§

impl<T> WasmNotSendSync for T

Source§

impl<T> WasmNotSync for T
where T: Sync,

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more