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