Browse Source

Animation: make it possible to advance() multiple players at once.

Just realized that <functional> is 22k in C++11 and 44k lines in C++17.
SAD. EXTREMELY.
pull/297/head
Vladimír Vondruš 8 years ago
parent
commit
e74749043c
  1. 7
      src/Magnum/Animation/Player.h
  2. 5
      src/Magnum/Animation/Player.hpp
  3. 23
      src/Magnum/Animation/Test/PlayerTest.cpp

7
src/Magnum/Animation/Player.h

@ -258,6 +258,13 @@ template<class T, class K
*/ */
typedef std::pair<UnsignedInt, K>(*Scaler)(T, K); typedef std::pair<UnsignedInt, K>(*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<std::reference_wrapper<Player<T, K>>> players);
/** @brief Constructor */ /** @brief Constructor */
explicit Player(); explicit Player();

5
src/Magnum/Animation/Player.hpp

@ -31,6 +31,7 @@
#include "Player.h" #include "Player.h"
#include <functional>
#include <Corrade/Containers/Optional.h> #include <Corrade/Containers/Optional.h>
namespace Magnum { namespace Animation { namespace Magnum { namespace Animation {
@ -70,6 +71,10 @@ template<class T, class K> struct Player<T, K>::Track {
}; };
#endif #endif
template<class T, class K> void Player<T, K>::advance(const T time, const std::initializer_list<std::reference_wrapper<Player<T, K>>> players) {
for(Player<T, K>& p: players) p.advance(time);
}
template<class T, class K> Player<T, K>::Player(Player<T, K>&&) = default; template<class T, class K> Player<T, K>::Player(Player<T, K>&&) = default;
template<class T, class K> Player<T, K>& Player<T, K>::operator=(Player<T, K>&&) = default; template<class T, class K> Player<T, K>& Player<T, K>::operator=(Player<T, K>&&) = default;

23
src/Magnum/Animation/Test/PlayerTest.cpp

@ -23,6 +23,7 @@
DEALINGS IN THE SOFTWARE. DEALINGS IN THE SOFTWARE.
*/ */
#include <functional>
#include <sstream> #include <sstream>
#include <Corrade/TestSuite/Tester.h> #include <Corrade/TestSuite/Tester.h>
#include <Corrade/TestSuite/Compare/Numeric.h> #include <Corrade/TestSuite/Compare/Numeric.h>
@ -57,6 +58,7 @@ struct PlayerTest: TestSuite::Tester {
void advancePlayCount(); void advancePlayCount();
void advancePlayCountInfinite(); void advancePlayCountInfinite();
void advanceChrono(); void advanceChrono();
void advanceList();
void advanceZeroDurationStop(); void advanceZeroDurationStop();
void advanceZeroDurationPause(); void advanceZeroDurationPause();
void advanceZeroDurationInfinitePlayCount(); void advanceZeroDurationInfinitePlayCount();
@ -139,6 +141,7 @@ PlayerTest::PlayerTest() {
&PlayerTest::advancePlayCount, &PlayerTest::advancePlayCount,
&PlayerTest::advancePlayCountInfinite, &PlayerTest::advancePlayCountInfinite,
&PlayerTest::advanceChrono, &PlayerTest::advanceChrono,
&PlayerTest::advanceList,
&PlayerTest::advanceZeroDurationStop, &PlayerTest::advanceZeroDurationStop,
&PlayerTest::advanceZeroDurationPause, &PlayerTest::advanceZeroDurationPause,
&PlayerTest::advanceZeroDurationInfinitePlayCount, &PlayerTest::advanceZeroDurationInfinitePlayCount,
@ -759,6 +762,26 @@ void PlayerTest::advanceChrono() {
CORRADE_COMPARE(value, 4.0f); CORRADE_COMPARE(value, 4.0f);
} }
void PlayerTest::advanceList() {
Float valueA = -1.0f, valueB = -1.0f;
Player<std::chrono::nanoseconds, Float> 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<std::chrono::nanoseconds, Float>::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() { void PlayerTest::advanceZeroDurationStop() {
Float value = -1.0f; Float value = -1.0f;
Player<Float> player; Player<Float> player;

Loading…
Cancel
Save