diff --git a/src/Magnum/Animation/Player.h b/src/Magnum/Animation/Player.h index 471f1afce..01d537a09 100644 --- a/src/Magnum/Animation/Player.h +++ b/src/Magnum/Animation/Player.h @@ -258,6 +258,13 @@ template(*Scaler)(T, K); + /** + * @brief Advance multiple players at the same time + * + * Equivalent to calling @ref advance(T) for each item in @p players. + */ + static void advance(T time, std::initializer_list>> players); + /** @brief Constructor */ explicit Player(); diff --git a/src/Magnum/Animation/Player.hpp b/src/Magnum/Animation/Player.hpp index 7930c9828..efa9336ce 100644 --- a/src/Magnum/Animation/Player.hpp +++ b/src/Magnum/Animation/Player.hpp @@ -31,6 +31,7 @@ #include "Player.h" +#include #include namespace Magnum { namespace Animation { @@ -70,6 +71,10 @@ template struct Player::Track { }; #endif +template void Player::advance(const T time, const std::initializer_list>> players) { + for(Player& p: players) p.advance(time); +} + template Player::Player(Player&&) = default; template Player& Player::operator=(Player&&) = default; diff --git a/src/Magnum/Animation/Test/PlayerTest.cpp b/src/Magnum/Animation/Test/PlayerTest.cpp index 887bef9e1..e8ff25cf9 100644 --- a/src/Magnum/Animation/Test/PlayerTest.cpp +++ b/src/Magnum/Animation/Test/PlayerTest.cpp @@ -23,6 +23,7 @@ DEALINGS IN THE SOFTWARE. */ +#include #include #include #include @@ -57,6 +58,7 @@ struct PlayerTest: TestSuite::Tester { void advancePlayCount(); void advancePlayCountInfinite(); void advanceChrono(); + void advanceList(); void advanceZeroDurationStop(); void advanceZeroDurationPause(); void advanceZeroDurationInfinitePlayCount(); @@ -139,6 +141,7 @@ PlayerTest::PlayerTest() { &PlayerTest::advancePlayCount, &PlayerTest::advancePlayCountInfinite, &PlayerTest::advanceChrono, + &PlayerTest::advanceList, &PlayerTest::advanceZeroDurationStop, &PlayerTest::advanceZeroDurationPause, &PlayerTest::advanceZeroDurationInfinitePlayCount, @@ -759,6 +762,26 @@ void PlayerTest::advanceChrono() { CORRADE_COMPARE(value, 4.0f); } +void PlayerTest::advanceList() { + Float valueA = -1.0f, valueB = -1.0f; + Player a, b; + a.add(Track, valueA) + .play(std::chrono::seconds{2}); + b.add(Track, valueB) + .play(std::chrono::seconds{1}); + + /* 1.75 secs in for A, 2.75 seconds in for B */ + Player::advance(std::chrono::milliseconds{3750}, {a, b}); + CORRADE_COMPARE(a.state(), State::Playing); + CORRADE_COMPARE(b.state(), State::Playing); + CORRADE_COMPARE(a.elapsed(std::chrono::milliseconds{3750}), + std::make_pair(0, 1.75f)); + CORRADE_COMPARE(b.elapsed(std::chrono::milliseconds{3750}), + std::make_pair(0, 2.75f)); + CORRADE_COMPARE(valueA, 4.0f); + CORRADE_COMPARE(valueB, 2.75f); +} + void PlayerTest::advanceZeroDurationStop() { Float value = -1.0f; Player player;