Add support for vert movement.  Very hackish atm.
diff --git a/src/com/android/launcher2/AllAppsView.java b/src/com/android/launcher2/AllAppsView.java
index 732bce3..4d340ca 100644
--- a/src/com/android/launcher2/AllAppsView.java
+++ b/src/com/android/launcher2/AllAppsView.java
@@ -92,10 +92,12 @@
     private VelocityTracker mVelocity;
     private int mTouchTracking;
     private int mLastMotionX;
+    private int mLastMotionY;
     private int mMotionDownRawX;
     private int mMotionDownRawY;
     private int mHomeButtonTop;
     private long mTouchTime;
+    private boolean mRotateMove = true;
 
     static class Defines {
         public static final int ALLOC_PARAMS = 0;
@@ -195,6 +197,8 @@
         return super.onKeyDown(keyCode, event);
     }
 
+    private int mRSMode = 0;
+
     @Override
     public boolean onTouchEvent(MotionEvent ev)
     {
@@ -211,10 +215,13 @@
         int x = (int)ev.getX();
         int y = (int)ev.getY();
 
-        int deltaX;
         int action = ev.getAction();
         switch (action) {
         case MotionEvent.ACTION_DOWN:
+            if (x < 60 && y > 700) {
+                mRotateMove = mRollo.setView((++mRSMode) & 3);
+            }
+
             if (y > mRollo.mTouchYBorders[mRollo.mTouchYBorders.length-1]) {
                 mTouchTracking = TRACKING_HOME;
             } else {
@@ -223,8 +230,13 @@
                 mMotionDownRawX = (int)ev.getRawX();
                 mMotionDownRawY = (int)ev.getRawY();
                 mLastMotionX = x;
+                mLastMotionY = y;
 
-                mRollo.mState.newPositionX = ev.getRawX() / mDefines.SCREEN_WIDTH_PX;
+                if (mRotateMove) {
+                    mRollo.mState.newPositionX = ev.getRawY() / mDefines.SCREEN_WIDTH_PX;
+                } else {
+                    mRollo.mState.newPositionX = ev.getRawX() / mDefines.SCREEN_WIDTH_PX;
+                }
                 mRollo.mState.newTouchDown = 1;
 
                 if (!mRollo.checkClickOK()) {
@@ -233,7 +245,7 @@
                     mRollo.selectIcon(x, y, mRollo.mMessageProc.mPosX);
                 }
                 mRollo.mState.save();
-                mRollo.mInvokeMove.execute();
+                mRollo.move();
                 mVelocity = VelocityTracker.obtain();
                 mVelocity.addMovement(ev);
                 mStartedScrolling = false;
@@ -244,21 +256,31 @@
             if (mTouchTracking == TRACKING_HOME) {
                 // TODO: highlight?
             } else {
-                int slopX = Math.abs(x - mLastMotionX);
+                int slopX;
+                if (mRotateMove) {
+                    slopX = Math.abs(y - mLastMotionY);
+                } else {
+                    slopX = Math.abs(x - mLastMotionX);
+                }
+
                 if (!mStartedScrolling && slopX < mSlopX) {
                     // don't update mLastMotionX so slopX is right and when we do start scrolling
                     // below, we get the right delta.
                 } else {
-                    mRollo.mState.newPositionX = ev.getRawX() / mDefines.SCREEN_WIDTH_PX;
+                    if (mRotateMove) {
+                        mRollo.mState.newPositionX = ev.getRawY() / mDefines.SCREEN_WIDTH_PX;
+                    } else {
+                        mRollo.mState.newPositionX = ev.getRawX() / mDefines.SCREEN_WIDTH_PX;
+                    }
                     mRollo.mState.newTouchDown = 1;
-                    mRollo.mInvokeMove.execute();
+                    mRollo.move();
 
                     mStartedScrolling = true;
                     mRollo.clearSelectedIcon();
-                    deltaX = x - mLastMotionX;
                     mVelocity.addMovement(ev);
                     mRollo.mState.save();
                     mLastMotionX = x;
+                    mLastMotionY = y;
                 }
             }
             break;
@@ -272,14 +294,23 @@
                 }
             } else {
                 mRollo.mState.newTouchDown = 0;
-                mRollo.mState.newPositionX = ev.getRawX() / mDefines.SCREEN_WIDTH_PX;
+                if (mRotateMove) {
+                    mRollo.mState.newPositionX = ev.getRawY() / mDefines.SCREEN_WIDTH_PX;
+                } else {
+                    mRollo.mState.newPositionX = ev.getRawX() / mDefines.SCREEN_WIDTH_PX;
+                }
 
                 mVelocity.computeCurrentVelocity(1000 /* px/sec */, mMaxFlingVelocity);
-                mRollo.mState.flingVelocityX
-                        = mVelocity.getXVelocity() / mDefines.SCREEN_WIDTH_PX;
+                if (mRotateMove) {
+                    mRollo.mState.flingVelocityX
+                            = mVelocity.getYVelocity() / mDefines.SCREEN_WIDTH_PX;
+                } else {
+                    mRollo.mState.flingVelocityX
+                            = mVelocity.getXVelocity() / mDefines.SCREEN_WIDTH_PX;
+                }
                 mRollo.clearSelectedIcon();
                 mRollo.mState.save();
-                mRollo.mInvokeFling.execute();
+                mRollo.fling();
 
                 mLastMotionX = -10000;
                 if (mVelocity != null) {
@@ -466,16 +497,16 @@
     public class RolloRS {
 
         // Allocations ======
+        private int mViewMode = 0;
 
         private int mWidth;
         private int mHeight;
 
         private Resources mRes;
-        private Script mScript;
+        private Script[] mScript = new Script[4];
 
-        private Script.Invokable mInvokeMove;
-        private Script.Invokable mInvokeFling;
-        private Script.Invokable mInvokeTouchUp;
+        private Script.Invokable[] mInvokeMove = new Script.Invokable[4];
+        private Script.Invokable[] mInvokeFling = new Script.Invokable[4];
 
         private ProgramStore mPSIcons;
         private ProgramStore mPSText;
@@ -485,6 +516,7 @@
         private ProgramVertex mPV;
         private ProgramVertex mPVOrtho;
         private SimpleMesh mMesh;
+        private SimpleMesh mMesh2;
 
         private Allocation mHomeButton;
 
@@ -505,6 +537,7 @@
         private Bitmap mSelectionBitmap;
         private Canvas mSelectionCanvas;
 
+
         Params mParams;
         State mState;
 
@@ -582,6 +615,7 @@
             initProgramFragment();
             initProgramStore();
             initMesh();
+            initMesh2();
             initGl();
             initData();
             initTouchState();
@@ -642,6 +676,44 @@
         }
 
 
+        public void initMesh2() {
+            SimpleMesh.TriangleMeshBuilder tm = new SimpleMesh.TriangleMeshBuilder(mRS, 3,
+                SimpleMesh.TriangleMeshBuilder.TEXTURE_0 | SimpleMesh.TriangleMeshBuilder.COLOR);
+
+            float y = 0;
+            float z = 0;
+            for (int ct=0; ct < 200; ct++) {
+                float angle = 0;
+                float maxAngle = 3.14f * 0.16f;
+                float l = 1.f;
+
+                l = 1 - ((ct-5) * 0.10f);
+                if (ct > 7) {
+                    angle = maxAngle * (ct - 7) * 0.2f;
+                    angle = Math.min(angle, maxAngle);
+                }
+                l = Math.max(0.3f, l);
+                l = Math.min(1.0f, l);
+
+                y += 0.1f * Math.cos(angle);
+                z += 0.1f * Math.sin(angle);
+
+                float t = 0.1f * ct;
+                float ds = 0.08f;
+                tm.setColor(l, l, l, 0.99f);
+                tm.setTexture(ds, t);
+                tm.addVertex(-0.5f, y, z);
+                tm.setTexture(1 - ds, t);
+                tm.addVertex(0.5f, y, z);
+            }
+            for (int ct=0; ct < (200 * 2 - 2); ct+= 2) {
+                tm.addTriangle(ct, ct+1, ct+2);
+                tm.addTriangle(ct+1, ct+3, ct+2);
+            }
+            mMesh2 = tm.create();
+            mMesh2.setName("SMMesh2");
+        }
+
         private void initProgramVertex() {
             ProgramVertex.MatrixAllocation pva = new ProgramVertex.MatrixAllocation(mRS);
             pva.setupProjectionNormalized(mWidth, mHeight);
@@ -746,30 +818,35 @@
             setApps(null);
         }
 
-        private void initRs() {
+        private void initScript(int idx, int id) {
             ScriptC.Builder sb = new ScriptC.Builder(mRS);
-            sb.setScript(mRes, R.raw.rollo);
-            //sb.setScript(mRes, R.raw.rollo2);
+            sb.setScript(mRes, id);
             sb.setRoot(true);
             sb.addDefines(mDefines);
             sb.setType(mParams.mType, "params", Defines.ALLOC_PARAMS);
             sb.setType(mState.mType, "state", Defines.ALLOC_STATE);
-            mInvokeMove = sb.addInvokable("move");
-            mInvokeFling = sb.addInvokable("fling");
-            mInvokeTouchUp = sb.addInvokable("touchUp");
-            mScript = sb.create();
-            mScript.setClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            mInvokeMove[idx] = sb.addInvokable("move");
+            mInvokeFling[idx] = sb.addInvokable("fling");
+            mScript[idx] = sb.create();
+            mScript[idx].setClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            mScript[idx].bindAllocation(mParams.mAlloc, Defines.ALLOC_PARAMS);
+            mScript[idx].bindAllocation(mState.mAlloc, Defines.ALLOC_STATE);
+            mScript[idx].bindAllocation(mAllocIconIds, Defines.ALLOC_ICON_IDS);
+            mScript[idx].bindAllocation(mAllocLabelIds, Defines.ALLOC_LABEL_IDS);
+            mScript[idx].bindAllocation(mAllocTouchXBorders, Defines.ALLOC_X_BORDERS);
+            mScript[idx].bindAllocation(mAllocTouchYBorders, Defines.ALLOC_Y_BORDERS);
+        }
 
-            mScript.bindAllocation(mParams.mAlloc, Defines.ALLOC_PARAMS);
-            mScript.bindAllocation(mState.mAlloc, Defines.ALLOC_STATE);
-            mScript.bindAllocation(mAllocIconIds, Defines.ALLOC_ICON_IDS);
-            mScript.bindAllocation(mAllocLabelIds, Defines.ALLOC_LABEL_IDS);
-            mScript.bindAllocation(mAllocTouchXBorders, Defines.ALLOC_X_BORDERS);
-            mScript.bindAllocation(mAllocTouchYBorders, Defines.ALLOC_Y_BORDERS);
+        private void initRs() {
+            mViewMode = 0;
+            initScript(0, R.raw.rollo3);
+            initScript(1, R.raw.rollo2);
+            initScript(2, R.raw.rollo);
+            initScript(3, R.raw.rollo4);
 
             mMessageProc = new AAMessage();
             mRS.mMessageCallback = mMessageProc;
-            mRS.contextBindRootScript(mScript);
+            mRS.contextBindRootScript(mScript[mViewMode]);
         }
 
         private void setApps(ArrayList<ApplicationInfo> list) {
@@ -878,20 +955,22 @@
          */
         private void saveAppsList() {
             mRS.contextBindRootScript(null);
-            
+
             mAllocIconIds.data(mIconIds);
             mAllocLabelIds.data(mLabelIds);
 
-            if (mScript != null) { // this happens when we init it
-                mScript.bindAllocation(mAllocIconIds, Defines.ALLOC_ICON_IDS);
-                mScript.bindAllocation(mAllocLabelIds, Defines.ALLOC_LABEL_IDS);
+            if (mScript[0] != null) { // this happens when we init it
+                for (int ct=0; ct < 4; ct++) {
+                    mScript[ct].bindAllocation(mAllocIconIds, Defines.ALLOC_ICON_IDS);
+                    mScript[ct].bindAllocation(mAllocLabelIds, Defines.ALLOC_LABEL_IDS);
+                }
             }
 
             mState.save();
 
             // Note: mScript may be null if we haven't initialized it yet.
             // In that case, this is a no-op.
-            mRS.contextBindRootScript(mScript);
+            mRS.contextBindRootScript(mScript[mViewMode]);
         }
 
         void initTouchState() {
@@ -953,6 +1032,20 @@
                     + (row * Defines.ROWS_PER_PAGE) + col;
         }
 
+        boolean setView(int v) {
+            mViewMode = v;
+            mRS.contextBindRootScript(mScript[mViewMode]);
+            return (v == 0);
+        }
+
+        void fling() {
+            mInvokeFling[mViewMode].execute();
+        }
+
+        void move() {
+            mInvokeMove[mViewMode].execute();
+        }
+
         /**
          * You need to call save() on mState on your own after calling this.
          */