diff --git a/src/api/types/animator.c b/src/api/types/animator.c index da14a533..2701e1d3 100644 --- a/src/api/types/animator.c +++ b/src/api/types/animator.c @@ -14,8 +14,40 @@ int l_lovrAnimatorUpdate(lua_State* L) { return 0; } +int l_lovrAnimatorPlay(lua_State* L) { + Animator* animator = luax_checktype(L, 1, Animator); + const char* animation = luaL_checkstring(L, 2); + lovrAnimatorPlay(animator, animation); + return 0; +} + +int l_lovrAnimatorStop(lua_State* L) { + Animator* animator = luax_checktype(L, 1, Animator); + const char* animation = luaL_checkstring(L, 2); + lovrAnimatorStop(animator, animation); + return 0; +} + +int l_lovrAnimatorPause(lua_State* L) { + Animator* animator = luax_checktype(L, 1, Animator); + const char* animation = luaL_checkstring(L, 2); + lovrAnimatorPause(animator, animation); + return 0; +} + +int l_lovrAnimatorResume(lua_State* L) { + Animator* animator = luax_checktype(L, 1, Animator); + const char* animation = luaL_checkstring(L, 2); + lovrAnimatorResume(animator, animation); + return 0; +} + const luaL_Reg lovrAnimator[] = { { "getAnimationCount", l_lovrAnimatorGetAnimationCount }, { "update", l_lovrAnimatorUpdate }, + { "play", l_lovrAnimatorPlay }, + { "stop", l_lovrAnimatorStop }, + { "pause", l_lovrAnimatorPause }, + { "resume", l_lovrAnimatorResume }, { NULL, NULL } }; diff --git a/src/graphics/animator.c b/src/graphics/animator.c index 189175a5..c79926e2 100644 --- a/src/graphics/animator.c +++ b/src/graphics/animator.c @@ -1,5 +1,11 @@ #include "graphics/animator.h" +static Track* lovrAnimatorEnsureTrack(Animator* animator, const char* animation) { + Track* track = map_get(&animator->timeline, animation); + lovrAssert(track, "Animation '%s' does not exist", animation); + return track; +} + Animator* lovrAnimatorCreate(AnimationData* animationData) { Animator* animator = lovrAlloc(sizeof(Animator), lovrAnimatorDestroy); if (!animator) return NULL; @@ -40,3 +46,25 @@ void lovrAnimatorUpdate(Animator* animator, float dt) { track->time += dt * track->speed * animator->speed; } } + +void lovrAnimatorPlay(Animator* animator, const char* animation) { + Track* track = lovrAnimatorEnsureTrack(animator, animation); + track->playing = true; + track->time = 0; +} + +void lovrAnimatorStop(Animator* animator, const char* animation) { + Track* track = lovrAnimatorEnsureTrack(animator, animation); + track->playing = false; + track->time = 0; +} + +void lovrAnimatorPause(Animator* animator, const char* animation) { + Track* track = lovrAnimatorEnsureTrack(animator, animation); + track->playing = false; +} + +void lovrAnimatorResume(Animator* animator, const char* animation) { + Track* track = lovrAnimatorEnsureTrack(animator, animation); + track->playing = true; +} diff --git a/src/graphics/animator.h b/src/graphics/animator.h index afc7085f..bee17059 100644 --- a/src/graphics/animator.h +++ b/src/graphics/animator.h @@ -25,3 +25,7 @@ Animator* lovrAnimatorCreate(AnimationData* animationData); void lovrAnimatorDestroy(const Ref* ref); int lovrAnimatorGetAnimationCount(Animator* animator); void lovrAnimatorUpdate(Animator* animator, float dt); +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);