Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 50 additions & 9 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,31 +18,57 @@ 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
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"
Expand All @@ -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"
Expand Down
2 changes: 1 addition & 1 deletion benchmarks/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"]

Expand Down
65 changes: 34 additions & 31 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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.
///
Expand Down Expand Up @@ -2231,9 +2231,9 @@ impl TweenAnim {
let mut to_remove = Vec::with_capacity(anims.len());
world.resource_scope(|world, resolver: Mut<TweenResolver>| {
world.resource_scope(
|world, mut cycle_events: Mut<Events<CycleCompletedEvent>>| {
|world, mut cycle_events: Mut<Messages<CycleCompletedEvent>>| {
world.resource_scope(
|world, mut anim_events: Mut<Events<AnimCompletedEvent>>| {
|world, mut anim_events: Mut<Messages<AnimCompletedEvent>>| {
let anim_comp_id = world.component_id::<TweenAnim>().unwrap();
for (
anim_entity,
Expand Down Expand Up @@ -2383,8 +2383,8 @@ impl TweenAnim {
target_kind: &AnimTargetKind,
mut mut_untyped: MutUntyped,
target_type_id: &TypeId,
mut cycle_events: Mut<Events<CycleCompletedEvent>>,
mut anim_events: Mut<Events<AnimCompletedEvent>>,
mut cycle_events: Mut<Messages<CycleCompletedEvent>>,
mut anim_events: Mut<Messages<AnimCompletedEvent>>,
) -> Result<StepResult, TweeningError> {
let mut completed_events = Vec::with_capacity(8);

Expand Down Expand Up @@ -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
});
}
}

Expand All @@ -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 {
Expand Down Expand Up @@ -2555,8 +2558,8 @@ type ResourceResolver = Box<
Entity,
&TypeId,
Duration,
Mut<Events<CycleCompletedEvent>>,
Mut<Events<AnimCompletedEvent>>,
Mut<Messages<CycleCompletedEvent>>,
Mut<Messages<AnimCompletedEvent>>,
) -> Result<bool, TweeningError>
+ Send
+ Sync
Expand All @@ -2570,8 +2573,8 @@ type AssetResolver = Box<
Entity,
&TypeId,
Duration,
Mut<Events<CycleCompletedEvent>>,
Mut<Events<AnimCompletedEvent>>,
Mut<Messages<CycleCompletedEvent>>,
Mut<Messages<AnimCompletedEvent>>,
) -> Result<bool, TweeningError>
+ Send
+ Sync
Expand Down Expand Up @@ -2619,8 +2622,8 @@ impl TweenResolver {
entity: Entity,
target_type_id: &TypeId,
delta_time: Duration,
mut cycle_events: Mut<Events<CycleCompletedEvent>>,
mut anim_events: Mut<Events<AnimCompletedEvent>>|
mut cycle_events: Mut<Messages<CycleCompletedEvent>>,
mut anim_events: Mut<Messages<AnimCompletedEvent>>|
-> Result<bool, TweeningError> {
// First, remove the resource R from the world so we can access it mutably in
// parallel of the TweenAnim
Expand Down Expand Up @@ -2667,8 +2670,8 @@ impl TweenResolver {
entity: Entity,
target_type_id: &TypeId,
delta_time: Duration,
mut cycle_events: Mut<Events<CycleCompletedEvent>>,
mut anim_events: Mut<Events<AnimCompletedEvent>>|
mut cycle_events: Mut<Messages<CycleCompletedEvent>>,
mut anim_events: Mut<Messages<AnimCompletedEvent>>|
-> Result<bool, TweeningError> {
let asset_id = asset_id.typed::<A>();
// First, remove the Assets<A> from the world so we can access it mutably in
Expand Down Expand Up @@ -2726,8 +2729,8 @@ impl TweenResolver {
resource_id: ComponentId,
entity: Entity,
delta_time: Duration,
cycle_events: Mut<Events<CycleCompletedEvent>>,
anim_events: Mut<Events<AnimCompletedEvent>>,
cycle_events: Mut<Messages<CycleCompletedEvent>>,
anim_events: Mut<Messages<AnimCompletedEvent>>,
) -> Result<bool, TweeningError> {
let Some(resolver) = self.resource_resolver.get(&resource_id) else {
println!("ERROR: resource not registered {:?}", resource_id);
Expand All @@ -2753,8 +2756,8 @@ impl TweenResolver {
untyped_asset_id: UntypedAssetId,
entity: Entity,
delta_time: Duration,
cycle_events: Mut<Events<CycleCompletedEvent>>,
anim_events: Mut<Events<AnimCompletedEvent>>,
cycle_events: Mut<Messages<CycleCompletedEvent>>,
anim_events: Mut<Messages<AnimCompletedEvent>>,
) -> Result<bool, TweeningError> {
let Some(resolver) = self.asset_resolver.get(&resource_id) else {
println!("ERROR: asset not registered {:?}", resource_id);
Expand Down Expand Up @@ -3118,15 +3121,15 @@ mod tests {
);

fn observe_global(
_trigger: Trigger<CycleCompletedEvent>,
_trigger: On<CycleCompletedEvent>,
mut count: ResMut<Count<CycleCompletedEvent, GlobalMarker>>,
) {
count.count += 1;
}
env.world.add_observer(observe_global);

fn observe_entity(
_trigger: Trigger<CycleCompletedEvent>,
_trigger: On<CycleCompletedEvent>,
mut count: ResMut<Count<CycleCompletedEvent>>,
) {
count.count += 1;
Expand Down Expand Up @@ -3798,9 +3801,9 @@ mod tests {
env.world
.resource_scope(|world, resolver: Mut<TweenResolver>| {
world.resource_scope(
|world, mut cycle_events: Mut<Events<CycleCompletedEvent>>| {
|world, mut cycle_events: Mut<Messages<CycleCompletedEvent>>| {
world.resource_scope(
|world, mut anim_events: Mut<Events<AnimCompletedEvent>>| {
|world, mut anim_events: Mut<Messages<AnimCompletedEvent>>| {
assert!(resolver
.resolve_resource(
world,
Expand Down Expand Up @@ -3828,9 +3831,9 @@ mod tests {
env.world
.resource_scope(|world, resolver: Mut<TweenResolver>| {
world.resource_scope(
|world, mut cycle_events: Mut<Events<CycleCompletedEvent>>| {
|world, mut cycle_events: Mut<Messages<CycleCompletedEvent>>| {
world.resource_scope(
|world, mut anim_events: Mut<Events<AnimCompletedEvent>>| {
|world, mut anim_events: Mut<Messages<AnimCompletedEvent>>| {
assert!(resolver
.resolve_resource(
world,
Expand Down Expand Up @@ -3880,9 +3883,9 @@ mod tests {
env.world
.resource_scope(|world, resolver: Mut<TweenResolver>| {
world.resource_scope(
|world, mut cycle_events: Mut<Events<CycleCompletedEvent>>| {
|world, mut cycle_events: Mut<Messages<CycleCompletedEvent>>| {
world.resource_scope(
|world, mut anim_events: Mut<Events<AnimCompletedEvent>>| {
|world, mut anim_events: Mut<Messages<AnimCompletedEvent>>| {
assert!(resolver
.resolve_asset(
world,
Expand Down Expand Up @@ -3911,9 +3914,9 @@ mod tests {
env.world
.resource_scope(|world, resolver: Mut<TweenResolver>| {
world.resource_scope(
|world, mut cycle_events: Mut<Events<CycleCompletedEvent>>| {
|world, mut cycle_events: Mut<Messages<CycleCompletedEvent>>| {
world.resource_scope(
|world, mut anim_events: Mut<Events<AnimCompletedEvent>>| {
|world, mut anim_events: Mut<Messages<AnimCompletedEvent>>| {
assert!(resolver
.resolve_asset(
world,
Expand Down
4 changes: 2 additions & 2 deletions src/plugin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ pub struct TweeningPlugin;
impl Plugin for TweeningPlugin {
fn build(&self, app: &mut App) {
app.init_resource::<TweenResolver>()
.add_event::<CycleCompletedEvent>()
.add_event::<AnimCompletedEvent>()
.add_message::<CycleCompletedEvent>()
.add_message::<AnimCompletedEvent>()
.add_systems(
Update,
animator_system.in_set(AnimationSystem::AnimationUpdate),
Expand Down
20 changes: 10 additions & 10 deletions src/test_utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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},
},
Expand Down Expand Up @@ -134,8 +134,8 @@ impl<T: Component<Mutability = Mutable> + Default> TestEnv<T> {
pub fn new(tweenable: impl Tweenable + 'static) -> Self {
let mut world = World::new();
world.init_resource::<Time>();
world.init_resource::<Events<CycleCompletedEvent>>();
world.init_resource::<Events<AnimCompletedEvent>>();
world.init_resource::<Messages<CycleCompletedEvent>>();
world.init_resource::<Messages<AnimCompletedEvent>>();
world.init_resource::<TweenResolver>();

let mut system = IntoSystem::into_system(crate::plugin::animator_system);
Expand All @@ -154,8 +154,8 @@ impl<T: Component<Mutability = Mutable> + Default> TestEnv<T> {
pub fn empty() -> Self {
let mut world = World::new();
world.init_resource::<Time>();
world.init_resource::<Events<CycleCompletedEvent>>();
world.init_resource::<Events<AnimCompletedEvent>>();
world.init_resource::<Messages<CycleCompletedEvent>>();
world.init_resource::<Messages<AnimCompletedEvent>>();
world.init_resource::<TweenResolver>();

let mut system = IntoSystem::into_system(crate::plugin::animator_system);
Expand Down Expand Up @@ -187,12 +187,12 @@ impl<T: Component<Mutability = Mutable>> TestEnv<T> {
}

// Tick system
self.system.run((), &mut self.world);
let _ = self.system.run((), &mut self.world);

// Update events after system ticked, in case system emitted some events
let mut events = self.world.resource_mut::<Events<CycleCompletedEvent>>();
let mut events = self.world.resource_mut::<Messages<CycleCompletedEvent>>();
events.update();
let mut events = self.world.resource_mut::<Events<AnimCompletedEvent>>();
let mut events = self.world.resource_mut::<Messages<AnimCompletedEvent>>();
events.update();
}

Expand All @@ -217,8 +217,8 @@ impl<T: Component<Mutability = Mutable>> TestEnv<T> {
}

/// Get the emitted event count since last tick.
pub fn event_count<E: Event>(&self) -> usize {
let events = self.world.resource::<Events<E>>();
pub fn event_count<E: Message>(&self) -> usize {
let events = self.world.resource::<Messages<E>>();
events.get_cursor().len(events)
}
}
Loading
Loading