compositor: Make spring model always use the same time step
This commit is contained in:
+23
-21
@@ -163,34 +163,36 @@ wlsc_spring_update(struct wlsc_spring *spring, uint32_t msec)
|
|||||||
{
|
{
|
||||||
double force, v, current, step;
|
double force, v, current, step;
|
||||||
|
|
||||||
step = (msec - spring->timestamp) / 300.0;
|
step = 0.01;
|
||||||
spring->timestamp = msec;
|
while (4 < msec - spring->timestamp) {
|
||||||
|
current = spring->current;
|
||||||
|
v = current - spring->previous;
|
||||||
|
force = spring->k * (spring->target - current) / 10.0 +
|
||||||
|
(spring->previous - current) - v * spring->friction;
|
||||||
|
|
||||||
current = spring->current;
|
spring->current =
|
||||||
v = current - spring->previous;
|
current + (current - spring->previous) +
|
||||||
force = spring->k * (spring->target - current) / 10.0 +
|
force * step * step;
|
||||||
(spring->previous - current) - v * spring->friction;
|
spring->previous = current;
|
||||||
|
|
||||||
spring->current =
|
|
||||||
current + (current - spring->previous) + force * step * step;
|
|
||||||
spring->previous = current;
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
if (spring->current >= 1.0) {
|
if (spring->current >= 1.0) {
|
||||||
#ifdef TWEENER_BOUNCE
|
#ifdef TWEENER_BOUNCE
|
||||||
spring->current = 2.0 - spring->current;
|
spring->current = 2.0 - spring->current;
|
||||||
spring->previous = 2.0 - spring->previous;
|
spring->previous = 2.0 - spring->previous;
|
||||||
#else
|
#else
|
||||||
spring->current = 1.0;
|
spring->current = 1.0;
|
||||||
spring->previous = 1.0;
|
spring->previous = 1.0;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (spring->current <= 0.0) {
|
if (spring->current <= 0.0) {
|
||||||
spring->current = 0.0;
|
spring->current = 0.0;
|
||||||
spring->previous = 0.0;
|
spring->previous = 0.0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
spring->timestamp += 4;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
WL_EXPORT int
|
WL_EXPORT int
|
||||||
@@ -2070,7 +2072,7 @@ wlsc_compositor_init(struct wlsc_compositor *ec, struct wl_display *display)
|
|||||||
wl_list_init(&ec->output_list);
|
wl_list_init(&ec->output_list);
|
||||||
wl_list_init(&ec->binding_list);
|
wl_list_init(&ec->binding_list);
|
||||||
wl_list_init(&ec->animation_list);
|
wl_list_init(&ec->animation_list);
|
||||||
wlsc_spring_init(&ec->fade.spring, 0.8, 0.0, 0.0);
|
wlsc_spring_init(&ec->fade.spring, 40.0, 1.0, 1.0);
|
||||||
ec->fade.animation.frame = fade_frame;
|
ec->fade.animation.frame = fade_frame;
|
||||||
wl_list_init(&ec->fade.animation.link);
|
wl_list_init(&ec->fade.animation.link);
|
||||||
|
|
||||||
|
|||||||
@@ -684,6 +684,5 @@ shell_init(struct wlsc_compositor *compositor)
|
|||||||
meego_tablet_shell_set_selection_focus;
|
meego_tablet_shell_set_selection_focus;
|
||||||
launch_ux_daemon(shell);
|
launch_ux_daemon(shell);
|
||||||
|
|
||||||
wlsc_spring_init(&compositor->fade.spring, 40.0, 1.0, 1.0);
|
|
||||||
meego_tablet_shell_set_state(shell, STATE_STARTING);
|
meego_tablet_shell_set_state(shell, STATE_STARTING);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user