diff options
author | Jason Sams <rjsams@android.com> | 2009-10-07 19:58:03 -0700 |
---|---|---|
committer | Jason Sams <rjsams@android.com> | 2009-10-07 19:58:03 -0700 |
commit | 267d4fa58ba38160df9fe33d4ea126fe7e5d6230 (patch) | |
tree | 55cb1f7afe8c3cbb33e75e67398403b89d2673e3 | |
parent | 312df73a1fb84a221a1d1e7fe675f93dbd5230ba (diff) | |
download | android_packages_apps_Trebuchet-267d4fa58ba38160df9fe33d4ea126fe7e5d6230.tar.gz android_packages_apps_Trebuchet-267d4fa58ba38160df9fe33d4ea126fe7e5d6230.tar.bz2 android_packages_apps_Trebuchet-267d4fa58ba38160df9fe33d4ea126fe7e5d6230.zip |
Fix physics bug when the script would go to sleep. The large DT caused the next animation to error. Stop rendering after one frame past last movement.
-rw-r--r-- | res/raw/rollo.c | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/res/raw/rollo.c b/res/raw/rollo.c index bae786d46..87fdd2207 100644 --- a/res/raw/rollo.c +++ b/res/raw/rollo.c @@ -27,6 +27,16 @@ float g_OldPosPage; float g_OldPosVelocity; float g_OldZoom; +int g_DrawLastFrame; +int lastFrame(int draw) { + // We draw one extra frame to work around the last frame post bug. + // We also need to track if we drew the last frame to deal with large DT + // in the physics. + int ret = g_DrawLastFrame | draw; + g_DrawLastFrame = draw; + return ret; // should return draw instead. +} + void updateReadback() { if ((g_OldPosPage != g_PosPage) || (g_OldPosVelocity != g_PosVelocity) || @@ -309,6 +319,16 @@ main(int launchID) g_DT = (newTime - g_LastTime) / 1000.f; g_LastTime = newTime; + if (!g_DrawLastFrame) { + // If we stopped rendering we cannot use DT. + // assume 30fps in this case. + g_DT = 0.033f; + } + if (g_DT > 0.2f) { + // physics may break if DT is large. + g_DT = 0.2f; + } + //debugF("zoom", g_Zoom); if (g_Zoom != state->zoomTarget) { float dz = (state->zoomTarget - g_Zoom) * g_DT * 5; @@ -334,7 +354,7 @@ main(int launchID) if (!g_LastTouchDown) { g_PosPage = 0; } - return 1;//0; + return lastFrame(0); } else if (g_Zoom < 0.85f) { pfClearColor(0.0f, 0.0f, 0.0f, g_Zoom); } else { @@ -356,7 +376,7 @@ main(int launchID) color(1.0f, 1.0f, 1.0f, 0.99f); if (iconCount <= 0) { - return 1; + return lastFrame(0); } int lastIcon = iconCount-1; @@ -404,6 +424,6 @@ main(int launchID) // Bug workaround where the last frame is not always displayed // So we keep rendering until the bug is fixed. - return 1;//(g_PosVelocity != 0) || fracf(g_PosPage) || (g_Zoom != state->zoomTarget); + return lastFrame((g_PosVelocity != 0) || fracf(g_PosPage) || (g_Zoom != state->zoomTarget)); } |