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, )*
|
#( #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 {
|
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));
|
// updates.push(Update::new(vec![1].into_iter(), 0));
|
||||||
|
|
||||||
// let q = quote! {
|
// let q = quote! {
|
||||||
|
@ -551,5 +603,6 @@ pub fn update(max_components: usize, max_resources: usize) -> TokenStream {
|
||||||
|
|
||||||
TokenStream::from(quote! {
|
TokenStream::from(quote! {
|
||||||
#( #updates )*
|
#( #updates )*
|
||||||
|
#( #events )*
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue