ecs: fix resource borrow safety
This commit is contained in:
parent
17f3860d12
commit
67f1bd66ce
@ -1,7 +1,7 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
resource_query::{FetchResource, ResourceQuery, UnsafeClone},
|
resource_query::{FetchResource, ResourceQuery, UnsafeClone},
|
||||||
system::{System, SystemId, ThreadLocalExecution},
|
system::{System, SystemId, ThreadLocalExecution},
|
||||||
Commands, Resources,
|
Commands, Resources, Res,
|
||||||
};
|
};
|
||||||
use core::marker::PhantomData;
|
use core::marker::PhantomData;
|
||||||
use hecs::{
|
use hecs::{
|
||||||
@ -83,10 +83,14 @@ macro_rules! impl_into_foreach_system {
|
|||||||
name: core::any::type_name::<Self>().into(),
|
name: core::any::type_name::<Self>().into(),
|
||||||
id,
|
id,
|
||||||
func: move |commands, world, resources| {
|
func: move |commands, world, resources| {
|
||||||
|
<<($($resource,)*) as ResourceQuery>::Fetch as FetchResource>::borrow(&resources.resource_archetypes);
|
||||||
|
{
|
||||||
let ($($resource,)*) = resources.query_system::<($($resource,)*)>(id);
|
let ($($resource,)*) = resources.query_system::<($($resource,)*)>(id);
|
||||||
for ($($component,)*) in world.query::<($($component,)*)>().iter() {
|
for ($($component,)*) in world.query::<($($component,)*)>().iter() {
|
||||||
fn_call!(self, ($($commands, commands)*), ($($resource),*), ($($component),*))
|
fn_call!(self, ($($commands, commands)*), ($($resource),*), ($($component),*))
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
<<($($resource,)*) as ResourceQuery>::Fetch as FetchResource>::release(&resources.resource_archetypes);
|
||||||
},
|
},
|
||||||
init_func: move |resources| {
|
init_func: move |resources| {
|
||||||
<($($resource,)*)>::initialize(resources, Some(id));
|
<($($resource,)*)>::initialize(resources, Some(id));
|
||||||
@ -146,6 +150,8 @@ macro_rules! impl_into_query_system {
|
|||||||
id,
|
id,
|
||||||
name: core::any::type_name::<Self>().into(),
|
name: core::any::type_name::<Self>().into(),
|
||||||
func: move |commands, world, resources| {
|
func: move |commands, world, resources| {
|
||||||
|
<<($($resource,)*) as ResourceQuery>::Fetch as FetchResource>::borrow(&resources.resource_archetypes);
|
||||||
|
{
|
||||||
let ($($resource,)*) = resources.query_system::<($($resource,)*)>(id);
|
let ($($resource,)*) = resources.query_system::<($($resource,)*)>(id);
|
||||||
$(let $query = Query::<$query> {
|
$(let $query = Query::<$query> {
|
||||||
world,
|
world,
|
||||||
@ -153,6 +159,8 @@ macro_rules! impl_into_query_system {
|
|||||||
};)*
|
};)*
|
||||||
|
|
||||||
fn_call!(self, ($($commands, commands)*), ($($resource),*), ($($query),*))
|
fn_call!(self, ($($commands, commands)*), ($($resource),*), ($($query),*))
|
||||||
|
}
|
||||||
|
<<($($resource,)*) as ResourceQuery>::Fetch as FetchResource>::release(&resources.resource_archetypes);
|
||||||
},
|
},
|
||||||
init_func: move |resources| {
|
init_func: move |resources| {
|
||||||
<($($resource,)*)>::initialize(resources, Some(id));
|
<($($resource,)*)>::initialize(resources, Some(id));
|
||||||
|
Loading…
Reference in New Issue
Block a user