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,
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_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
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}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> Component for DrawFunctions<P>
impl<P> Component for DrawFunctions<P>
Source§const STORAGE_TYPE: StorageType = bevy_ecs::component::StorageType::SparseSet
const STORAGE_TYPE: StorageType = bevy_ecs::component::StorageType::SparseSet
A constant indicating the storage type used for this component.
Source§type Mutability = Mutable
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 moreSource§fn register_required_components(
_requiree: ComponentId,
required_components: &mut RequiredComponentsRegistrator<'_, '_>,
)
fn register_required_components( _requiree: ComponentId, required_components: &mut RequiredComponentsRegistrator<'_, '_>, )
Registers required components. Read more
Source§fn clone_behavior() -> ComponentCloneBehavior
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>>>
fn relationship_accessor() -> Option<ComponentRelationshipAccessor<DrawFunctions<P>>>
Returns
ComponentRelationshipAccessor required for working with relationships in dynamic contexts. Read moreSource§fn on_add() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
fn on_add() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
Source§fn on_insert() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
fn on_insert() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
Source§fn on_discard() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
fn on_discard() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
Source§fn on_remove() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
fn on_remove() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
Source§fn on_despawn() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
fn on_despawn() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
Source§fn map_entities<E>(_this: &mut Self, _mapper: &mut E)where
E: EntityMapper,
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 moreSource§const HAS_SUMMARY_TICK: bool = false
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,
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> UnsafeUnpin 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<C> Bundle for Cwhere
C: Component,
impl<C> Bundle for Cwhere
C: Component,
fn component_ids( components: &mut ComponentsRegistrator<'_>, ) -> impl Iterator<Item = ComponentId> + use<C>
Source§fn get_component_ids(
components: &Components,
) -> impl Iterator<Item = Option<ComponentId>>
fn get_component_ids( components: &Components, ) -> impl Iterator<Item = Option<ComponentId>>
Source§impl<C> BundleFromComponents for Cwhere
C: Component,
impl<C> BundleFromComponents for Cwhere
C: Component,
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>
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
impl<S, T> Duplex<S> for Twhere
T: FromSample<S> + ToSample<S>,
Source§impl<C> DynamicBundle for Cwhere
C: Component,
impl<C> DynamicBundle for Cwhere
C: Component,
Source§unsafe fn get_components(
ptr: MovingPtr<'_, C>,
func: &mut impl FnMut(StorageType, OwningPtr<'_>),
) -> <C as DynamicBundle>::Effect
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<'_>,
)
unsafe fn apply_effect( _ptr: MovingPtr<'_, MaybeUninit<C>>, _entity: &mut EntityWorldMut<'_>, )
Applies the after-effects of spawning this bundle. Read more
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,
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, 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
Create an instance of this type from an initialization function
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<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>
Converts this type into the system output type.
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,
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.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>
Read this value from the supplied reader. Same as
ReadEndian::read_from_little_endian().Source§impl<C> SceneEffect for Cwhere
C: Component,
impl<C> SceneEffect for Cwhere
C: Component,
Source§fn apply(
self,
context: &mut TemplateContext<'_, '_>,
bundle_writer: &mut BundleWriter<'_>,
)
fn apply( self, context: &mut TemplateContext<'_, '_>, bundle_writer: &mut BundleWriter<'_>, )
Applies the scene effect to the current context.
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
Convert from a type to another type.
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
Convert from a type to another type.
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.