Skip to content

Commit 15dd7b7

Browse files
djeedaiazarmadr
authored andcommitted
Revert "Revert "Carry time delta between tweens in a Sequence (djeedai#39)""
This reverts commit 971edb6.
1 parent 1547ba2 commit 15dd7b7

File tree

1 file changed

+52
-15
lines changed

1 file changed

+52
-15
lines changed

src/tweenable.rs

Lines changed: 52 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -650,28 +650,26 @@ impl<T> Tweenable<T> for Sequence<T> {
650650

651651
fn tick(
652652
&mut self,
653-
delta: Duration,
653+
mut delta: Duration,
654654
target: &mut T,
655655
entity: Entity,
656656
event_writer: &mut EventWriter<TweenCompleted>,
657657
) -> TweenState {
658-
if self.index < self.tweens.len() {
659-
let mut state = TweenState::Active;
660-
self.time = (self.time + delta).min(self.duration);
658+
self.time = (self.time + delta).min(self.duration);
659+
while self.index < self.tweens.len() {
661660
let tween = &mut self.tweens[self.index];
662-
let tween_state = tween.tick(delta, target, entity, event_writer);
663-
if tween_state == TweenState::Completed {
664-
tween.rewind();
665-
self.index += 1;
666-
if self.index >= self.tweens.len() {
667-
state = TweenState::Completed;
668-
self.times_completed = 1;
669-
}
661+
let tween_remaining = tween.duration().mul_f32(1.0 - tween.progress());
662+
if let TweenState::Active = tween.tick(delta, target, entity, event_writer) {
663+
return TweenState::Active;
670664
}
671-
state
672-
} else {
673-
TweenState::Completed
665+
666+
tween.rewind();
667+
delta -= tween_remaining;
668+
self.index += 1;
674669
}
670+
671+
self.times_completed = 1;
672+
TweenState::Completed
675673
}
676674

677675
fn times_completed(&self) -> u32 {
@@ -1265,6 +1263,45 @@ mod tests {
12651263
}
12661264
}
12671265

1266+
/// Test crossing tween boundaries in one tick.
1267+
#[test]
1268+
fn seq_tick_boundaries() {
1269+
let mut seq = Sequence::new((0..3).map(|i| {
1270+
Tween::new(
1271+
EaseMethod::Linear,
1272+
TweeningType::Once,
1273+
Duration::from_secs(1),
1274+
TransformPositionLens {
1275+
start: Vec3::splat(i as f32),
1276+
end: Vec3::splat((i + 1) as f32),
1277+
},
1278+
)
1279+
}));
1280+
let mut transform = Transform::default();
1281+
1282+
// Dummy world and event writer
1283+
let mut world = World::new();
1284+
world.insert_resource(Events::<TweenCompleted>::default());
1285+
let mut system_state: SystemState<EventWriter<TweenCompleted>> =
1286+
SystemState::new(&mut world);
1287+
let mut event_writer = system_state.get_mut(&mut world);
1288+
1289+
// Tick halfway through the first tween, then in one tick:
1290+
// - Finish the first tween
1291+
// - Start and finish the second tween
1292+
// - Start the third tween
1293+
for delta in [0.5, 2.0] {
1294+
seq.tick(
1295+
Duration::from_secs_f32(delta),
1296+
&mut transform,
1297+
Entity::from_raw(0),
1298+
&mut event_writer,
1299+
);
1300+
}
1301+
assert_eq!(seq.index(), 2);
1302+
assert!(transform.translation.abs_diff_eq(Vec3::splat(2.5), 1e-5));
1303+
}
1304+
12681305
/// Sequence::new() and various Sequence-specific methods
12691306
#[test]
12701307
fn seq_iter() {

0 commit comments

Comments
 (0)