Implement dark background, adjust spacing, remove skia scaling for performance during zoom.
diff --git a/res/raw/rollo.c b/res/raw/rollo.c
index 98e5738..5dcb16c 100644
--- a/res/raw/rollo.c
+++ b/res/raw/rollo.c
@@ -17,8 +17,9 @@
int g_LastTouchDown;
float g_DT;
int g_LastTime;
-int g_Rendering;
int g_PageCount;
+float g_Zoom;
+float g_ZoomTarget;
// Drawing constants, should be parameters ======
#define VIEW_ANGLE 1.28700222f
@@ -48,17 +49,8 @@
g_PosPage = 0;
g_LastTouchDown = 0;
g_LastPositionX = 0;
-}
-
-void clampPosition() {
- if (g_PosPage < 0) {
- g_PosPage = 0;
- g_PosVelocity = 0;
- }
- if (g_PosPage > (g_PageCount - 1)) {
- g_PosPage = (g_PageCount - 1);
- g_PosVelocity = 0;
- }
+ g_Zoom = 0;
+ g_ZoomTarget = 0;
}
void move() {
@@ -66,31 +58,44 @@
float dx = -(state->newPositionX - g_LastPositionX);
g_PosVelocity = 0;
g_PosPage += dx;
+
+ float pmin = -0.25f;
+ float pmax = (g_PageCount - 1) + 0.25f;
+ g_PosPage = clampf(g_PosPage, pmin, pmax);
}
g_LastTouchDown = state->newTouchDown;
g_LastPositionX = state->newPositionX;
- clampPosition();
}
void fling() {
g_LastTouchDown = 0;
g_PosVelocity = -state->flingVelocityX;
+ float av = fabsf(g_PosVelocity);
+ float minVel = 3f;
+
+ minVel *= 1.f - (fabsf(fracf(g_PosPage + 0.5f) - 0.5f) * 0.45f);
+
+ if (av < minVel && av > 0.2f) {
+ if (g_PosVelocity > 0) {
+ g_PosVelocity = minVel;
+ } else {
+ g_PosVelocity = -minVel;
+ }
+ }
+
if (g_PosPage <= 0) {
g_PosVelocity = maxf(0, g_PosVelocity);
}
if (g_PosPage > (g_PageCount - 1)) {
- g_PosVelocity = minf(0, (g_PageCount - 1) - g_PosPage);
+ g_PosVelocity = minf(0, g_PosVelocity);
}
+ //g_Zoom += (maxf(fabsf(g_PosVelocity), 3) - 3) / 2.f;
}
-int g_lastFrameTime = 0;
-void print_frame_rate()
-{
- int now = uptimeMillis();
- if (g_lastFrameTime != 0) {
- debugI32("frame_rate", 1000/(now-g_lastFrameTime));
- }
- g_lastFrameTime = now;
+
+void setZoomTarget() {
+ g_ZoomTarget = state->zoom;
+ //debugF("zoom target", g_ZoomTarget);
}
int
@@ -136,7 +141,11 @@
//debugF(" accel", accel);
//debugF(" friction", friction);
- g_PosVelocity += accel;
+ // If our velocity is low OR acceleration is opposing it, apply it.
+ if (fabsf(g_PosVelocity) < 0.5f || (g_PosVelocity * accel) < 0) {
+ g_PosVelocity += accel;
+ }
+
if ((friction > fabsf(g_PosVelocity)) && (friction > fabsf(accel))) {
// Special get back to center and overcome friction physics.
float t = tablePosNorm - 0.5f;
@@ -155,14 +164,10 @@
// Normal physics
if (g_PosVelocity > 0) {
g_PosVelocity -= friction;
- if (g_PosVelocity < 0) {
- g_PosVelocity = 0;
- }
+ g_PosVelocity = maxf(g_PosVelocity, 0);
} else {
g_PosVelocity += friction;
- if (g_PosVelocity > 0) {
- g_PosVelocity = 0;
- }
+ g_PosVelocity = minf(g_PosVelocity, 0);
}
}
g_PosPage += g_PosVelocity * g_DT;
@@ -187,22 +192,21 @@
}
void
-draw_page(int icon, int lastIcon, float centerAngle)
+draw_page(int icon, int lastIcon, float centerAngle, float scale)
{
int row;
int col;
//debugF("center angle", centerAngle);
- float scale = 1.0f - state->zoom;
float iconTextureWidth = ICON_WIDTH_PX / (float)ICON_TEXTURE_WIDTH_PX;
float iconTextureHeight = ICON_HEIGHT_PX / (float)ICON_TEXTURE_HEIGHT_PX;
float iconWidthAngle = VIEW_ANGLE * ICON_WIDTH_PX / SCREEN_WIDTH_PX;
- float columnGutterAngle = iconWidthAngle * 0.70f;
+ float columnGutterAngle = iconWidthAngle * 0.9f;
float farIconSize = FAR_ICON_SIZE;
- float iconGutterHeight = farIconSize * 1.1f;
+ float iconGutterHeight = farIconSize * 1.3f;
float farIconTextureSize = far_size(2 * ICON_TEXTURE_WIDTH_PX / (float)SCREEN_WIDTH_PX);
@@ -216,9 +220,8 @@
float angle = centerAngle;
angle -= (columnGutterAngle + iconWidthAngle) * 1.5f;
- float iconTop = (farIconSize + iconGutterHeight) * (2.0f + ICON_TOP_OFFSET)
+ float iconTop = (farIconSize + iconGutterHeight) * (1.85f + ICON_TOP_OFFSET)
- row * (farIconSize + iconGutterHeight);
- iconTop -= 6 * scale; // make the zoom point below center
float iconBottom = iconTop - farIconSize;
float labelTop = iconBottom - (.1 * farLabelHeight);
@@ -233,14 +236,18 @@
float cosine = cosf(angle);
float centerX = sine * RADIUS;
- float centerZ = cosine * RADIUS;
- centerZ -= ((RADIUS+2+1)*scale); // 2 is camera loc, 1 put it slightly behind that.
+ float centerZ = cosine * RADIUS / scale;
+
+ if (scale > 1.f) {
+ centerX *= scale;
+ }
float iconLeftX = centerX - (cosine * farIconTextureSize * .5);
float iconRightX = centerX + (cosine * farIconTextureSize * .5);
float iconLeftZ = centerZ + (sine * farIconTextureSize * .5);
float iconRightZ = centerZ - (sine * farIconTextureSize * .5);
+ color(1.0f, 1.0f, 1.0f, 0.99f);
if (state->selectedIconIndex == icon) {
bindTexture(NAMED_PF, 0, state->selectedIconTexture);
drawQuadTexCoords(
@@ -258,7 +265,11 @@
}
// label
- if (scale <= 0.1f) {
+ if (scale < 1.2f) {
+ float a = maxf(scale, 1.0f);
+ a = (1.2f - a) * 5;
+ color(1.0f, 1.0f, 1.0f, a);
+
float labelLeftX = centerX - farLabelWidth * 0.5f;
float labelRightX = centerX + farLabelWidth * 0.5f;
@@ -279,19 +290,41 @@
int
main(int launchID)
{
- // Clear to transparent
- pfClearColor(0.0f, 0.0f, 0.0f, 0.0f);
-
+ // Compute dt in seconds.
int newTime = uptimeMillis();
g_DT = (newTime - g_LastTime) / 1000.f;
g_LastTime = newTime;
- //debugF("*** dt ", g_DT);
- // If we're not supposed to be showing, don't do anything.
- if (!state->visible) {
- return 0;
+ debugF("zoom", g_Zoom);
+ if (g_Zoom != g_ZoomTarget) {
+ float dz = (g_ZoomTarget - g_Zoom) * g_DT * 5;
+ if (dz && (fabsf(dz) < 0.03f)) {
+ if (dz > 0) {
+ dz = 0.03f;
+ } else {
+ dz = -0.03f;
+ }
+ }
+ if (fabsf(g_Zoom - g_ZoomTarget) < fabsf(dz)) {
+ g_Zoom = g_ZoomTarget;
+ } else {
+ g_Zoom += dz;
+ }
}
+ // Set clear value to dim the background based on the zoom position.
+ if (g_Zoom < 0.8f) {
+ pfClearColor(0.0f, 0.0f, 0.0f, g_Zoom);
+ if (g_Zoom == 0) {
+ // Nothing else to do if fully zoomed out.
+ return 1;
+ }
+ } else {
+ pfClearColor(0.0f, 0.0f, 0.0f, 0.80f);
+ }
+
+
+
// icons & labels
int iconCount = state->iconCount;
g_PageCount = count_pages(iconCount);
@@ -318,27 +351,12 @@
int iconsPerPage = COLUMNS_PER_PAGE * ROWS_PER_PAGE;
int icon = clamp(iconsPerPage * page, 0, lastIcon);
- draw_page(icon, lastIcon, -VIEW_ANGLE*currentPagePosition);
- draw_page(icon+iconsPerPage, lastIcon, (-VIEW_ANGLE*currentPagePosition)+VIEW_ANGLE);
+ float scale = (1 / g_Zoom);
+ float pageAngle = VIEW_ANGLE * 1.2f;
+ draw_page(icon, lastIcon, -pageAngle*currentPagePosition, scale);
+ draw_page(icon+iconsPerPage, lastIcon, (-pageAngle*currentPagePosition)+pageAngle, scale);
- // Draw the border lines for debugging ========================================
- /*
- bindProgramVertex(NAMED_PVOrtho);
- bindProgramFragment(NAMED_PFText);
- bindProgramFragmentStore(NAMED_PFSText);
-
- color(1.0f, 1.0f, 0.0f, 0.99f);
- int i;
- for (i=0; i<ROWS_PER_PAGE+1; i++) {
- int y = loadI32(ALLOC_Y_BORDERS, i);
- drawRect(0, y, SCREEN_WIDTH_PX, y+1, 0.0f);
- }
- for (i=0; i<COLUMNS_PER_PAGE+1; i++) {
- int x = loadI32(ALLOC_X_BORDERS, i);
- drawRect(x, 0, x+1, SCREEN_HEIGHT_PX, 0.0f);
- }
- */
// Draw the scroll handle ========================================
/*
@@ -350,13 +368,8 @@
drawRect(handleLeft, handleTop, handleLeft+handleWidth, handleTop+handleHeight, 0.0f);
*/
- //print_frame_rate();
-
// Bug workaround where the last frame is not always displayed
- // So we render the last frame twice.
- int rendering = g_Rendering;
- g_Rendering = (g_PosVelocity != 0) || fracf(g_PosPage);
- rendering |= g_Rendering;
- return rendering;
+ // So we keep rendering until the bug is fixed.
+ return 1;//(g_PosVelocity != 0) || fracf(g_PosPage);
}