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);
/**
* @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 */
explicit Player();

5
src/Magnum/Animation/Player.hpp

@ -31,6 +31,7 @@
#include "Player.h"
#include <functional>
#include <Corrade/Containers/Optional.h>
namespace Magnum { namespace Animation {
@ -70,6 +71,10 @@ template<class T, class K> struct Player<T, K>::Track {
};
#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<T, K>::operator=(Player<T, K>&&) = default;

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

@ -23,6 +23,7 @@
DEALINGS IN THE SOFTWARE.
*/
#include <functional>
#include <sstream>
#include <Corrade/TestSuite/Tester.h>
#include <Corrade/TestSuite/Compare/Numeric.h>
@ -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<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() {
Float value = -1.0f;
Player<Float> player;

Loading…
Cancel
Save