From 28e833203a0d66f0c6d9a82786ed589eb971e3c9 Mon Sep 17 00:00:00 2001 From: hodasemi Date: Wed, 9 Apr 2025 18:25:26 +0200 Subject: [PATCH] Create query-less events --- update_macros/src/update.rs | 53 +++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/update_macros/src/update.rs b/update_macros/src/update.rs index 931487d..fd8d3a3 100644 --- a/update_macros/src/update.rs +++ b/update_macros/src/update.rs @@ -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 EventReader 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::

()) { + 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 )* }) }