Create query-less events
This commit is contained in:
parent
4570d408e1
commit
28e833203a
1 changed files with 53 additions and 0 deletions
|
@ -308,6 +308,50 @@ impl Update {
|
|||
#( #resource_types: ResourceTrait, )*
|
||||
}
|
||||
}
|
||||
|
||||
pub fn resource_only_events(&self) -> TokenStream2 {
|
||||
let resource_types = self.resource_types();
|
||||
let resource_type_impls = self.resource_type_impls();
|
||||
|
||||
let resources = if self.resources.is_empty() {
|
||||
quote! {}
|
||||
} else {
|
||||
let resources = &self.resources;
|
||||
|
||||
quote! {
|
||||
#( &mut #resources, )*
|
||||
}
|
||||
};
|
||||
|
||||
let reource_requirement = self.reource_requirement();
|
||||
let (resource_store, resource_idents) = self.resource_store();
|
||||
|
||||
quote! {
|
||||
impl<P, Func, #resource_type_impls> EventReader<P, (), #resource_types, Func, ()> for Events
|
||||
where
|
||||
Func: Fn(&P, &mut Commands, #resources ) -> Result<()> + Send + Sync + Clone + 'static,
|
||||
#reource_requirement
|
||||
P: std::any::Any + Send + Sync,
|
||||
{
|
||||
fn add_reader(&mut self, func: Func) {
|
||||
match self.events.get_mut(&TypeId::of::<P>()) {
|
||||
Some((_, listener)) => listener.push(std::sync::Arc::new(move |world, payload| {
|
||||
let typed_payload: &P = payload.downcast_ref().unwrap();
|
||||
let mut commands = Commands::new(world.now());
|
||||
|
||||
#resource_store
|
||||
func(typed_payload, &mut commands, #( #resource_idents, )*)?;
|
||||
|
||||
commands.apply_deferred(world)?;
|
||||
|
||||
Ok(())
|
||||
})),
|
||||
None => panic!("register event type first!"),
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl ToTokens for Update {
|
||||
|
@ -541,6 +585,14 @@ pub fn update(max_components: usize, max_resources: usize) -> TokenStream {
|
|||
}
|
||||
}
|
||||
|
||||
let mut events = Vec::new();
|
||||
|
||||
for resource_count in resources.iter() {
|
||||
let q = Update::new(vec![1].into_iter(), *resource_count).resource_only_events();
|
||||
|
||||
events.push(q);
|
||||
}
|
||||
|
||||
// updates.push(Update::new(vec![1].into_iter(), 0));
|
||||
|
||||
// let q = quote! {
|
||||
|
@ -551,5 +603,6 @@ pub fn update(max_components: usize, max_resources: usize) -> TokenStream {
|
|||
|
||||
TokenStream::from(quote! {
|
||||
#( #updates )*
|
||||
#( #events )*
|
||||
})
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue