diff --git a/crates/bevy_legion/legion_systems/src/resource.rs b/crates/bevy_legion/legion_systems/src/resource.rs index 3d07f19f25..b8ef714476 100644 --- a/crates/bevy_legion/legion_systems/src/resource.rs +++ b/crates/bevy_legion/legion_systems/src/resource.rs @@ -107,6 +107,9 @@ pub trait ResourceSet: Send + Sync { { unsafe { Self::fetch_unchecked(resources) } } + + fn read_types() -> Vec; + fn write_types() -> Vec; } /// Blanket trait for resource types. @@ -365,6 +368,8 @@ impl ResourceSet for () { type PreparedResources = (); unsafe fn fetch_unchecked(_: &Resources) {} + fn read_types() -> Vec { Vec::new() } + fn write_types() -> Vec { Vec::new() } } impl ResourceSet for Read { @@ -376,6 +381,10 @@ impl ResourceSet for Read { .unwrap_or_else(|| panic!("Failed to fetch resource!: {}", std::any::type_name::())); PreparedRead::new(resource.deref() as *const T) } + fn read_types() -> Vec { + vec![ResourceTypeId::of::()] + } + fn write_types() -> Vec { Vec::new() } } impl ResourceSet for Write { type PreparedResources = PreparedWrite; @@ -386,6 +395,12 @@ impl ResourceSet for Write { .unwrap_or_else(|| panic!("Failed to fetch resource!: {}", std::any::type_name::())); PreparedWrite::new(resource.deref_mut() as *mut T) } + fn read_types() -> Vec { + Vec::new() + } + fn write_types() -> Vec { + vec![ResourceTypeId::of::()] + } } macro_rules! impl_resource_tuple { @@ -398,6 +413,16 @@ macro_rules! impl_resource_tuple { unsafe fn fetch_unchecked(resources: &Resources) -> Self::PreparedResources { ($( $ty::fetch_unchecked(resources), )*) } + fn read_types() -> Vec { + let mut vec = vec![]; + $( vec.extend($ty::read_types()); )* + vec + } + fn write_types() -> Vec { + let mut vec = vec![]; + $( vec.extend($ty::write_types()); )* + vec + } } }; } diff --git a/crates/bevy_legion/legion_systems/src/system.rs b/crates/bevy_legion/legion_systems/src/system.rs index 94a72ee208..68c96f4f1a 100644 --- a/crates/bevy_legion/legion_systems/src/system.rs +++ b/crates/bevy_legion/legion_systems/src/system.rs @@ -32,8 +32,8 @@ use legion_core::{ #[derive(Derivative, Debug, Clone)] #[derivative(Default(bound = ""))] pub struct Access { - reads: Vec, - writes: Vec, + pub reads: Vec, + pub writes: Vec, } /// Structure describing the resource and component access conditions of the system. diff --git a/crates/bevy_legion/legion_systems/src/system_fn.rs b/crates/bevy_legion/legion_systems/src/system_fn.rs index 5ef5bbfaac..3fe297ee58 100644 --- a/crates/bevy_legion/legion_systems/src/system_fn.rs +++ b/crates/bevy_legion/legion_systems/src/system_fn.rs @@ -22,8 +22,13 @@ where R: EntityFilter + Sync + 'static, X: ResourceSet + 'static, { - let resource_access: Access = Access::default(); - let component_access: Access = Access::default(); + let mut resource_access: Access = Access::default(); + resource_access.reads.extend(X::read_types().iter()); + resource_access.writes.extend(X::write_types().iter()); + + let mut component_access: Access = Access::default(); + component_access.reads.extend(Q::read_types().iter()); + component_access.writes.extend(Q::write_types().iter()); let run_fn = SystemFnWrapper( move |_, diff --git a/crates/bevy_legion/legion_systems/src/system_fn_types.rs b/crates/bevy_legion/legion_systems/src/system_fn_types.rs index 507ff48d7a..ae79b44357 100644 --- a/crates/bevy_legion/legion_systems/src/system_fn_types.rs +++ b/crates/bevy_legion/legion_systems/src/system_fn_types.rs @@ -1,4 +1,4 @@ -use crate::resource::{PreparedRead, ResourceSet, Resources, Resource, PreparedWrite}; +use crate::resource::{PreparedRead, ResourceSet, Resources, Resource, PreparedWrite, ResourceTypeId}; use std::ops::{Deref, DerefMut}; impl ResourceSet for PreparedRead { @@ -10,6 +10,10 @@ impl ResourceSet for PreparedRead { .unwrap_or_else(|| panic!("Failed to fetch resource!: {}", std::any::type_name::())); PreparedRead::new(resource.deref() as *const T) } + fn read_types() -> Vec { + vec![ResourceTypeId::of::()] + } + fn write_types() -> Vec { Vec::new() } } impl ResourceSet for PreparedWrite { @@ -21,4 +25,10 @@ impl ResourceSet for PreparedWrite { .unwrap_or_else(|| panic!("Failed to fetch resource!: {}", std::any::type_name::())); PreparedWrite::new(resource.deref_mut() as *mut T) } + fn read_types() -> Vec { + Vec::new() + } + fn write_types() -> Vec { + vec![ResourceTypeId::of::()] + } } \ No newline at end of file