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.
This commit is contained in:
Kristian Høgsberg 2013-06-17 09:15:22 -04:00
parent c24744ec91
commit 7eec9b32f7
2 changed files with 31 additions and 14 deletions

View File

@ -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;
}
}

View File

@ -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 {