diff --git a/Cargo.toml b/Cargo.toml index 1d247d4..9afe1d6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,7 +18,11 @@ exclude = ["examples/*.gif", ".github", "release.md", "run_examples.bat"] [features] default = ["bevy_sprite", "bevy_ui", "bevy_text"] # Enable built-in lenses for Bevy sprites -bevy_sprite = ["bevy/bevy_sprite", "bevy/bevy_render"] +bevy_sprite = [ + "bevy/bevy_sprite", + "bevy/bevy_render", + "bevy/bevy_sprite_render", +] # Enable built-in lenses for Bevy UI bevy_ui = ["bevy/bevy_ui", "bevy/bevy_render"] # Enable built-in lenses for Bevy Text @@ -26,23 +30,45 @@ bevy_text = ["bevy/bevy_text", "bevy/bevy_render", "bevy/bevy_sprite"] [dependencies] # Note: abuse 'bevy_color' to force 'bevy_math/curve' feature, which defines EaseFunction -bevy = { version = "0.16", default-features = false, features = [ "bevy_color", "bevy_asset", "bevy_log" ]} +bevy = { version = "0.17", default-features = false, features = [ + "bevy_color", + "bevy_asset", + "bevy_log", +] } thiserror = "2" [dev-dependencies] -bevy-inspector-egui = { version = "0.31" } +bevy-inspector-egui = { version = "0.34" } [[example]] name = "ambient_light" -required-features = ["bevy_ui", "bevy_text", "bevy/bevy_winit", "bevy/bevy_picking", "bevy/bevy_pbr", "bevy/hdr", "bevy/tonemapping_luts"] +required-features = [ + "bevy_ui", + "bevy_text", + "bevy/bevy_winit", + "bevy/bevy_picking", + "bevy/bevy_pbr", + "bevy/hdr", + "bevy/tonemapping_luts", +] [[example]] name = "follow" -required-features = ["bevy_sprite", "bevy_text", "bevy/bevy_winit", "bevy/bevy_picking"] +required-features = [ + "bevy_sprite", + "bevy_text", + "bevy/bevy_winit", + "bevy/bevy_picking", +] [[example]] name = "menu" -required-features = ["bevy_ui", "bevy_text", "bevy/bevy_winit", "bevy/bevy_picking"] +required-features = [ + "bevy_ui", + "bevy_text", + "bevy/bevy_winit", + "bevy/bevy_picking", +] [[example]] name = "colormaterial_color" @@ -62,15 +88,30 @@ required-features = ["bevy_sprite", "bevy/bevy_winit", "bevy/bevy_picking"] [[example]] name = "ui_position" -required-features = ["bevy_sprite", "bevy_ui", "bevy/bevy_winit", "bevy/bevy_picking"] +required-features = [ + "bevy_sprite", + "bevy_ui", + "bevy/bevy_winit", + "bevy/bevy_picking", +] [[example]] name = "text_color" -required-features = ["bevy_ui", "bevy_text", "bevy/bevy_winit", "bevy/bevy_picking"] +required-features = [ + "bevy_ui", + "bevy_text", + "bevy/bevy_winit", + "bevy/bevy_picking", +] [[example]] name = "sequence" -required-features = ["bevy_sprite", "bevy_text", "bevy/bevy_winit", "bevy/bevy_picking"] +required-features = [ + "bevy_sprite", + "bevy_text", + "bevy/bevy_winit", + "bevy/bevy_picking", +] [workspace] resolver = "2" diff --git a/benchmarks/Cargo.toml b/benchmarks/Cargo.toml index c98da5a..ee5dacf 100644 --- a/benchmarks/Cargo.toml +++ b/benchmarks/Cargo.toml @@ -18,7 +18,7 @@ criterion = { version = "0.5", features = ["html_reports"] } bevy_tweening = { path = "../" } [dependencies.bevy] -version = "0.16" +version = "0.17" default-features = false features = ["bevy_render", "bevy_sprite", "bevy_text", "bevy_ui"] diff --git a/src/lib.rs b/src/lib.rs index 4683e12..3d3102a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1712,7 +1712,7 @@ impl<'a> EntityCommandsTweeningExtensions<'a> for EntityCommands<'a> { } /// Event raised when a [`TweenAnim`] completed. -#[derive(Debug, Clone, Copy, Event)] +#[derive(Debug, Clone, Copy, Event, Message)] pub struct AnimCompletedEvent { /// The entity owning the [`TweenAnim`] which completed. /// @@ -2231,9 +2231,9 @@ impl TweenAnim { let mut to_remove = Vec::with_capacity(anims.len()); world.resource_scope(|world, resolver: Mut| { world.resource_scope( - |world, mut cycle_events: Mut>| { + |world, mut cycle_events: Mut>| { world.resource_scope( - |world, mut anim_events: Mut>| { + |world, mut anim_events: Mut>| { let anim_comp_id = world.component_id::().unwrap(); for ( anim_entity, @@ -2383,8 +2383,8 @@ impl TweenAnim { target_kind: &AnimTargetKind, mut mut_untyped: MutUntyped, target_type_id: &TypeId, - mut cycle_events: Mut>, - mut anim_events: Mut>, + mut cycle_events: Mut>, + mut anim_events: Mut>, ) -> Result { let mut completed_events = Vec::with_capacity(8); @@ -2435,10 +2435,13 @@ impl TweenAnim { if !completed_events.is_empty() { for event in completed_events.drain(..) { // Send buffered event - cycle_events.send(event); + cycle_events.write(event); // Trigger all entity-scoped observers - commands.trigger_targets(event, anim_entity); + commands.trigger(CycleCompletedEvent { + anim_entity, + ..event + }); } } @@ -2450,10 +2453,10 @@ impl TweenAnim { }; // Send buffered event - anim_events.send(event); + anim_events.write(event); // Trigger all entity-scoped observers - commands.trigger_targets(event, anim_entity); + commands.trigger(event); } let ret = StepResult { @@ -2555,8 +2558,8 @@ type ResourceResolver = Box< Entity, &TypeId, Duration, - Mut>, - Mut>, + Mut>, + Mut>, ) -> Result + Send + Sync @@ -2570,8 +2573,8 @@ type AssetResolver = Box< Entity, &TypeId, Duration, - Mut>, - Mut>, + Mut>, + Mut>, ) -> Result + Send + Sync @@ -2619,8 +2622,8 @@ impl TweenResolver { entity: Entity, target_type_id: &TypeId, delta_time: Duration, - mut cycle_events: Mut>, - mut anim_events: Mut>| + mut cycle_events: Mut>, + mut anim_events: Mut>| -> Result { // First, remove the resource R from the world so we can access it mutably in // parallel of the TweenAnim @@ -2667,8 +2670,8 @@ impl TweenResolver { entity: Entity, target_type_id: &TypeId, delta_time: Duration, - mut cycle_events: Mut>, - mut anim_events: Mut>| + mut cycle_events: Mut>, + mut anim_events: Mut>| -> Result { let asset_id = asset_id.typed::(); // First, remove the Assets from the world so we can access it mutably in @@ -2726,8 +2729,8 @@ impl TweenResolver { resource_id: ComponentId, entity: Entity, delta_time: Duration, - cycle_events: Mut>, - anim_events: Mut>, + cycle_events: Mut>, + anim_events: Mut>, ) -> Result { let Some(resolver) = self.resource_resolver.get(&resource_id) else { println!("ERROR: resource not registered {:?}", resource_id); @@ -2753,8 +2756,8 @@ impl TweenResolver { untyped_asset_id: UntypedAssetId, entity: Entity, delta_time: Duration, - cycle_events: Mut>, - anim_events: Mut>, + cycle_events: Mut>, + anim_events: Mut>, ) -> Result { let Some(resolver) = self.asset_resolver.get(&resource_id) else { println!("ERROR: asset not registered {:?}", resource_id); @@ -3118,7 +3121,7 @@ mod tests { ); fn observe_global( - _trigger: Trigger, + _trigger: On, mut count: ResMut>, ) { count.count += 1; @@ -3126,7 +3129,7 @@ mod tests { env.world.add_observer(observe_global); fn observe_entity( - _trigger: Trigger, + _trigger: On, mut count: ResMut>, ) { count.count += 1; @@ -3798,9 +3801,9 @@ mod tests { env.world .resource_scope(|world, resolver: Mut| { world.resource_scope( - |world, mut cycle_events: Mut>| { + |world, mut cycle_events: Mut>| { world.resource_scope( - |world, mut anim_events: Mut>| { + |world, mut anim_events: Mut>| { assert!(resolver .resolve_resource( world, @@ -3828,9 +3831,9 @@ mod tests { env.world .resource_scope(|world, resolver: Mut| { world.resource_scope( - |world, mut cycle_events: Mut>| { + |world, mut cycle_events: Mut>| { world.resource_scope( - |world, mut anim_events: Mut>| { + |world, mut anim_events: Mut>| { assert!(resolver .resolve_resource( world, @@ -3880,9 +3883,9 @@ mod tests { env.world .resource_scope(|world, resolver: Mut| { world.resource_scope( - |world, mut cycle_events: Mut>| { + |world, mut cycle_events: Mut>| { world.resource_scope( - |world, mut anim_events: Mut>| { + |world, mut anim_events: Mut>| { assert!(resolver .resolve_asset( world, @@ -3911,9 +3914,9 @@ mod tests { env.world .resource_scope(|world, resolver: Mut| { world.resource_scope( - |world, mut cycle_events: Mut>| { + |world, mut cycle_events: Mut>| { world.resource_scope( - |world, mut anim_events: Mut>| { + |world, mut anim_events: Mut>| { assert!(resolver .resolve_asset( world, diff --git a/src/plugin.rs b/src/plugin.rs index 418ac5c..72aea92 100644 --- a/src/plugin.rs +++ b/src/plugin.rs @@ -25,8 +25,8 @@ pub struct TweeningPlugin; impl Plugin for TweeningPlugin { fn build(&self, app: &mut App) { app.init_resource::() - .add_event::() - .add_event::() + .add_message::() + .add_message::() .add_systems( Update, animator_system.in_set(AnimationSystem::AnimationUpdate), diff --git a/src/test_utils.rs b/src/test_utils.rs index 04edcea..d7a6519 100644 --- a/src/test_utils.rs +++ b/src/test_utils.rs @@ -5,7 +5,7 @@ use bevy::{ change_detection::DetectChanges as _, component::{Component, Mutable}, entity::Entity, - event::{Event, Events}, + message::{Message, Messages}, system::{IntoSystem, System}, world::{Mut, World}, }, @@ -134,8 +134,8 @@ impl + Default> TestEnv { pub fn new(tweenable: impl Tweenable + 'static) -> Self { let mut world = World::new(); world.init_resource::