From c469d1ca19a300c3618b84e1af484aa7df772e6a Mon Sep 17 00:00:00 2001 From: bjorn Date: Sat, 4 Nov 2017 15:48:52 -0700 Subject: [PATCH] Animator:isPlaying; Looping fixes; --- src/api/types/animator.c | 9 +++++++++ src/graphics/animator.c | 13 +++++++++++++ src/graphics/animator.h | 3 ++- 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/api/types/animator.c b/src/api/types/animator.c index c0ba9ff4..ca65c935 100644 --- a/src/api/types/animator.c +++ b/src/api/types/animator.c @@ -91,6 +91,14 @@ int l_lovrAnimatorGetDuration(lua_State* L) { return 1; } +int l_lovrAnimatorIsPlaying(lua_State* L) { + Animator* animator = luax_checktype(L, 1, Animator); + const char* animation = luaL_checkstring(L, 2); + bool playing = lovrAnimatorIsPlaying(animator, animation); + lua_pushboolean(L, playing); + return 1; +} + int l_lovrAnimatorIsLooping(lua_State* L) { Animator* animator = luax_checktype(L, 1, Animator); const char* animation = luaL_checkstring(L, 2); @@ -145,6 +153,7 @@ const luaL_Reg lovrAnimator[] = { { "seek", l_lovrAnimatorSeek }, { "tell", l_lovrAnimatorTell }, { "getDuration", l_lovrAnimatorGetDuration }, + { "isPlaying", l_lovrAnimatorIsPlaying }, { "isLooping", l_lovrAnimatorIsLooping }, { "setLooping", l_lovrAnimatorSetLooping }, { "getSpeed", l_lovrAnimatorGetSpeed }, diff --git a/src/graphics/animator.c b/src/graphics/animator.c index 7e71b1c0..120d33f6 100644 --- a/src/graphics/animator.c +++ b/src/graphics/animator.c @@ -1,4 +1,5 @@ #include "graphics/animator.h" +#include "math/math.h" #include static Track* lovrAnimatorEnsureTrack(Animator* animator, const char* animation) { @@ -45,6 +46,9 @@ void lovrAnimatorUpdate(Animator* animator, float dt) { if (track->looping) { track->time = fmodf(track->time, track->animation->duration); + } else if (track->time > track->animation->duration) { + track->time = 0; + track->playing = false; } } } @@ -99,6 +103,10 @@ void lovrAnimatorResume(Animator* animator, const char* animation) { void lovrAnimatorSeek(Animator* animator, const char* animation, float time) { Track* track = lovrAnimatorEnsureTrack(animator, animation); track->time = time; + if (!track->looping) { + track->time = MIN(track->time, track->animation->duration); + track->time = MAX(track->time, 0); + } } float lovrAnimatorTell(Animator* animator, const char* animation) { @@ -111,6 +119,11 @@ float lovrAnimatorGetDuration(Animator* animator, const char* animation) { return track->animation->duration; } +bool lovrAnimatorIsPlaying(Animator* animator, const char* animation) { + Track* track = lovrAnimatorEnsureTrack(animator, animation); + return track->playing; +} + bool lovrAnimatorIsLooping(Animator* animator, const char* animation) { Track* track = lovrAnimatorEnsureTrack(animator, animation); return track->looping; diff --git a/src/graphics/animator.h b/src/graphics/animator.h index c4319df0..dedec81b 100644 --- a/src/graphics/animator.h +++ b/src/graphics/animator.h @@ -28,13 +28,14 @@ void lovrAnimatorUpdate(Animator* animator, float dt); void lovrAnimatorReset(Animator* animator); int lovrAnimatorGetAnimationCount(Animator* animator); const char* lovrAnimatorGetAnimationName(Animator* animator, int index); -float lovrAnimatorGetDuration(Animator* animator, const char* animation); void lovrAnimatorPlay(Animator* animator, const char* animation); void lovrAnimatorStop(Animator* animator, const char* animation); void lovrAnimatorPause(Animator* animator, const char* animation); void lovrAnimatorResume(Animator* animator, const char* animation); void lovrAnimatorSeek(Animator* animator, const char* animation, float time); float lovrAnimatorTell(Animator* animator, const char* animation); +float lovrAnimatorGetDuration(Animator* animator, const char* animation); +bool lovrAnimatorIsPlaying(Animator* animator, const char* animation); bool lovrAnimatorIsLooping(Animator* animator, const char* animation); void lovrAnimatorSetLooping(Animator* animator, const char* animation, bool looping); float lovrAnimatorGetSpeed(Animator* animator, const char* animation);