Browse Source

Animation: pass Key to player callbacks by value, not as const&.

It was passed by value everywhere else, but not here. Weird. This is a
breaking change, you need to update all your callbacks from e.g.

    [](const Float&, const Vector2&, T&) { ... }

to

    [](Float, const Vector2&, T&) { ... }

Fortunately I caught this soon enough before the release, this would be
annoying to change later.
pull/268/merge
Vladimír Vondruš 8 years ago
parent
commit
d5fcfd82ec
  1. 10
      doc/snippets/MagnumAnimation.cpp
  2. 32
      src/Magnum/Animation/Player.h
  3. 2
      src/Magnum/Animation/Test/Benchmark.cpp
  4. 8
      src/Magnum/Animation/Test/PlayerTest.cpp

10
doc/snippets/MagnumAnimation.cpp

@ -72,15 +72,15 @@ Object3D* object;
Animation::Player<Float> player;
player.addWithCallback(scaling,
[](const Float&, const Vector3& scaling, Object3D& object) {
[](Float, const Vector3& scaling, Object3D& object) {
object.setScaling(scaling);
}, *object);
player.addWithCallback(rotation,
[](const Float&, const Quaternion& rotation, Object3D& object) {
[](Float, const Quaternion& rotation, Object3D& object) {
object.setRotation(rotation);
}, *object);
player.addWithCallback(translation,
[](const Float&, const Vector3& translation, Object3D& object) {
[](Float, const Vector3& translation, Object3D& object) {
object.setTranslation(translation);
}, *object);
/* [Player-usage-callback] */
@ -134,7 +134,7 @@ Animation::State state;
Animation::Player<Float> controller;
controller.addWithCallbackOnChange(stateTrack,
[](const Float&, const Animation::State& state, Data& data) {
[](Float, const Animation::State& state, Data& data) {
data.player.setState(state, data.timeline.previousFrameTime());
}, state, data);
/* [Player-higher-order] */
@ -155,7 +155,7 @@ Animation::Track<Float, Float> timeTrack{{
Animation::Player<Float> timer;
timer.addWithCallback(timeTrack,
[](const Float&, const Float& time, Animation::Player<Float>& player) {
[](Float, const Float& time, Animation::Player<Float>& player) {
player.advance(time);
}, player);

32
src/Magnum/Animation/Player.h

@ -414,7 +414,7 @@ template<class T, class K
* @see @ref addRawCallback()
*/
#ifdef DOXYGEN_GENERATING_OUTPUT
template<class V, class R> Player<T, K>& addWithCallback(const TrackView<K, V, R>& track, void(*callback)(const K&, const R&, void*), void* userData = nullptr);
template<class V, class R> Player<T, K>& addWithCallback(const TrackView<K, V, R>& track, void(*callback)(K, const R&, void*), void* userData = nullptr);
#else
/* Otherwise the user would be forced to use the + operator to convert
a lambda to a function pointer and (besides being weird and
@ -431,7 +431,7 @@ template<class T, class K
* whole lifetime of the @ref Player instance.
*/
#ifdef DOXYGEN_GENERATING_OUTPUT
template<class V, class R> Player<T, K>& addWithCallback(const Track<K, V, R>& track, void(*callback)(const K&, const R&, void*), void* userData = nullptr);
template<class V, class R> Player<T, K>& addWithCallback(const Track<K, V, R>& track, void(*callback)(K, const R&, void*), void* userData = nullptr);
#elif !defined(CORRADE_MSVC2017_COMPATIBILITY) /* See above why */
template<class V, class R, class Callback> Player<T, K>& addWithCallback(const Track<K, V, R>& track, Callback callback, void* userData = nullptr) {
return addWithCallback(TrackView<K, V, R>{track}, callback, userData);
@ -452,7 +452,7 @@ template<class T, class K
* @ref addRawCallback() for optimization possibilities.
*/
#ifdef DOXYGEN_GENERATING_OUTPUT
template<class V, class R, class U> Player<T, K>& addWithCallback(const TrackView<K, V, R>& track, void(*callback)(const K&, const R&, U&), U& userData);
template<class V, class R, class U> Player<T, K>& addWithCallback(const TrackView<K, V, R>& track, void(*callback)(K, const R&, U&), U& userData);
#else /* See above why */
template<class V, class R, class U, class Callback> Player<T, K>& addWithCallback(const TrackView<K, V, R>& track, Callback callback, U& userData);
#endif
@ -464,7 +464,7 @@ template<class T, class K
* whole lifetime of the @ref Player instance.
*/
#ifdef DOXYGEN_GENERATING_OUTPUT
template<class V, class R, class U> Player<T, K>& addWithCallback(const Track<K, V, R>& track, void(*callback)(const K&, const R&, U&), U& userData);
template<class V, class R, class U> Player<T, K>& addWithCallback(const Track<K, V, R>& track, void(*callback)(K, const R&, U&), U& userData);
#elif !defined(CORRADE_MSVC2017_COMPATIBILITY) /* See above why */
template<class V, class R, class U, class Callback> Player<T, K>& addWithCallback(const Track<K, V, R>& track, Callback callback, U& userData) {
return addWithCallback(TrackView<K, V, R>{track}, callback, userData);
@ -491,7 +491,7 @@ template<class T, class K
* @see @ref addRawCallback()
*/
#ifdef DOXYGEN_GENERATING_OUTPUT
template<class V, class R> Player<T, K>& addWithCallbackOnChange(const TrackView<K, V, R>& track, void(*callback)(const K&, const R&, void*), R& destination, void* userData = nullptr);
template<class V, class R> Player<T, K>& addWithCallbackOnChange(const TrackView<K, V, R>& track, void(*callback)(K, const R&, void*), R& destination, void* userData = nullptr);
#else /* See above why */
template<class V, class R, class Callback> Player<T, K>& addWithCallbackOnChange(const TrackView<K, V, R>& track, Callback callback, R& destination, void* userData = nullptr);
#endif
@ -503,7 +503,7 @@ template<class T, class K
* whole lifetime of the @ref Player instance.
*/
#ifdef DOXYGEN_GENERATING_OUTPUT
template<class V, class R> Player<T, K>& addWithCallbackOnChange(const Track<K, V, R>& track, void(*callback)(const K&, const R&, void*), R& destination, void* userData = nullptr);
template<class V, class R> Player<T, K>& addWithCallbackOnChange(const Track<K, V, R>& track, void(*callback)(K, const R&, void*), R& destination, void* userData = nullptr);
#elif !defined(CORRADE_MSVC2017_COMPATIBILITY) /* See above why */
template<class V, class R, class Callback> Player<T, K>& addWithCallbackOnChange(const Track<K, V, R>& track, Callback callback, R& destination, void* userData = nullptr) {
return addWithCallbackOnChange(TrackView<K, V, R>{track}, callback, destination, userData);
@ -524,7 +524,7 @@ template<class T, class K
* @ref addRawCallback() for optimization possibilities.
*/
#ifdef DOXYGEN_GENERATING_OUTPUT
template<class V, class R, class U> Player<T, K>& addWithCallbackOnChange(const TrackView<K, V, R>& track, void(*callback)(const K&, const R&, void*), R& destination, U& userData);
template<class V, class R, class U> Player<T, K>& addWithCallbackOnChange(const TrackView<K, V, R>& track, void(*callback)(K, const R&, void*), R& destination, U& userData);
#else /* See above why */
template<class V, class R, class U, class Callback> Player<T, K>& addWithCallbackOnChange(const TrackView<K, V, R>& track, Callback callback, R& destination, U& userData);
#endif
@ -536,7 +536,7 @@ template<class T, class K
* whole lifetime of the @ref Player instance.
*/
#ifdef DOXYGEN_GENERATING_OUTPUT
template<class V, class R, class U> Player<T, K>& addWithCallbackOnChange(const Track<K, V, R>& track, void(*callback)(const K&, const R&, void*), R& destination, U& userData);
template<class V, class R, class U> Player<T, K>& addWithCallbackOnChange(const Track<K, V, R>& track, void(*callback)(K, const R&, void*), R& destination, U& userData);
#elif !defined(CORRADE_MSVC2017_COMPATIBILITY) /* See above why */
template<class V, class R, class U, class Callback> Player<T, K>& addWithCallbackOnChange(const Track<K, V, R>& track, Callback callback, R& destination, U& userData) {
return addWithCallbackOnChange(TrackView<K, V, R>{track}, callback, destination, userData);
@ -777,43 +777,43 @@ template<class T, class K> template<class V, class R> Player<T, K>& Player<T, K>
#ifndef DOXYGEN_GENERATING_OUTPUT
template<class T, class K> template<class V, class R, class Callback> Player<T, K>& Player<T, K>::addWithCallback(const TrackView<K, V, R>& track, Callback callback, void* userData) {
auto callbackPtr = static_cast<void(*)(const K&, const R&, void*)>(callback);
auto callbackPtr = static_cast<void(*)(K, const R&, void*)>(callback);
return addInternal(track,
[](const TrackViewStorage<K>& track, K key, std::size_t& hint, void*, void(*callback)(), void* userData) {
/** @todo try to use atStrict() if possible */
reinterpret_cast<void(*)(const K&, const R&, void*)>(callback)(key, static_cast<const TrackView<K, V, R>&>(track).at(key, hint), userData);
reinterpret_cast<void(*)(K, const R&, void*)>(callback)(key, static_cast<const TrackView<K, V, R>&>(track).at(key, hint), userData);
}, nullptr, reinterpret_cast<void(*)()>(callbackPtr), userData);
}
template<class T, class K> template<class V, class R, class U, class Callback> Player<T, K>& Player<T, K>::addWithCallback(const TrackView<K, V, R>& track, Callback callback, U& userData) {
auto callbackPtr = static_cast<void(*)(const K&, const R&, U&)>(callback);
auto callbackPtr = static_cast<void(*)(K, const R&, U&)>(callback);
return addInternal(track,
[](const TrackViewStorage<K>& track, K key, std::size_t& hint, void*, void(*callback)(), void* userData) {
/** @todo try to use atStrict() if possible */
reinterpret_cast<void(*)(const K&, const R&, U&)>(callback)(key, static_cast<const TrackView<K, V, R>&>(track).at(key, hint), *static_cast<U*>(userData));
reinterpret_cast<void(*)(K, const R&, U&)>(callback)(key, static_cast<const TrackView<K, V, R>&>(track).at(key, hint), *static_cast<U*>(userData));
}, nullptr, reinterpret_cast<void(*)()>(callbackPtr), &userData);
}
template<class T, class K> template<class V, class R, class Callback> Player<T, K>& Player<T, K>::addWithCallbackOnChange(const TrackView<K, V, R>& track, Callback callback, R& destination, void* userData) {
auto callbackPtr = static_cast<void(*)(const K&, const R&, void*)>(callback);
auto callbackPtr = static_cast<void(*)(K, const R&, void*)>(callback);
return addInternal(track,
[](const TrackViewStorage<K>& track, K key, std::size_t& hint, void* destination, void(*callback)(), void* userData) {
/** @todo try to use atStrict() if possible */
R result = static_cast<const TrackView<K, V, R>&>(track).at(key, hint);
if(result == *static_cast<R*>(destination)) return;
reinterpret_cast<void(*)(const K&, const R&, void*)>(callback)(key, result, userData);
reinterpret_cast<void(*)(K, const R&, void*)>(callback)(key, result, userData);
*static_cast<R*>(destination) = result;
}, &destination, reinterpret_cast<void(*)()>(callbackPtr), userData);
}
template<class T, class K> template<class V, class R, class U, class Callback> Player<T, K>& Player<T, K>::addWithCallbackOnChange(const TrackView<K, V, R>& track, Callback callback, R& destination, U& userData) {
auto callbackPtr = static_cast<void(*)(const K&, const R&, U&)>(callback);
auto callbackPtr = static_cast<void(*)(K, const R&, U&)>(callback);
return addInternal(track,
[](const TrackViewStorage<K>& track, K key, std::size_t& hint, void* destination, void(*callback)(), void* userData) {
/** @todo try to use atStrict() if possible */
R result = static_cast<const TrackView<K, V, R>&>(track).at(key, hint);
if(result == *static_cast<R*>(destination)) return;
reinterpret_cast<void(*)(const K&, const R&, U&)>(callback)(key, result, *static_cast<U*>(userData));
reinterpret_cast<void(*)(K, const R&, U&)>(callback)(key, result, *static_cast<U*>(userData));
*static_cast<R*>(destination) = result;
}, &destination, reinterpret_cast<void(*)()>(callbackPtr), &userData);
}

2
src/Magnum/Animation/Test/Benchmark.cpp

@ -221,7 +221,7 @@ void Benchmark::playerAdvance() {
void Benchmark::playerAdvanceCallback() {
Int result{};
Player<Float> player;
player.addWithCallback(_track, [](const Float&, const Int& value, Int& result) {
player.addWithCallback(_track, [](Float, const Int& value, Int& result) {
result += value;
}, result)
.play({});

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

@ -1076,7 +1076,7 @@ void PlayerTest::addWithCallback() {
Int called = 0;
} data;
Player<Float> player;
player.addWithCallback(Track, [](const Float&, const Float& value, void* userData) {
player.addWithCallback(Track, [](Float, const Float& value, void* userData) {
static_cast<Data*>(userData)->value = value;
++static_cast<Data*>(userData)->called;
}, &data)
@ -1100,7 +1100,7 @@ void PlayerTest::addWithCallbackTemplate() {
Int called = 0;
} data;
Player<Float> player;
player.addWithCallback(Track, [](const Float&, const Float& value, Data& userData) {
player.addWithCallback(Track, [](Float, const Float& value, Data& userData) {
userData.value = value;
++userData.called;
}, data)
@ -1124,7 +1124,7 @@ void PlayerTest::addWithCallbackOnChange() {
Int called = 0;
} data;
Player<Float> player;
player.addWithCallbackOnChange(Track, [](const Float&, const Float& value, void* userData) {
player.addWithCallbackOnChange(Track, [](Float, const Float& value, void* userData) {
static_cast<Data*>(userData)->value = value;
++static_cast<Data*>(userData)->called;
}, data.value, &data)
@ -1158,7 +1158,7 @@ void PlayerTest::addWithCallbackOnChangeTemplate() {
Int called = 0;
} data;
Player<Float> player;
player.addWithCallbackOnChange(Track, [](const Float&, const Float& value, Data& userData) {
player.addWithCallbackOnChange(Track, [](Float, const Float& value, Data& userData) {
userData.value = value;
++userData.called;
}, data.value, data)

Loading…
Cancel
Save