mirror of
https://github.com/bevyengine/bevy
synced 2024-12-18 17:13:10 +00:00
Expose SystemMeta
's access field as part of public API (#16625)
# Objective Outside of the `bevy_ecs` crate it's hard to implement `SystemParam` trait on params that require access to the `World`, because `init_state` expects user to extend access in `SystemMeta` and access-related fields of `SystemMeta` are private. ## Solution Expose those fields as a functions
This commit is contained in:
parent
ea33fc04ab
commit
67bd2b00e1
1 changed files with 49 additions and 0 deletions
|
@ -136,6 +136,55 @@ impl SystemMeta {
|
|||
{
|
||||
self.param_warn_policy.try_warn::<P>(&self.name);
|
||||
}
|
||||
|
||||
/// Archetype component access that is used to determine which systems can run in parallel with each other
|
||||
/// in the multithreaded executor.
|
||||
///
|
||||
/// We use an [`ArchetypeComponentId`] as it is more precise than just checking [`ComponentId`]:
|
||||
/// for example if you have one system with `Query<&mut A, With<B>`, and one system with `Query<&mut A, Without<B>`,
|
||||
/// they conflict if you just look at the [`ComponentId`];
|
||||
/// but no archetype that matches the first query will match the second and vice versa,
|
||||
/// which means there's no risk of conflict.
|
||||
#[inline]
|
||||
pub fn archetype_component_access(&self) -> &Access<ArchetypeComponentId> {
|
||||
&self.archetype_component_access
|
||||
}
|
||||
|
||||
/// Returns a mutable reference to the [`Access`] for [`ArchetypeComponentId`].
|
||||
/// This is used to determine which systems can run in parallel with each other
|
||||
/// in the multithreaded executor.
|
||||
///
|
||||
/// We use an [`ArchetypeComponentId`] as it is more precise than just checking [`ComponentId`]:
|
||||
/// for example if you have one system with `Query<&mut A, With<B>`, and one system with `Query<&mut A, Without<B>`,
|
||||
/// they conflict if you just look at the [`ComponentId`];
|
||||
/// but no archetype that matches the first query will match the second and vice versa,
|
||||
/// which means there's no risk of conflict.
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// No access can be removed from the returned [`Access`].
|
||||
#[inline]
|
||||
pub unsafe fn archetype_component_access_mut(&mut self) -> &mut Access<ArchetypeComponentId> {
|
||||
&mut self.archetype_component_access
|
||||
}
|
||||
|
||||
/// Returns a reference to the [`FilteredAccessSet`] for [`ComponentId`].
|
||||
/// Used to check if systems and/or system params have conflicting access.
|
||||
#[inline]
|
||||
pub fn component_access_set(&self) -> &FilteredAccessSet<ComponentId> {
|
||||
&self.component_access_set
|
||||
}
|
||||
|
||||
/// Returns a mutable reference to the [`FilteredAccessSet`] for [`ComponentId`].
|
||||
/// Used internally to statically check if systems have conflicting access.
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// No access can be removed from the returned [`FilteredAccessSet`].
|
||||
#[inline]
|
||||
pub unsafe fn component_access_set_mut(&mut self) -> &mut FilteredAccessSet<ComponentId> {
|
||||
&mut self.component_access_set
|
||||
}
|
||||
}
|
||||
|
||||
/// State machine for emitting warnings when [system params are invalid](System::validate_param).
|
||||
|
|
Loading…
Reference in a new issue