Implement single queries for tuple entities
This commit is contained in:
parent
7a20347988
commit
c728605684
1 changed files with 276 additions and 0 deletions
|
@ -451,6 +451,282 @@ macro_rules! impl_singleton_update {
|
|||
}
|
||||
|
||||
macro_rules! impl_pair_update {
|
||||
// lhs single
|
||||
(
|
||||
$lhs_id: expr,
|
||||
( [$lhs_little: ident: $lhs_big: ident]$(,)? ),
|
||||
$rhs_id: expr,
|
||||
( $([$rhs_little: ident: $rhs_big: ident]$(,)?)+ )
|
||||
) => {
|
||||
impl ArchetypePair {
|
||||
paste::item! {
|
||||
pub fn [<create_lhs_ $lhs_id _rhs_ $rhs_id>] <F, LeftFilter, RightFilter, $lhs_big, $($rhs_big,)+>
|
||||
(f: F) -> Self
|
||||
where
|
||||
F: Fn(&mut Commands, Query<&mut $lhs_big, LeftFilter>, Query<( $( &mut $rhs_big, )+ ), RightFilter>) -> Result<()> + Send + Sync + Clone + 'static,
|
||||
LeftFilter: CheckFilter + 'static,
|
||||
RightFilter: CheckFilter + 'static,
|
||||
$(
|
||||
$rhs_big: EntityComponent + ComponentDebug,
|
||||
)+
|
||||
$lhs_big: EntityComponent + ComponentDebug,
|
||||
{
|
||||
LeftFilter::verify_dedup::<$lhs_big>();
|
||||
|
||||
$(
|
||||
RightFilter::verify_dedup::<$rhs_big>();
|
||||
)+
|
||||
|
||||
Self {
|
||||
check_left_entity: Box::new({
|
||||
move |entity| {
|
||||
if !entity.components.contains::<$lhs_big>() {
|
||||
return false;
|
||||
}
|
||||
|
||||
if !LeftFilter::check(entity) {
|
||||
return false;
|
||||
}
|
||||
|
||||
true
|
||||
}
|
||||
}),
|
||||
check_right_entity: Box::new({
|
||||
move |entity| {
|
||||
$(
|
||||
if !entity.components.contains::<$rhs_big>() {
|
||||
return false;
|
||||
}
|
||||
)+
|
||||
|
||||
if !RightFilter::check(entity) {
|
||||
return false;
|
||||
}
|
||||
|
||||
true
|
||||
}
|
||||
}),
|
||||
|
||||
create_callback: Box::new(move |lhs_entity, rhs_entity| {
|
||||
let $lhs_little = UnsafeComponentStore::from(
|
||||
lhs_entity.get_component::<$lhs_big>()?
|
||||
);
|
||||
|
||||
$(
|
||||
let $rhs_little = UnsafeComponentStore::from(
|
||||
rhs_entity.get_component::<$rhs_big>()?
|
||||
);
|
||||
)+
|
||||
|
||||
let lhs_e = lhs_entity.as_entity();
|
||||
let rhs_e = rhs_entity.as_entity();
|
||||
let f = f.clone();
|
||||
|
||||
Ok(Box::new(move |commands| {
|
||||
let lhs_query = Query {
|
||||
entity: lhs_e,
|
||||
c: unsafe { $lhs_little.as_mut() },
|
||||
filter: PhantomData,
|
||||
};
|
||||
|
||||
let rhs_query = Query {
|
||||
entity: rhs_e,
|
||||
c: unsafe { ($($rhs_little.as_mut(),)+) },
|
||||
filter: PhantomData,
|
||||
};
|
||||
|
||||
f(commands, lhs_query, rhs_query )
|
||||
}))
|
||||
}),
|
||||
|
||||
entities: IndexMap::new(),
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<Func, LhsFilter, RhsFilter, $lhs_big, $($rhs_big,)+> AddUpdates<( $lhs_big, ($($rhs_big,)+) ), (), Func, (LhsFilter, RhsFilter)> for Updates
|
||||
where
|
||||
$(
|
||||
$rhs_big: EntityComponent + ComponentDebug,
|
||||
)+
|
||||
$lhs_big: EntityComponent + ComponentDebug,
|
||||
Func: Fn(&mut Commands, Query<&mut $lhs_big, LhsFilter>, Query<( $( &mut $rhs_big, )+ ), RhsFilter>) -> Result<()> + Send + Sync + Clone + 'static,
|
||||
LhsFilter: CheckFilter + 'static,
|
||||
RhsFilter: CheckFilter + 'static
|
||||
{
|
||||
fn add_update(
|
||||
&mut self,
|
||||
name: &str,
|
||||
priority: u32,
|
||||
func: Func,
|
||||
) -> Result<()> {
|
||||
paste::item! {
|
||||
self.add(name, priority, Update::Pair(ArchetypePair::[<create_lhs_ $lhs_id _rhs_ $rhs_id>](func)))?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
impl<Func, LhsFilter, RhsFilter, $lhs_big, $($rhs_big,)+> AddUpdates<( $lhs_big, ($($rhs_big,)+) ), (), Func, (LhsFilter, RhsFilter)> for WorldBuilder
|
||||
where
|
||||
$(
|
||||
$rhs_big: EntityComponent + ComponentDebug,
|
||||
)+
|
||||
$lhs_big: EntityComponent + ComponentDebug,
|
||||
Func: Fn(&mut Commands, Query<&mut $lhs_big, LhsFilter>, Query<( $( &mut $rhs_big, )+ ), RhsFilter>) -> Result<()> + Send + Sync + Clone + 'static,
|
||||
LhsFilter: CheckFilter + 'static,
|
||||
RhsFilter: CheckFilter + 'static
|
||||
{
|
||||
fn add_update(
|
||||
&mut self,
|
||||
name: &str,
|
||||
priority: u32,
|
||||
func: Func,
|
||||
) -> Result<()> {
|
||||
self.updates.add_update(name, priority, func)
|
||||
}
|
||||
}
|
||||
};
|
||||
// rhs_single
|
||||
(
|
||||
$lhs_id: expr,
|
||||
( $([$lhs_little: ident: $lhs_big: ident]$(,)?)+ ),
|
||||
$rhs_id: expr,
|
||||
( [$rhs_little: ident: $rhs_big: ident]$(,)? )
|
||||
) => {
|
||||
impl ArchetypePair {
|
||||
paste::item! {
|
||||
pub fn [<create_lhs_ $lhs_id _rhs_ $rhs_id>] <F, LeftFilter, RightFilter, $($lhs_big,)+ $rhs_big>
|
||||
(f: F) -> Self
|
||||
where
|
||||
F: Fn(&mut Commands, Query<( $( &mut $lhs_big, )+ ), LeftFilter>, Query<&mut $rhs_big, RightFilter>) -> Result<()> + Send + Sync + Clone + 'static,
|
||||
LeftFilter: CheckFilter + 'static,
|
||||
RightFilter: CheckFilter + 'static,
|
||||
$rhs_big: EntityComponent + ComponentDebug,
|
||||
$(
|
||||
$lhs_big: EntityComponent + ComponentDebug,
|
||||
)+
|
||||
{
|
||||
$(
|
||||
LeftFilter::verify_dedup::<$lhs_big>();
|
||||
)+
|
||||
|
||||
RightFilter::verify_dedup::<$rhs_big>();
|
||||
|
||||
Self {
|
||||
check_left_entity: Box::new({
|
||||
move |entity| {
|
||||
$(
|
||||
if !entity.components.contains::<$lhs_big>() {
|
||||
return false;
|
||||
}
|
||||
)+
|
||||
|
||||
if !LeftFilter::check(entity) {
|
||||
return false;
|
||||
}
|
||||
|
||||
true
|
||||
}
|
||||
}),
|
||||
check_right_entity: Box::new({
|
||||
move |entity| {
|
||||
if !entity.components.contains::<$rhs_big>() {
|
||||
return false;
|
||||
}
|
||||
|
||||
if !RightFilter::check(entity) {
|
||||
return false;
|
||||
}
|
||||
|
||||
true
|
||||
}
|
||||
}),
|
||||
|
||||
create_callback: Box::new(move |lhs_entity, rhs_entity| {
|
||||
$(
|
||||
let $lhs_little = UnsafeComponentStore::from(
|
||||
lhs_entity.get_component::<$lhs_big>()?
|
||||
);
|
||||
)+
|
||||
|
||||
let $rhs_little = UnsafeComponentStore::from(
|
||||
rhs_entity.get_component::<$rhs_big>()?
|
||||
);
|
||||
|
||||
let lhs_e = lhs_entity.as_entity();
|
||||
let rhs_e = rhs_entity.as_entity();
|
||||
let f = f.clone();
|
||||
|
||||
Ok(Box::new(move |commands| {
|
||||
let lhs_query = Query {
|
||||
entity: lhs_e,
|
||||
c: unsafe { ($($lhs_little.as_mut(),)+) },
|
||||
filter: PhantomData,
|
||||
};
|
||||
|
||||
let rhs_query = Query {
|
||||
entity: rhs_e,
|
||||
c: unsafe { $rhs_little.as_mut() },
|
||||
filter: PhantomData,
|
||||
};
|
||||
|
||||
f(commands, lhs_query, rhs_query )
|
||||
}))
|
||||
}),
|
||||
|
||||
entities: IndexMap::new(),
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<Func, LhsFilter, RhsFilter, $( $lhs_big, )+ $rhs_big> AddUpdates<( ($( $lhs_big, )+), $rhs_big ), (), Func, (LhsFilter, RhsFilter)> for Updates
|
||||
where
|
||||
$rhs_big: EntityComponent + ComponentDebug,
|
||||
$(
|
||||
$lhs_big: EntityComponent + ComponentDebug,
|
||||
)+
|
||||
Func: Fn(&mut Commands, Query<( $( &mut $lhs_big, )+ ), LhsFilter>, Query<&mut $rhs_big, RhsFilter>) -> Result<()> + Send + Sync + Clone + 'static,
|
||||
LhsFilter: CheckFilter + 'static,
|
||||
RhsFilter: CheckFilter + 'static
|
||||
{
|
||||
fn add_update(
|
||||
&mut self,
|
||||
name: &str,
|
||||
priority: u32,
|
||||
func: Func,
|
||||
) -> Result<()> {
|
||||
paste::item! {
|
||||
self.add(name, priority, Update::Pair(ArchetypePair::[<create_lhs_ $lhs_id _rhs_ $rhs_id>](func)))?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
impl<Func, LhsFilter, RhsFilter, $( $lhs_big, )+ $rhs_big> AddUpdates<( ($( $lhs_big, )+), $rhs_big ), (), Func, (LhsFilter, RhsFilter)> for WorldBuilder
|
||||
where
|
||||
$rhs_big: EntityComponent + ComponentDebug,
|
||||
$(
|
||||
$lhs_big: EntityComponent + ComponentDebug,
|
||||
)+
|
||||
Func: Fn(&mut Commands, Query<( $( &mut $lhs_big, )+ ), LhsFilter>, Query<&mut $rhs_big, RhsFilter>) -> Result<()> + Send + Sync + Clone + 'static,
|
||||
LhsFilter: CheckFilter + 'static,
|
||||
RhsFilter: CheckFilter + 'static
|
||||
{
|
||||
fn add_update(
|
||||
&mut self,
|
||||
name: &str,
|
||||
priority: u32,
|
||||
func: Func,
|
||||
) -> Result<()> {
|
||||
self.updates.add_update(name, priority, func)
|
||||
}
|
||||
}
|
||||
};
|
||||
(
|
||||
$lhs_id: expr,
|
||||
( $([$lhs_little: ident: $lhs_big: ident]$(,)?)+ ),
|
||||
|
|
Loading…
Reference in a new issue