diff --git a/libs/rs/java/Rollo/res/raw/rollo.c b/libs/rs/java/Rollo/res/raw/rollo.c
index 56ee425..e6acc9c 100644
--- a/libs/rs/java/Rollo/res/raw/rollo.c
+++ b/libs/rs/java/Rollo/res/raw/rollo.c
@@ -5,10 +5,58 @@
 
 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;
 
-    renderTriangleMesh(con, NAMED_MeshCard);
-    renderTriangleMesh(con, NAMED_MeshTab);
+
+    iconCount = 38;//loadI32(0, 1);
+    rotStep = 20 * 0x10000;
+    pressure = loadI32(0, 2);
+
+    rowCount = 4;
+    rot = (-20 + loadI32(0, 0)) * 0x10000;
+
+    while (iconCount) {
+        tmpSin = sinx(rot);
+        tmpCos = cosx(rot);
+
+        tx1 = tmpSin * 8 - tmpCos;
+        tx2 = tx1 + tmpCos * 2;
+
+        tz1 = tmpCos * 8 + tmpSin + pressure;
+        tz2 = tz1 - tmpSin * 2;
+
+        for (y = 0; (y < rowCount) && iconCount; y++) {
+            ty1 = (y * 0x30000) - 0x48000;
+            ty2 = ty1 + 0x20000;
+
+            drawQuad(tx1, ty1, tz1,
+                     tx2, ty1, tz2,
+                     tx2, ty2, tz2,
+                     tx1, ty2, tz1);
+            iconCount--;
+        }
+        rot = rot + rotStep;
+    }
+
+    //renderTriangleMesh(con, NAMED_MeshCard);
+    //renderTriangleMesh(con, NAMED_MeshTab);
     return 1;
 }
 
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 da0b146..0f7e26b 100644
--- a/libs/rs/java/Rollo/src/com/android/rollo/RolloRS.java
+++ b/libs/rs/java/Rollo/src/com/android/rollo/RolloRS.java
@@ -48,6 +48,12 @@
         initRS();
     }
 
+    public void setPosition(float dx, float pressure) {
+        mAllocStateBuf[0] += (int)(dx);
+        mAllocStateBuf[2] = (int)(pressure * 0x40000);
+        mAllocState.data(mAllocStateBuf);
+    }
+
 
     private Resources mRes;
     private RenderScript mRS;
@@ -63,23 +69,13 @@
     private RenderScript.ProgramVertex mPV;
     private ProgramVertexAlloc mPVAlloc;
 
-    private RenderScript.Allocation mAllocEnv;
-    private RenderScript.Allocation mAllocPos;
+    private int[] mAllocStateBuf;
     private RenderScript.Allocation mAllocState;
-    //private RenderScript.Allocation mAllocPV;
-    private RenderScript.TriangleMesh mMeshCard;
-    private RenderScript.TriangleMesh mMeshTab;
 
     private float[] mBufferPos;
     //private float[] mBufferPV;
 
     private void initNamed() {
-        mMeshTab = RolloMesh.createTab(mRS);
-        mMeshTab.setName("MeshTab");
-        mMeshCard = RolloMesh.createCard(mRS);
-        mMeshCard.setName("MeshCard");
-        Log.e("rs", "Done loading strips");
-
         mRS.samplerBegin();
         mRS.samplerSet(RenderScript.SamplerParam.FILTER_MIN,
                        RenderScript.SamplerValue.LINEAR_MIP_LINEAR);
@@ -122,6 +118,8 @@
         mPV.setName("PV");
         mPV.bindAllocation(0, mPVAlloc.mAlloc);
 
+
+
         mPVAlloc.setupProjectionNormalized(320, 480);
         //mPVAlloc.setupOrthoNormalized(320, 480);
         mRS.contextBindProgramVertex(mPV);
@@ -131,6 +129,7 @@
     }
 
 
+
     private void initRS() {
         mRS.scriptCBegin();
         mRS.scriptCSetClearColor(0.0f, 0.7f, 0.0f, 1.0f);
@@ -138,6 +137,11 @@
         mRS.scriptCSetRoot(true);
         mScript = mRS.scriptCCreate();
 
+        mAllocStateBuf = new int[] {0, 38, 0};
+        mAllocState = mRS.allocationCreatePredefSized(
+            RenderScript.ElementPredefined.USER_I32, mAllocStateBuf.length);
+        mScript.bindAllocation(mAllocState, 0);
+        setPosition(0, 0);
 
         mRS.contextBindRootScript(mScript);
     }
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 9a30aed..27d2dd6 100644
--- a/libs/rs/java/Rollo/src/com/android/rollo/RolloView.java
+++ b/libs/rs/java/Rollo/src/com/android/rollo/RolloView.java
@@ -74,6 +74,11 @@
         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());
         return ret;
     }
diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp
index 522ed00..9c99e2b 100644
--- a/libs/rs/rsScriptC.cpp
+++ b/libs/rs/rsScriptC.cpp
@@ -307,6 +307,60 @@
     glDrawArrays(GL_TRIANGLE_STRIP, 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,
+                         int32_t x4, int32_t y4, int32_t z4)
+{
+    GET_TLS();
+    //x1 = (x1 << 16);
+    //x2 = (x2 << 16);
+    //y1 = (y1 << 16);
+    //y2 = (y2 << 16);
+
+    //LOGE("Quad");
+    //LOGE("0x%08x, 0x%08x, 0x%08x", x1, y1, z1);
+    //LOGE("0x%08x, 0x%08x, 0x%08x", x2, y2, z2);
+    //LOGE("0x%08x, 0x%08x, 0x%08x", x3, y3, z3);
+    //LOGE("0x%08x, 0x%08x, 0x%08x", x4, y4, z4);
+
+    int32_t vtx[] = {x1,y1,z1, x4,y4,z4, x3,y3,z3, x2,y2,z2};
+    static const int32_t tex[] = {0,0, 0,0x10000, 0x10000,0, 0x10000,0x10000};
+
+
+    rsc->setupCheck();
+
+    glBindBuffer(GL_ARRAY_BUFFER, 0);
+    //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, tm->mBufferObjects[1]);
+
+    glEnableClientState(GL_VERTEX_ARRAY);
+    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+    glDisableClientState(GL_NORMAL_ARRAY);
+    glDisableClientState(GL_COLOR_ARRAY);
+
+    glVertexPointer(3, GL_FIXED, 0, vtx);
+    glTexCoordPointer(2, GL_FIXED, 0, tex);
+    //glColorPointer(4, GL_UNSIGNED_BYTE, 12, ptr);
+
+    glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+}
+
+extern "C" int32_t sinx(int32_t angle)
+{
+    float a = ((float)angle) / 0x10000;
+    a *= 3.14f / 180.f;
+    float s = (float)sin(a);
+    return int32_t(s * 0x10000);
+}
+
+extern "C" int32_t cosx(int32_t angle)
+{
+    float a = ((float)angle) / 0x10000;
+    a *= 3.14f / 180.f;
+    float s = (float)cos(a);
+    return int32_t(s * 0x10000);
+}
+
 extern "C" void pfBindTexture(RsProgramFragment vpf, uint32_t slot, RsAllocation va)
 {
     GET_TLS();
