diff --git a/src/com/android/launcher2/AllApps3D.java b/src/com/android/launcher2/AllApps3D.java
index c17ad38..bb18870 100644
--- a/src/com/android/launcher2/AllApps3D.java
+++ b/src/com/android/launcher2/AllApps3D.java
@@ -1004,7 +1004,7 @@
             mRes = res;
             mWidth = width;
             mHeight = height;
-            mScript = new ScriptC_Allapps(sRS, mRes, R.raw.allapps_bc, true);
+            mScript = new ScriptC_Allapps(sRS, mRes, R.raw.allapps, true);
 
             initProgramVertex();
             initProgramFragment();
diff --git a/src/com/android/launcher2/ScriptC_Allapps.java b/src/com/android/launcher2/ScriptC_Allapps.java
deleted file mode 100644
index cc1bb49..0000000
--- a/src/com/android/launcher2/ScriptC_Allapps.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.launcher2;
-
-import android.renderscript.*;
-import android.content.res.Resources;
-import android.util.Log;
-
-public class ScriptC_Allapps extends ScriptC {
-    // Constructor
-    public  ScriptC_Allapps(RenderScript rs, Resources resources, int id, boolean isRoot) {
-        super(rs, resources, id, isRoot);
-    }
-
-    private final static int mExportVarIdx_COLUMNS_PER_PAGE_PORTRAIT = 0;
-    private int mExportVar_COLUMNS_PER_PAGE_PORTRAIT;
-    public void set_COLUMNS_PER_PAGE_PORTRAIT(int v) {
-        mExportVar_COLUMNS_PER_PAGE_PORTRAIT = v;
-        setVar(mExportVarIdx_COLUMNS_PER_PAGE_PORTRAIT, v);
-    }
-
-    public int get_COLUMNS_PER_PAGE_PORTRAIT() {
-        return mExportVar_COLUMNS_PER_PAGE_PORTRAIT;
-    }
-
-    private final static int mExportVarIdx_ROWS_PER_PAGE_PORTRAIT = 1;
-    private int mExportVar_ROWS_PER_PAGE_PORTRAIT;
-    public void set_ROWS_PER_PAGE_PORTRAIT(int v) {
-        mExportVar_ROWS_PER_PAGE_PORTRAIT = v;
-        setVar(mExportVarIdx_ROWS_PER_PAGE_PORTRAIT, v);
-    }
-
-    public int get_ROWS_PER_PAGE_PORTRAIT() {
-        return mExportVar_ROWS_PER_PAGE_PORTRAIT;
-    }
-
-    private final static int mExportVarIdx_COLUMNS_PER_PAGE_LANDSCAPE = 2;
-    private int mExportVar_COLUMNS_PER_PAGE_LANDSCAPE;
-    public void set_COLUMNS_PER_PAGE_LANDSCAPE(int v) {
-        mExportVar_COLUMNS_PER_PAGE_LANDSCAPE = v;
-        setVar(mExportVarIdx_COLUMNS_PER_PAGE_LANDSCAPE, v);
-    }
-
-    public int get_COLUMNS_PER_PAGE_LANDSCAPE() {
-        return mExportVar_COLUMNS_PER_PAGE_LANDSCAPE;
-    }
-
-    private final static int mExportVarIdx_ROWS_PER_PAGE_LANDSCAPE = 3;
-    private int mExportVar_ROWS_PER_PAGE_LANDSCAPE;
-    public void set_ROWS_PER_PAGE_LANDSCAPE(int v) {
-        mExportVar_ROWS_PER_PAGE_LANDSCAPE = v;
-        setVar(mExportVarIdx_ROWS_PER_PAGE_LANDSCAPE, v);
-    }
-
-    public int get_ROWS_PER_PAGE_LANDSCAPE() {
-        return mExportVar_ROWS_PER_PAGE_LANDSCAPE;
-    }
-
-    private final static int mExportVarIdx_gIconCount = 4;
-    private int mExportVar_gIconCount;
-    public void set_gIconCount(int v) {
-        mExportVar_gIconCount = v;
-        setVar(mExportVarIdx_gIconCount, v);
-    }
-
-    public int get_gIconCount() {
-        return mExportVar_gIconCount;
-    }
-
-    private final static int mExportVarIdx_gSelectedIconIndex = 5;
-    private int mExportVar_gSelectedIconIndex;
-    public void set_gSelectedIconIndex(int v) {
-        mExportVar_gSelectedIconIndex = v;
-        setVar(mExportVarIdx_gSelectedIconIndex, v);
-    }
-
-    public int get_gSelectedIconIndex() {
-        return mExportVar_gSelectedIconIndex;
-    }
-
-    private final static int mExportVarIdx_gSelectedIconTexture = 6;
-    private Allocation mExportVar_gSelectedIconTexture;
-    public void set_gSelectedIconTexture(Allocation v) {
-        mExportVar_gSelectedIconTexture = v;
-        setVar(mExportVarIdx_gSelectedIconTexture, (v == null) ? 0 : v.getID());
-    }
-
-    public Allocation get_gSelectedIconTexture() {
-        return mExportVar_gSelectedIconTexture;
-    }
-
-    private final static int mExportVarIdx_gHomeButton = 7;
-    private Allocation mExportVar_gHomeButton;
-    public void set_gHomeButton(Allocation v) {
-        mExportVar_gHomeButton = v;
-        setVar(mExportVarIdx_gHomeButton, (v == null) ? 0 : v.getID());
-    }
-
-    public Allocation get_gHomeButton() {
-        return mExportVar_gHomeButton;
-    }
-
-    private final static int mExportVarIdx_gPFTexNearest = 8;
-    private ProgramFragment mExportVar_gPFTexNearest;
-    public void set_gPFTexNearest(ProgramFragment v) {
-        mExportVar_gPFTexNearest = v;
-        setVar(mExportVarIdx_gPFTexNearest, (v == null) ? 0 : v.getID());
-    }
-
-    public ProgramFragment get_gPFTexNearest() {
-        return mExportVar_gPFTexNearest;
-    }
-
-    private final static int mExportVarIdx_gPFTexMip = 9;
-    private ProgramFragment mExportVar_gPFTexMip;
-    public void set_gPFTexMip(ProgramFragment v) {
-        mExportVar_gPFTexMip = v;
-        setVar(mExportVarIdx_gPFTexMip, (v == null) ? 0 : v.getID());
-    }
-
-    public ProgramFragment get_gPFTexMip() {
-        return mExportVar_gPFTexMip;
-    }
-
-    private final static int mExportVarIdx_gPFTexMipAlpha = 10;
-    private ProgramFragment mExportVar_gPFTexMipAlpha;
-    public void set_gPFTexMipAlpha(ProgramFragment v) {
-        mExportVar_gPFTexMipAlpha = v;
-        setVar(mExportVarIdx_gPFTexMipAlpha, (v == null) ? 0 : v.getID());
-    }
-
-    public ProgramFragment get_gPFTexMipAlpha() {
-        return mExportVar_gPFTexMipAlpha;
-    }
-
-    private final static int mExportVarIdx_gPVCurve = 11;
-    private ProgramVertex mExportVar_gPVCurve;
-    public void set_gPVCurve(ProgramVertex v) {
-        mExportVar_gPVCurve = v;
-        setVar(mExportVarIdx_gPVCurve, (v == null) ? 0 : v.getID());
-    }
-
-    public ProgramVertex get_gPVCurve() {
-        return mExportVar_gPVCurve;
-    }
-
-    private final static int mExportVarIdx_gPS = 12;
-    private ProgramStore mExportVar_gPS;
-    public void set_gPS(ProgramStore v) {
-        mExportVar_gPS = v;
-        setVar(mExportVarIdx_gPS, (v == null) ? 0 : v.getID());
-    }
-
-    public ProgramStore get_gPS() {
-        return mExportVar_gPS;
-    }
-
-    private final static int mExportVarIdx_gSMCell = 13;
-    private Mesh mExportVar_gSMCell;
-    public void set_gSMCell(Mesh v) {
-        mExportVar_gSMCell = v;
-        setVar(mExportVarIdx_gSMCell, (v == null) ? 0 : v.getID());
-    }
-
-    public Mesh get_gSMCell() {
-        return mExportVar_gSMCell;
-    }
-
-    private final static int mExportVarIdx_gIconIDs = 14;
-    private Allocation mExportVar_gIconIDs;
-    public void bind_gIconIDs(Allocation v) {
-        mExportVar_gIconIDs = v;
-        if(v == null) bindAllocation(null, mExportVarIdx_gIconIDs);
-        else bindAllocation(v, mExportVarIdx_gIconIDs);
-    }
-
-    public Allocation get_gIconIDs() {
-        return mExportVar_gIconIDs;
-    }
-
-    private final static int mExportVarIdx_gLabelIDs = 15;
-    private Allocation mExportVar_gLabelIDs;
-    public void bind_gLabelIDs(Allocation v) {
-        mExportVar_gLabelIDs = v;
-        if(v == null) bindAllocation(null, mExportVarIdx_gLabelIDs);
-        else bindAllocation(v, mExportVarIdx_gLabelIDs);
-    }
-
-    public Allocation get_gLabelIDs() {
-        return mExportVar_gLabelIDs;
-    }
-
-    private final static int mExportVarIdx_vpConstants = 16;
-    private ScriptField_VpConsts mExportVar_vpConstants;
-    public void bind_vpConstants(ScriptField_VpConsts v) {
-        mExportVar_vpConstants = v;
-        if(v == null) bindAllocation(null, mExportVarIdx_vpConstants);
-        else bindAllocation(v.getAllocation(), mExportVarIdx_vpConstants);
-    }
-
-    public ScriptField_VpConsts get_vpConstants() {
-        return mExportVar_vpConstants;
-    }
-
-    private final static int mExportVarIdx_gTargetPos = 17;
-    private float mExportVar_gTargetPos;
-    public void set_gTargetPos(float v) {
-        mExportVar_gTargetPos = v;
-        setVar(mExportVarIdx_gTargetPos, v);
-    }
-
-    public float get_gTargetPos() {
-        return mExportVar_gTargetPos;
-    }
-
-    private final static int mExportFuncIdx_move = 0;
-    public void invoke_move(float newPos) {
-        FieldPacker move_fp = new FieldPacker(4);
-        move_fp.addF32(newPos);
-        invoke(mExportFuncIdx_move, move_fp);
-    }
-
-    private final static int mExportFuncIdx_moveTo = 1;
-    public void invoke_moveTo(float targetPos) {
-        FieldPacker moveTo_fp = new FieldPacker(4);
-        moveTo_fp.addF32(targetPos);
-        invoke(mExportFuncIdx_moveTo, moveTo_fp);
-    }
-
-    private final static int mExportFuncIdx_setZoom = 2;
-    public void invoke_setZoom(float z, int animate) {
-        FieldPacker setZoom_fp = new FieldPacker(8);
-        setZoom_fp.addF32(z);
-        setZoom_fp.addI32(animate);
-        invoke(mExportFuncIdx_setZoom, setZoom_fp);
-    }
-
-    private final static int mExportFuncIdx_fling = 3;
-    public void invoke_fling(float newPos, float vel) {
-        FieldPacker fling_fp = new FieldPacker(8);
-        fling_fp.addF32(newPos);
-        fling_fp.addF32(vel);
-        invoke(mExportFuncIdx_fling, fling_fp);
-    }
-
-}
-
diff --git a/src/com/android/launcher2/ScriptField_VpConsts.java b/src/com/android/launcher2/ScriptField_VpConsts.java
deleted file mode 100644
index ff183f4..0000000
--- a/src/com/android/launcher2/ScriptField_VpConsts.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.launcher2;
-
-import android.renderscript.*;
-import android.content.res.Resources;
-import android.util.Log;
-import android.renderscript.Element;
-import android.renderscript.FieldPacker;
-import android.renderscript.Float2;
-import android.renderscript.Float4;
-import android.renderscript.RenderScript;
-
-public class ScriptField_VpConsts extends android.renderscript.Script.FieldBase {
-    static public class Item {
-        public static final int sizeof = 48;
-
-        Float4 Position;
-        Float4 ScaleOffset;
-        Float2 BendPos;
-        Float2 ImgSize;
-
-        Item() {
-            Position = new Float4();
-            ScaleOffset = new Float4();
-            BendPos = new Float2();
-            ImgSize = new Float2();
-        }
-
-    }
-
-    private Item mItemArray[];
-    private FieldPacker mIOBuffer;
-    public  ScriptField_VpConsts(RenderScript rs, int count) {
-        mItemArray = null;
-        mIOBuffer = null;
-        {
-            Element.Builder eb = new Element.Builder(rs);
-            eb.add(Element.createVector(rs, Element.DataType.FLOAT_32, 4), "Position");
-            eb.add(Element.createVector(rs, Element.DataType.FLOAT_32, 4), "ScaleOffset");
-            eb.add(Element.createVector(rs, Element.DataType.FLOAT_32, 2), "BendPos");
-            eb.add(Element.createVector(rs, Element.DataType.FLOAT_32, 2), "ImgSize");
-            mElement = eb.create();
-        }
-
-        init(rs, count);
-    }
-
-    private void copyToArray(Item i, int index) {
-        if (mIOBuffer == null) mIOBuffer = new FieldPacker(Item.sizeof * mType.getX() /* count */);
-        mIOBuffer.reset(index * Item.sizeof);
-        mIOBuffer.addF32(i.Position);
-        mIOBuffer.addF32(i.ScaleOffset);
-        mIOBuffer.addF32(i.BendPos);
-        mIOBuffer.addF32(i.ImgSize);
-    }
-
-    public void set(Item i, int index, boolean copyNow) {
-        if (mItemArray == null) mItemArray = new Item[mType.getX() /* count */];
-        mItemArray[index] = i;
-        if (copyNow)  {
-            copyToArray(i, index);
-            mAllocation.subData1D(index /** Item.sizeof*/, 1/*Item.sizeof*/, mIOBuffer.getData());
-        }
-
-    }
-
-    public void copyAll() {
-        for (int ct=0; ct < mItemArray.length; ct++) copyToArray(mItemArray[ct], ct);
-        mAllocation.data(mIOBuffer.getData());
-    }
-
-}
-
diff --git a/src/com/android/launcher2/allapps.rs b/src/com/android/launcher2/allapps.rs
new file mode 100644
index 0000000..c13608c
--- /dev/null
+++ b/src/com/android/launcher2/allapps.rs
@@ -0,0 +1,392 @@
+#pragma version(1)
+
+#pragma rs java_package_name(com.android.launcher2)
+
+#include "rs_types.rsh"
+#include "rs_math.rsh"
+#include "rs_graphics.rsh"
+
+#define PI 3.14159f
+
+// Constants from Java
+int COLUMNS_PER_PAGE_PORTRAIT;
+int ROWS_PER_PAGE_PORTRAIT;
+int COLUMNS_PER_PAGE_LANDSCAPE;
+int ROWS_PER_PAGE_LANDSCAPE;
+
+int gIconCount;
+int gSelectedIconIndex = -1;
+rs_allocation gSelectedIconTexture;
+rs_allocation gHomeButton;
+
+rs_program_fragment gPFTexNearest;
+rs_program_fragment gPFTexMip;
+rs_program_fragment gPFTexMipAlpha;
+rs_program_vertex gPVCurve;
+rs_program_store gPS;
+rs_mesh gSMCell;
+
+rs_allocation *gIconIDs;
+rs_allocation *gLabelIDs;
+
+typedef struct VpConsts {
+    float4 Position;
+    float4 ScaleOffset;
+    float2 BendPos;
+    float2 ImgSize;
+} VpConsts_t;
+VpConsts_t *vpConstants;
+
+
+#pragma rs export_var(COLUMNS_PER_PAGE_PORTRAIT, ROWS_PER_PAGE_PORTRAIT, COLUMNS_PER_PAGE_LANDSCAPE, ROWS_PER_PAGE_LANDSCAPE, gIconCount, gSelectedIconIndex, gSelectedIconTexture, gHomeButton, gTargetPos, gPFTexNearest, gPFTexMip, gPFTexMipAlpha, gPVCurve, gPS, gSMCell, gIconIDs, gLabelIDs, vpConstants)
+#pragma rs export_func(move, moveTo, setZoom, fling)
+
+
+// Attraction to center values from page edge to page center.
+static float g_AttractionTable[9] = {20.f, 20.f, 20.f, 10.f, -10.f, -20.f, -20.f, -20.f, -20.f};
+static float g_FrictionTable[9] = {10.f, 10.f, 11.f, 15.f, 15.f, 11.f, 10.f, 10.f, 10.f};
+static float g_PhysicsTableSize = 7;
+
+static float gZoomTarget;
+static float gTargetPos;
+static float g_PosPage = 0.f;
+static float g_PosVelocity = 0.f;
+static float g_LastPositionX = 0.f;
+static bool g_LastTouchDown = false;
+static float g_DT;
+static int64_t g_LastTime;
+static int g_PosMax;
+static float g_Zoom = 0.f;
+static float g_Animation = 1.f;
+static float g_OldPosPage;
+static float g_OldPosVelocity;
+static float g_OldZoom;
+static float g_MoveToTotalTime = 0.2f;
+static float g_MoveToTime = 0.f;
+static float g_MoveToOldPos = 0.f;
+
+static int g_Cols;
+static int g_Rows;
+
+// Drawing constants, should be parameters ======
+#define VIEW_ANGLE 1.28700222f
+
+
+static void updateReadback() {
+    if ((g_OldPosPage != g_PosPage) ||
+        (g_OldPosVelocity != g_PosVelocity) ||
+        (g_OldZoom != g_Zoom)) {
+
+        g_OldPosPage = g_PosPage;
+        g_OldPosVelocity = g_PosVelocity;
+        g_OldZoom = g_Zoom;
+
+        int i[3];
+        i[0] = g_PosPage * (1 << 16);
+        i[1] = g_PosVelocity * (1 << 16);
+        i[2] = g_OldZoom * (1 << 16);
+        rsSendToClient(&i[0], 1, 12, 1);
+    }
+}
+
+void init() {
+}
+
+void move(float newPos) {
+    if (g_LastTouchDown) {
+        float dx = -(newPos - g_LastPositionX);
+        g_PosVelocity = 0;
+        g_PosPage += dx * 5.2f;
+
+        float pmin = -0.49f;
+        float pmax = g_PosMax + 0.49f;
+        g_PosPage = clamp(g_PosPage, pmin, pmax);
+    }
+    g_LastTouchDown = true;
+    g_LastPositionX = newPos;
+    g_MoveToTime = 0;
+}
+
+void moveTo(float targetPos) {
+    gTargetPos = targetPos;
+    g_MoveToTime = g_MoveToTotalTime;
+    g_PosVelocity = 0;
+    g_MoveToOldPos = g_PosPage;
+}
+
+void setZoom(float z, /*bool*/ int animate) {
+    gZoomTarget = z;
+    if (gZoomTarget < 0.001f) {
+        gZoomTarget = 0;
+    }
+    if (!animate) {
+        g_Zoom = gZoomTarget;
+    }
+    updateReadback();
+}
+
+void fling(float newPos, float vel) {
+    move(newPos);
+
+    g_LastTouchDown = false;
+    g_PosVelocity = -vel * 4;
+    float av = fabs(g_PosVelocity);
+    float minVel = 3.5f;
+
+    minVel *= 1.f - (fabs(rsFrac(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 = max(0.f, g_PosVelocity);
+    }
+    if (g_PosPage > g_PosMax) {
+        g_PosVelocity = min(0.f, g_PosVelocity);
+    }
+}
+
+// Interpolates values in the range 0..1 to a curve that eases in
+// and out.
+static float getInterpolation(float input) {
+    return (cos((input + 1) * PI) * 0.5f) + 0.5f;
+}
+
+
+static void updatePos() {
+    if (g_LastTouchDown) {
+        return;
+    }
+
+    float tablePosNorm = rsFrac(g_PosPage + 0.5f);
+    float tablePosF = tablePosNorm * g_PhysicsTableSize;
+    int tablePosI = tablePosF;
+    float tablePosFrac = tablePosF - tablePosI;
+    float accel = mix(g_AttractionTable[tablePosI],
+                        g_AttractionTable[tablePosI + 1],
+                        tablePosFrac) * g_DT;
+    float friction = mix(g_FrictionTable[tablePosI],
+                        g_FrictionTable[tablePosI + 1],
+                        tablePosFrac) * g_DT;
+
+    if (g_MoveToTime) {
+        // New position is old posiition + (total distance) * (interpolated time)
+        g_PosPage = g_MoveToOldPos + (gTargetPos - g_MoveToOldPos) * getInterpolation((g_MoveToTotalTime - g_MoveToTime) / g_MoveToTotalTime);
+        g_MoveToTime -= g_DT;
+        if (g_MoveToTime <= 0) {
+            g_MoveToTime = 0;
+            g_PosPage = gTargetPos;
+        }
+        return;
+    }
+
+    // If our velocity is low OR acceleration is opposing it, apply it.
+    if (fabs(g_PosVelocity) < 4.0f || (g_PosVelocity * accel) < 0) {
+        g_PosVelocity += accel;
+    }
+    //RS_DEBUG(g_PosPage);
+    //RS_DEBUG(g_PosVelocity);
+    //RS_DEBUG(friction);
+    //RS_DEBUG(accel);
+
+    // Normal physics
+    if (g_PosVelocity > 0) {
+        g_PosVelocity -= friction;
+        g_PosVelocity = max(g_PosVelocity, 0.f);
+    } else {
+        g_PosVelocity += friction;
+        g_PosVelocity = min(g_PosVelocity, 0.f);
+    }
+
+    if ((friction > fabs(g_PosVelocity)) && (friction > fabs(accel))) {
+        // Special get back to center and overcome friction physics.
+        float t = tablePosNorm - 0.5f;
+        if (fabs(t) < (friction * g_DT)) {
+            // really close, just snap
+            g_PosPage = round(g_PosPage);
+            g_PosVelocity = 0;
+        } else {
+            if (t > 0) {
+                g_PosVelocity = -friction;
+            } else {
+                g_PosVelocity = friction;
+            }
+        }
+    }
+
+    // Check for out of boundry conditions.
+    if (g_PosPage < 0 && g_PosVelocity < 0) {
+        float damp = 1.0f + (g_PosPage * 4);
+        damp = clamp(damp, 0.f, 0.9f);
+        g_PosVelocity *= damp;
+    }
+    if (g_PosPage > g_PosMax && g_PosVelocity > 0) {
+        float damp = 1.0f - ((g_PosPage - g_PosMax) * 4);
+        damp = clamp(damp, 0.f, 0.9f);
+        g_PosVelocity *= damp;
+    }
+
+    g_PosPage += g_PosVelocity * g_DT;
+    g_PosPage = clamp(g_PosPage, -0.49f, g_PosMax + 0.49f);
+}
+
+static void
+draw_home_button()
+{
+    color(1.0f, 1.0f, 1.0f, 1.0f);
+    rsgBindTexture(gPFTexNearest, 0, gHomeButton);
+
+    float w = rsgGetWidth();
+    float h = rsgGetHeight();
+    float tw = rsAllocationGetDimX(gHomeButton);
+    float th = rsAllocationGetDimY(gHomeButton);
+
+    float x;
+    float y;
+    if (w > h) {
+        x = w - (tw * (1 - g_Animation)) + 20;
+        y = (h - th) * 0.5f;
+    } else {
+        x = (w - tw) / 2;
+        y = -g_Animation * th;
+        y -= 30; // move the house to the edge of the screen as it doesn't fill the texture.
+    }
+
+    rsgDrawSpriteScreenspace(x, y, 0, tw, th);
+}
+
+static void drawFrontGrid(float rowOffset, float p)
+{
+    float h = rsgGetHeight();
+    float w = rsgGetWidth();
+
+    int intRowOffset = rowOffset;
+    float rowFrac = rowOffset - intRowOffset;
+    float colWidth = 120.f;//w / 4;
+    float rowHeight = colWidth + 25.f;
+    float yoff = 0.5f * h + 1.5f * rowHeight;
+
+    int row, col;
+    int colCount = 4;
+    if (w > h) {
+        colCount = 6;
+        rowHeight -= 12.f;
+        yoff = 0.47f * h + 1.0f * rowHeight;
+    }
+
+    int iconNum = (intRowOffset - 5) * colCount;
+
+    rsgBindProgramVertex(gPVCurve);
+
+    vpConstants->Position.z = p;
+
+    color(1.0f, 1.0f, 1.0f, 1.0f);
+    for (row = -5; row < 15; row++) {
+        float y = yoff - ((-rowFrac + row) * rowHeight);
+
+        for (col=0; col < colCount; col++) {
+            if (iconNum >= gIconCount) {
+                return;
+            }
+
+            if (iconNum >= 0) {
+                float x = colWidth * col + (colWidth / 2);
+                vpConstants->Position.x = x + 0.2f;
+
+                if (gSelectedIconIndex == iconNum && !p && gSelectedIconTexture.p) {
+                    rsgBindProgramFragment(gPFTexNearest);
+                    rsgBindTexture(gPFTexNearest, 0, gSelectedIconTexture);
+                    vpConstants->ImgSize.x = rsAllocationGetDimX(gSelectedIconTexture);
+                    vpConstants->ImgSize.y = rsAllocationGetDimY(gSelectedIconTexture);
+                    vpConstants->Position.y = y - (rsAllocationGetDimY(gSelectedIconTexture)
+                                                - rsAllocationGetDimY(gIconIDs[iconNum])) * 0.5f;
+                    rsgDrawMesh(gSMCell);
+                }
+
+                rsgBindProgramFragment(gPFTexMip);
+                vpConstants->ImgSize.x = rsAllocationGetDimX(gIconIDs[iconNum]);
+                vpConstants->ImgSize.y = rsAllocationGetDimY(gIconIDs[iconNum]);
+                vpConstants->Position.y = y - 0.2f;
+                rsgBindTexture(gPFTexMip, 0, gIconIDs[iconNum]);
+                rsgDrawMesh(gSMCell);
+
+                rsgBindProgramFragment(gPFTexMipAlpha);
+                vpConstants->ImgSize.x = rsAllocationGetDimX(gLabelIDs[iconNum]);
+                vpConstants->ImgSize.y = rsAllocationGetDimY(gLabelIDs[iconNum]);
+                vpConstants->Position.y = y - 64.f - 0.2f;
+                rsgBindTexture(gPFTexMipAlpha, 0, gLabelIDs[iconNum]);
+                rsgDrawMesh(gSMCell);
+            }
+            iconNum++;
+        }
+    }
+}
+
+
+int root()
+{
+    // Compute dt in seconds.
+    int64_t newTime = rsUptimeMillis();
+    g_DT = (newTime - g_LastTime) * 0.001f;
+    g_LastTime = newTime;
+
+    // physics may break if DT is large.
+    g_DT = min(g_DT, 0.1f);
+
+    if (g_Zoom != gZoomTarget) {
+        float dz = g_DT * 1.7f;
+        if (gZoomTarget < 0.5f) {
+            dz = -dz;
+        }
+        if (fabs(g_Zoom - gZoomTarget) < fabs(dz)) {
+            g_Zoom = gZoomTarget;
+        } else {
+            g_Zoom += dz;
+        }
+        updateReadback();
+    }
+    g_Animation = pow(1.f - g_Zoom, 3.f);
+
+    // Set clear value to dim the background based on the zoom position.
+    if ((g_Zoom < 0.001f) && (gZoomTarget < 0.001f)) {
+        rsgClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+        // When we're zoomed out and not tracking motion events, reset the pos to 0.
+        if (!g_LastTouchDown) {
+            g_PosPage = 0;
+        }
+        return 0;
+    } else {
+        rsgClearColor(0.0f, 0.0f, 0.0f, g_Zoom);
+    }
+
+    rsgBindProgramStore(gPS);
+
+    // icons & labels
+    if (rsgGetWidth() > rsgGetHeight()) {
+        g_Cols = COLUMNS_PER_PAGE_LANDSCAPE;
+        g_Rows = ROWS_PER_PAGE_LANDSCAPE;
+    } else {
+        g_Cols = COLUMNS_PER_PAGE_PORTRAIT;
+        g_Rows = ROWS_PER_PAGE_PORTRAIT;
+    }
+
+    g_PosMax = ((gIconCount + (g_Cols-1)) / g_Cols) - g_Rows;
+    if (g_PosMax < 0) g_PosMax = 0;
+
+    updatePos();
+    updateReadback();
+
+    // Draw the icons ========================================
+    drawFrontGrid(g_PosPage, g_Animation);
+
+    rsgBindProgramFragment(gPFTexNearest);
+    draw_home_button();
+    return (g_PosVelocity != 0) || rsFrac(g_PosPage) || g_Zoom != gZoomTarget || (g_MoveToTime != 0);
+}
+
+
