From 7eec9b32f74bd571a5817a293f4edfe58a2c4290 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Mon, 17 Jun 2013 09:15:22 -0400 Subject: [PATCH] spring: Make clip behavior configurable When the spring goes outside the envelope, we have a few options for bringing it back: either just let it overshoot, bounce off the limit or just clamp it. Instead of controlling that with #ifdef, let's make it a part of the spring state. --- src/animation.c | 38 ++++++++++++++++++++++++-------------- src/compositor.h | 7 +++++++ 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/src/animation.c b/src/animation.c index ed65739a..57d384d2 100644 --- a/src/animation.c +++ b/src/animation.c @@ -41,6 +41,7 @@ weston_spring_init(struct weston_spring *spring, spring->current = current; spring->previous = current; spring->target = target; + spring->clip = WESTON_SPRING_OVERSHOOT; } WL_EXPORT void @@ -71,22 +72,31 @@ weston_spring_update(struct weston_spring *spring, uint32_t msec) force * step * step; spring->previous = current; -#if 0 - if (spring->current >= 1.0) { -#ifdef TWEENER_BOUNCE - spring->current = 2.0 - spring->current; - spring->previous = 2.0 - spring->previous; -#else - spring->current = 1.0; - spring->previous = 1.0; -#endif + switch (spring->clip) { + case WESTON_SPRING_OVERSHOOT: + break; + + case WESTON_SPRING_CLAMP: + if (spring->current >= 1.0) { + spring->current = 1.0; + spring->previous = 1.0; + } else if (spring->current <= 0.0) { + spring->current = 0.0; + spring->previous = 0.0; + } + break; + + case WESTON_SPRING_BOUNCE: + if (spring->current >= 1.0) { + spring->current = 2.0 - spring->current; + spring->previous = 2.0 - spring->previous; + } else if (spring->current <= 0.0) { + spring->current = -spring->current; + spring->previous = -spring->previous; + } + break; } - if (spring->current <= 0.0) { - spring->current = 0.0; - spring->previous = 0.0; - } -#endif spring->timestamp += 4; } } diff --git a/src/compositor.h b/src/compositor.h index a56bd4de..12ec8e3a 100644 --- a/src/compositor.h +++ b/src/compositor.h @@ -113,6 +113,12 @@ struct weston_animation { struct wl_list link; }; +enum { + WESTON_SPRING_OVERSHOOT, + WESTON_SPRING_CLAMP, + WESTON_SPRING_BOUNCE +}; + struct weston_spring { double k; double friction; @@ -120,6 +126,7 @@ struct weston_spring { double target; double previous; uint32_t timestamp; + uint32_t clip; }; enum {