diff --git a/libs/rs/java/Rollo/res/raw/rollo.c b/libs/rs/java/Rollo/res/raw/rollo.c
index f181e49..54cb21f 100644
--- a/libs/rs/java/Rollo/res/raw/rollo.c
+++ b/libs/rs/java/Rollo/res/raw/rollo.c
@@ -3,50 +3,114 @@
 #pragma stateFragment(PF)
 #pragma stateFragmentStore(PFS)
 
+// Scratch buffer layout
+// 0: fadeIn
+// 1: zoomFade
+
+#define SCRATCH_FADE 0
+#define SCRATCH_ZOOM 1
+#define SCRATCH_ROT 2
+
+
+#define STATE_POS_X             0
+#define STATE_POS_Y             1
+#define STATE_PRESSURE          2
+#define STATE_ZOOM              3
+#define STATE_WARP              4
+#define STATE_ORIENTATION       5
+#define STATE_SELECTION         6
+#define STATE_FIRST_VISIBLE     7
+#define STATE_COUNT             8
+
+void pfClearColor(float, float, float, float);
+float loadF(int, int);
+void storeF(int, int, float);
+void drawQuadF(float x1, float y1, float z1,
+                         float x2, float y2, float z2,
+                          float x3, float y3, float z3,
+                          float x4, float y4, float z4);
+float sinf(float);
+float cosf(float);
+
 int main(void* con, int ft, int launchID)
 {
     int rowCount;
-    int x;
-    int y;
     int row;
     int col;
     int imageID;
-    int tx1;
-    int ty1;
-    int tz1;
-    int tx2;
-    int ty2;
-    int tz2;
-    int rot;
-    int rotStep;
-    int tmpSin;
-    int tmpCos;
     int iconCount;
     int pressure;
 
+    float f = loadF(2, 0);
+    pfClearColor(0.0f, 0.0f, 0.0f, f);
+    if (f < 0.8f) {
+        f = f + 0.02f;
+        storeF(2, 0, f);
+    }
 
-    rotStep = 20 * 0x10000;
-    pressure = loadI32(0, 2);
+    float zoom = loadF(2, SCRATCH_ZOOM);
+    float targetZoom = ((float)loadI32(0, STATE_ZOOM)) / 10.f;
+    zoom = zoom + (targetZoom - zoom) * 0.15f;
+    storeF(2, SCRATCH_ZOOM, zoom);
 
+    float rot = loadF(2, SCRATCH_ROT);
+    float targetRot = loadI32(0, STATE_FIRST_VISIBLE) / 180.0f * 3.14f;
+    rot = rot + (targetRot - rot) * 0.15f;
+    storeF(2, SCRATCH_ROT, rot);
+
+    float diam = 8.f;// + curve * 2.f;
+    float scale = 1.0f / zoom;
+
+    pressure = loadI32(0, STATE_PRESSURE);
+    if (pressure) {
+        contextBindProgramFragmentStore(NAMED_PFSShadow);
+
+        // compute the projected shadow
+        float x = loadI32(0, STATE_POS_X) / 1000.f;
+        float y = loadI32(0, STATE_POS_Y) / 1000.f;
+        float s = loadI32(0, STATE_PRESSURE) / 1000.f;
+
+        s = s * 3.f;
+
+        float dxdy1 = (x - 0.5f - s) / (1.001f - y);
+        float dxdy2 = (x - 0.5f + s) / (1.001f - y);
+
+        float xlt = y * dxdy1 + x;
+        float xrt = y * dxdy2 + x;
+
+        float yb = (0.5f - y) * 5.f + 0.2f;
+
+        drawQuadF(xlt, 5.f, 1,
+                  xrt, 5.f, 1,
+                  x + s, yb, 1,
+                  x - s, yb, 1);
+
+        contextBindProgramFragmentStore(NAMED_PFS);
+    }
+
+
+    rot = rot * scale;
+    float rotStep = 20.0f / 180.0f * 3.14f * scale;
+    //pressure = loadI32(0, 2);
     rowCount = 4;
-
-    iconCount = loadI32(0, 1);
-    rot = (-20 + loadI32(0, 0)) * 0x10000;
+    iconCount = 32;//loadI32(0, 1);
     while (iconCount) {
-        tmpSin = sinx(rot);
-        tmpCos = cosx(rot);
+        float tmpSin = sinf(rot);
+        float tmpCos = cosf(rot);
 
-        tx1 = tmpSin * 8 - tmpCos;
-        tx2 = tx1 + tmpCos * 2;
+        //tmpCos = tmpCos * curve;
 
-        tz1 = tmpCos * 8 + tmpSin + pressure;
-        tz2 = tz1 - tmpSin * 2;
+        float tx1 = tmpSin * diam - (tmpCos * scale);
+        float tx2 = tx1 + (tmpCos * scale * 2.f);
+
+        float tz1 = tmpCos * diam + (tmpSin * scale);
+        float tz2 = tz1 - (tmpSin * scale * 2.f);
 
         for (y = 0; (y < rowCount) && iconCount; y++) {
-            ty1 = (y * 0x30000) - 0x48000;
-            ty2 = ty1 + 0x20000;
+            float ty1 = ((y * 3.0f) - 4.5f) * scale;
+            float ty2 = ty1 + scale * 2.f;
             pfBindTexture(NAMED_PF, 0, loadI32(1, y));
-            drawQuad(tx1, ty1, tz1,
+            drawQuadF(tx1, ty1, tz1,
                      tx2, ty1, tz2,
                      tx2, ty2, tz2,
                      tx1, ty2, tz1);
@@ -58,3 +122,4 @@
     return 0;
 }
 
+
diff --git a/libs/rs/java/Rollo/src/com/android/rollo/RolloRS.java b/libs/rs/java/Rollo/src/com/android/rollo/RolloRS.java
index d086702..fc928d6 100644
--- a/libs/rs/java/Rollo/src/com/android/rollo/RolloRS.java
+++ b/libs/rs/java/Rollo/src/com/android/rollo/RolloRS.java
@@ -37,6 +37,16 @@
 import android.view.MotionEvent;
 
 public class RolloRS {
+    public static final int STATE_POS_X = 0;
+    public static final int STATE_POS_Y = 1;
+    public static final int STATE_PRESSURE = 2;
+    public static final int STATE_ZOOM = 3;
+    public static final int STATE_WARP = 4;
+    public static final int STATE_ORIENTATION = 5;
+    public static final int STATE_SELECTION = 6;
+    public static final int STATE_FIRST_VISIBLE = 7;
+    public static final int STATE_COUNT = 8;
+
 
     public RolloRS() {
     }
@@ -48,9 +58,33 @@
         initRS();
     }
 
-    public void setPosition(float dx, float pressure) {
-        mAllocStateBuf[0] += (int)(dx);
-        mAllocStateBuf[2] = (int)(pressure * 0x40000);
+    public void setPosition(float column) {
+        mAllocStateBuf[STATE_FIRST_VISIBLE] = (int)(column * 20);
+        mAllocState.data(mAllocStateBuf);
+    }
+
+    public void setShadow(float x, float y, float size) {
+        // x and y are normalized at this point.
+        mAllocStateBuf[STATE_POS_X] = (int)(x * 1000);
+        mAllocStateBuf[STATE_POS_Y] = (int)(y * 1000);
+        mAllocStateBuf[STATE_PRESSURE] = (int)(size * 1000);
+
+        Log.e("rs","shadow x=" + Integer.toString(mAllocStateBuf[STATE_POS_X]) +
+              "  y=" + Integer.toString(mAllocStateBuf[STATE_POS_X]) +
+              "  s=" + Integer.toString(mAllocStateBuf[STATE_PRESSURE]));
+        mAllocState.data(mAllocStateBuf);
+    }
+
+    public void setZoom(float z) {
+        Log.e("rs", "zoom " + Float.toString(z));
+
+        mAllocStateBuf[STATE_ZOOM] = (int)(z * 10.f);
+        mAllocState.data(mAllocStateBuf);
+    }
+
+    public void setCurve(float c) {
+        mAllocStateBuf[STATE_WARP] = (int)(c * 100);
+        Log.e("rs", "curve " + Integer.toString(mAllocStateBuf[STATE_WARP]));
         mAllocState.data(mAllocStateBuf);
     }
 
@@ -63,7 +97,7 @@
 
     private RenderScript.Sampler mSampler;
     private RenderScript.ProgramFragmentStore mPFSBackground;
-    private RenderScript.ProgramFragmentStore mPFSImages;
+    private RenderScript.ProgramFragmentStore mPFSShadow;
     private RenderScript.ProgramFragment mPFBackground;
     private RenderScript.ProgramFragment mPFImages;
     private RenderScript.ProgramVertex mPV;
@@ -77,6 +111,9 @@
     private int[] mAllocIconIDBuf;
     private RenderScript.Allocation mAllocIconID;
 
+    private int[] mAllocScratchBuf;
+    private RenderScript.Allocation mAllocScratch;
+
     private void initNamed() {
         mRS.samplerBegin();
         mRS.samplerSet(RenderScript.SamplerParam.FILTER_MIN,
@@ -101,7 +138,7 @@
         mPFImages.bindSampler(mSampler, 1);
 
         mRS.programFragmentStoreBegin(null, null);
-        mRS.programFragmentStoreDepthFunc(RenderScript.DepthFunc.ALWAYS);
+        mRS.programFragmentStoreDepthFunc(RenderScript.DepthFunc.LESS);
         mRS.programFragmentStoreDitherEnable(false);
         mRS.programFragmentStoreDepthMask(false);
         mRS.programFragmentStoreBlendFunc(RenderScript.BlendSrcFunc.ONE, 
@@ -109,6 +146,15 @@
         mPFSBackground = mRS.programFragmentStoreCreate();
         mPFSBackground.setName("PFS");
 
+        mRS.programFragmentStoreBegin(null, null);
+        mRS.programFragmentStoreDepthFunc(RenderScript.DepthFunc.ALWAYS);
+        mRS.programFragmentStoreDitherEnable(false);
+        mRS.programFragmentStoreDepthMask(true);
+        mRS.programFragmentStoreColorMask(false, false, false, false);
+        mPFSShadow = mRS.programFragmentStoreCreate();
+        mPFSShadow.setName("PFSShadow");
+
+
 
         mPVAlloc = new ProgramVertexAlloc(mRS);
         mRS.programVertexBegin(null, null);
@@ -123,10 +169,18 @@
         //mPVAlloc.setupOrthoNormalized(320, 480);
         mRS.contextBindProgramVertex(mPV);
 
+        mAllocScratchBuf = new int[32];
+        for(int ct=0; ct < mAllocScratchBuf.length; ct++) {
+            mAllocScratchBuf[ct] = 0;
+        }
+        mAllocScratch = mRS.allocationCreatePredefSized(
+            RenderScript.ElementPredefined.USER_I32, mAllocScratchBuf.length);
+        mAllocScratch.data(mAllocScratchBuf);
 
         Log.e("rs", "Done loading named");
 
 
+
         {
             mIcons = new RenderScript.Allocation[4];
             mAllocIconIDBuf = new int[mIcons.length];
@@ -190,18 +244,21 @@
 
     private void initRS() {
         mRS.scriptCBegin();
-        mRS.scriptCSetClearColor(0.0f, 0.0f, 0.1f, 0.5f);
-        //mRS.scriptCSetScript(mRes, R.raw.rollo);
-        mRS.scriptCSetScript(mRes, R.raw.rollo2);
+        mRS.scriptCSetClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+        mRS.scriptCSetScript(mRes, R.raw.rollo);
+        //mRS.scriptCSetScript(mRes, R.raw.rollo2);
         mRS.scriptCSetRoot(true);
+        //mRS.scriptCSetClearDepth(0);
         mScript = mRS.scriptCCreate();
 
-        mAllocStateBuf = new int[] {0, 38, 0};
+        mAllocStateBuf = new int[] {0, 0, 0, 8, 0, 0, 0, 0, 38, 0};
         mAllocState = mRS.allocationCreatePredefSized(
             RenderScript.ElementPredefined.USER_I32, mAllocStateBuf.length);
         mScript.bindAllocation(mAllocState, 0);
         mScript.bindAllocation(mAllocIconID, 1);
-        setPosition(0, 0);
+        mScript.bindAllocation(mAllocScratch, 2);
+        setPosition(0);
+        setZoom(1);
 
         //RenderScript.File f = mRS.fileOpen("/sdcard/test.a3d");
 
diff --git a/libs/rs/java/Rollo/src/com/android/rollo/RolloView.java b/libs/rs/java/Rollo/src/com/android/rollo/RolloView.java
index 4b0520b..6e2768c 100644
--- a/libs/rs/java/Rollo/src/com/android/rollo/RolloView.java
+++ b/libs/rs/java/Rollo/src/com/android/rollo/RolloView.java
@@ -19,6 +19,7 @@
 import java.io.Writer;
 import java.util.ArrayList;
 import java.util.concurrent.Semaphore;
+import java.lang.Float;
 
 import android.renderscript.RSSurfaceView;
 import android.renderscript.RenderScript;
@@ -43,8 +44,7 @@
 
     public RolloView(Context context) {
         super(context);
-
-        //setFocusable(true);
+        setFocusable(true);
         getHolder().setFormat(PixelFormat.TRANSLUCENT);
     }
 
@@ -57,8 +57,6 @@
         mRS = createRenderScript();
         mRender = new RolloRS();
         mRender.init(mRS, getResources(), w, h);
-
-
     }
 
     @Override
@@ -69,6 +67,13 @@
         return super.onKeyDown(keyCode, event);
     }
 
+    boolean mControlMode = false;
+    boolean mFlingMode = false;
+    float mFlingX = 0;
+    float mFlingY = 0;
+    float mColumn = -1;
+    float mCurve = 1;
+    float mZoom = 1;
 
     @Override
     public boolean onTouchEvent(MotionEvent ev)
@@ -78,14 +83,100 @@
         if (act == ev.ACTION_UP) {
             ret = false;
         }
-        float x = ev.getX();
-        x = (x - 180) / 40;
-        //Log.e("rs", Float(x).toString());
 
-        mRender.setPosition(x, ev.getPressure());
-        //mRender.newTouchPosition((int)ev.getX(), (int)ev.getY());
+        float nx = ev.getX() / getWidth();
+        float ny = ev.getY() / getHeight();
+
+        if((ny > 0.85f) || mControlMode) {
+            mRender.setShadow(0, 0, 0);
+            mFlingMode = false;
+
+            // Projector control
+            if((nx > 0.2f) && (nx < 0.8f) || mControlMode) {
+                if(act != ev.ACTION_UP) {
+                    float zoom = 5.f;//1.f + 10.f * ev.getSize();
+                    if(mControlMode) {
+                        float dx = nx - mFlingX;
+
+                        if(ny < 0.9) {
+                            zoom = 5.f - ((0.9f - ny) * 10.f);
+                            if(zoom < 1) {
+                                zoom = 1;
+                                mControlMode = false;
+                            }
+                        }
+                        mColumn += dx * 3;// * zoom;
+                        mColumn += -(mZoom - zoom) * (nx - 0.5f) * 2 * zoom;
+                        mZoom = zoom;
+
+                        if(mColumn > 1) {
+                            mColumn = 1;
+                        }
+                        mRender.setPosition(mColumn);
+                    } else {
+                        mControlMode = true;
+                        mZoom = 5;
+                    }
+                    mFlingX = nx;
+                    mRender.setZoom(zoom);
+                } else {
+                    mControlMode = false;
+                    mRender.setZoom(1.f);
+                }
+            } else {
+                if(nx > 0.2f) {
+                    mCurve += 0.1f;
+                    if(mCurve > 2) {
+                        mCurve = 2;
+                    }
+                }
+                if(nx < 0.8f) {
+                    mCurve -= 0.1f;
+                    if(mCurve < (-2)) {
+                        mCurve = -2;
+                    }
+                }
+                mRender.setCurve(mCurve);
+            }
+
+        } else {
+            // icon control
+            if(act != ev.ACTION_UP) {
+                if(mFlingMode) {
+                    float dx = nx - mFlingX;
+                    mColumn += dx * 5;
+                    if(mColumn > 1) {
+                        mColumn = 1;
+                    }
+                    mRender.setPosition(mColumn);
+                }
+                mFlingMode = true;
+                mFlingX = nx;
+                mFlingY = ny;
+                //mRender.setShadow(nx, ny, ev.getSize());
+            } else {
+                mFlingMode = false;
+                mRender.setShadow(nx, ny, 0);
+            }
+        }
+
+
         return ret;
     }
+
+    @Override
+    public boolean onTrackballEvent(MotionEvent ev)
+    {
+        float x = ev.getX();
+        float y = ev.getY();
+        //Float tx = new Float(x);
+        //Float ty = new Float(y);
+        //Log.e("rs", "tbe " + tx.toString() + ", " + ty.toString());
+
+
+        return true;
+    }
+       
 }
 
 
diff --git a/libs/rs/rsProgramFragmentStore.cpp b/libs/rs/rsProgramFragmentStore.cpp
index 0b65680..9ee270f 100644
--- a/libs/rs/rsProgramFragmentStore.cpp
+++ b/libs/rs/rsProgramFragmentStore.cpp
@@ -61,8 +61,10 @@
         glDisable(GL_BLEND);
     }
 
+    //LOGE("pfs  %i, %i, %x", mDepthWriteEnable, mDepthTestEnable, mDepthFunc);
+
     glDepthMask(mDepthWriteEnable);
-    if(mDepthTestEnable) {
+    if(mDepthTestEnable || mDepthWriteEnable) {
         glEnable(GL_DEPTH_TEST);
         glDepthFunc(mDepthFunc);
     } else {
diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp
index 0ec6baf..c19f0bb 100644
--- a/libs/rs/rsScriptC.cpp
+++ b/libs/rs/rsScriptC.cpp
@@ -133,13 +133,17 @@
 extern "C" float loadF(uint32_t bank, uint32_t offset)
 {
     GET_TLS();
-    return static_cast<const float *>(sc->mSlots[bank]->getPtr())[offset];
+    float f = static_cast<const float *>(sc->mSlots[bank]->getPtr())[offset];
+    //LOGE("loadF %i %i = %f %x", bank, offset, f, ((int *)&f)[0]);
+    return f;
 }
 
 extern "C" int32_t loadI32(uint32_t bank, uint32_t offset)
 {
     GET_TLS();
-    return static_cast<const int32_t *>(sc->mSlots[bank]->getPtr())[offset];
+    int32_t t = static_cast<const int32_t *>(sc->mSlots[bank]->getPtr())[offset];
+    //LOGE("loadI32 %i %i = %i", bank, offset, t);
+    return t;
 }
 
 extern "C" uint32_t loadU32(uint32_t bank, uint32_t offset)
@@ -163,6 +167,7 @@
 
 extern "C" void storeF(uint32_t bank, uint32_t offset, float v)
 {
+    //LOGE("storeF %i %i %f", bank, offset, v);
     GET_TLS();
     static_cast<float *>(sc->mSlots[bank]->getPtr())[offset] = v;
 }
@@ -307,6 +312,47 @@
     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
 }
 
+extern "C" void drawQuadF(float x1, float y1, float z1,
+                          float x2, float y2, float z2,
+                          float x3, float y3, float z3,
+                          float x4, float y4, float z4)
+{
+    GET_TLS();
+
+    //LOGE("Quad");
+    //LOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1);
+    //LOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2);
+    //LOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3);
+    //LOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4);
+
+    float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
+    static const float tex[] = {0,0, 0,1, 1,1, 1,0};
+
+
+    rsc->setupCheck();
+
+    glBindBuffer(GL_ARRAY_BUFFER, 0);
+    //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, tm->mBufferObjects[1]);
+
+    glEnableClientState(GL_VERTEX_ARRAY);
+    glVertexPointer(3, GL_FLOAT, 0, vtx);
+
+    glClientActiveTexture(GL_TEXTURE0);
+    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+    glTexCoordPointer(2, GL_FLOAT, 0, tex);
+    glClientActiveTexture(GL_TEXTURE1);
+    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+    glTexCoordPointer(2, GL_FLOAT, 0, tex);
+    glClientActiveTexture(GL_TEXTURE0);
+
+    glDisableClientState(GL_NORMAL_ARRAY);
+    glDisableClientState(GL_COLOR_ARRAY);
+
+    //glColorPointer(4, GL_UNSIGNED_BYTE, 12, ptr);
+
+    glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+}
+
 extern "C" void drawQuad(int32_t x1, int32_t y1, int32_t z1,
                          int32_t x2, int32_t y2, int32_t z2,
                          int32_t x3, int32_t y3, int32_t z3,
@@ -368,6 +414,28 @@
     return int32_t(s * 0x10000);
 }
 
+extern "C" float sinf(float angle)
+{
+    float s = (float)sin(angle);
+    return s;
+}
+
+extern "C" float cosf(float angle)
+{
+    float s = (float)cos(angle);
+    return s;
+}
+
+extern "C" void pfClearColor(float r, float g, float b, float a)
+{
+    //LOGE("c %f %f %f %f", r, g, b, a);
+    GET_TLS();
+    sc->mEnviroment.mClearColor[0] = r;
+    sc->mEnviroment.mClearColor[1] = g;
+    sc->mEnviroment.mClearColor[2] = b;
+    sc->mEnviroment.mClearColor[3] = a;
+}
+
 extern "C" void pfBindTexture(RsProgramFragment vpf, uint32_t slot, RsAllocation va)
 {
     GET_TLS();
