@@ -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