Switch fountain to use ProgramVertex rather than hard coded camers in scripts.  Remove camera code from scripts.
diff --git a/java/Fountain/src/com/android/fountain/FountainRS.java b/java/Fountain/src/com/android/fountain/FountainRS.java
index 0a0b05a..d167b5f 100644
--- a/java/Fountain/src/com/android/fountain/FountainRS.java
+++ b/java/Fountain/src/com/android/fountain/FountainRS.java
@@ -18,12 +18,13 @@
 
 import java.io.Writer;
 
-import android.renderscript.RenderScript;
 import android.content.Context;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
+import android.renderscript.RenderScript;
+import android.renderscript.ProgramVertexAlloc;
 import android.util.Log;
 
 public class FountainRS {
@@ -57,8 +58,10 @@
     private RenderScript.ProgramFragmentStore mPFS;
     private RenderScript.ProgramFragment mPF;
     private RenderScript.ProgramFragment mPF2;
+    private RenderScript.ProgramVertex mPV;
     private RenderScript.Allocation mTexture;
     private RenderScript.Sampler mSampler;
+    private ProgramVertexAlloc mPVA;
 
     private Bitmap mBackground;
 
@@ -107,6 +110,16 @@
         mPF2.bindSampler(mSampler, 0);
         mPF2.setName("PgmFragBackground");
 
+        mRS.programVertexBegin(null, null);
+        mPV = mRS.programVertexCreate();
+        mPVA = new ProgramVertexAlloc(mRS);
+        mPV.bindAllocation(0, mPVA.mAlloc);
+        mPVA.setupOrthoWindow(320, 480);
+        mRS.contextBindProgramVertex(mPV);
+
+
+
+
         mParams[0] = 0;
         mParams[1] = partCount;
         mParams[2] = 0;
diff --git a/java/RenderScript/android/renderscript/Matrix.java b/java/RenderScript/android/renderscript/Matrix.java
index 03222aa..91e7b34 100644
--- a/java/RenderScript/android/renderscript/Matrix.java
+++ b/java/RenderScript/android/renderscript/Matrix.java
@@ -139,8 +139,8 @@
         mMat[5] = 2 / (t - b);
         mMat[10]= -2 / (f - n);
         mMat[12]= -(r + l) / (r - l);
-        mMat[12]= -(t + b) / (t - b);
-        mMat[12]= -(f + n) / (f - n);
+        mMat[13]= -(t + b) / (t - b);
+        mMat[14]= -(f + n) / (f - n);
     }
 
     public void loadFrustum(float l, float r, float b, float t, float n, float f) {
diff --git a/java/RenderScript/android/renderscript/RenderScript.java b/java/RenderScript/android/renderscript/RenderScript.java
index afb4ae3..4d5c4a0 100644
--- a/java/RenderScript/android/renderscript/RenderScript.java
+++ b/java/RenderScript/android/renderscript/RenderScript.java
@@ -154,10 +154,7 @@
     native private void nProgramVertexBindAllocation(int pv, int slot, int mID);
     native private void nProgramVertexBegin(int inID, int outID);
     native private void nProgramVertexSetType(int slot, int mID);
-    native private void nProgramVertexSetCameraMode(boolean isOrtho);
     native private void nProgramVertexSetTextureMatrixEnable(boolean enable);
-    native private void nProgramVertexSetModelMatrixEnable(boolean enable);
-    native private void nProgramVertexSetProjectionMatrixEnable(boolean enable);
     native private int  nProgramVertexCreate();
 
 
@@ -733,22 +730,10 @@
         nProgramVertexSetType(slot, t.mID);
     }
 
-    public void programVertexSetCameraMode(boolean isOrtho) {
-        nProgramVertexSetCameraMode(isOrtho);
-    }
-
     public void programVertexSetTextureMatrixEnable(boolean enable) {
         nProgramVertexSetTextureMatrixEnable(enable);
     }
 
-    public void programVertexSetModelMatrixEnable(boolean enable) {
-        nProgramVertexSetModelMatrixEnable(enable);
-    }
-
-    public void programVertexSetProjectionMatrixEnable(boolean enable) {
-        nProgramVertexSetProjectionMatrixEnable(enable);
-    }
-
     public ProgramVertex programVertexCreate() {
         int id = nProgramVertexCreate();
         return new ProgramVertex(id);
diff --git a/java/Rollo/res/raw/rollo.c b/java/Rollo/res/raw/rollo.c
index b81c567..56ee425 100644
--- a/java/Rollo/res/raw/rollo.c
+++ b/java/Rollo/res/raw/rollo.c
@@ -8,6 +8,7 @@
     int x;
 
     renderTriangleMesh(con, NAMED_MeshCard);
+    renderTriangleMesh(con, NAMED_MeshTab);
     return 1;
 }
 
diff --git a/java/Rollo/src/com/android/rollo/RolloMesh.java b/java/Rollo/src/com/android/rollo/RolloMesh.java
index c44a817..d7252fb 100644
--- a/java/Rollo/src/com/android/rollo/RolloMesh.java
+++ b/java/Rollo/src/com/android/rollo/RolloMesh.java
@@ -24,6 +24,11 @@
 
 
 class RolloMesh {
+    static public final float mCardHeight = 1.2f;
+    static public final float mCardWidth = 1.8f;
+    static public final float mTabHeight = 0.2f;
+    static public final float mTabs = 3;
+    static public final float mTabGap = 0.1f;
 
     static RenderScript.TriangleMesh createCard(RenderScript rs) {
         RenderScript.Element vtx = rs.elementGetPredefined(
@@ -31,12 +36,15 @@
         RenderScript.Element idx = rs.elementGetPredefined(
             RenderScript.ElementPredefined.INDEX_16);
 
-        rs.triangleMeshBegin(vtx, idx);
-        rs.triangleMeshAddVertex_XYZ_ST(0, 0, 0,  0, 0);
-        rs.triangleMeshAddVertex_XYZ_ST(0, 1, 0,  0, 1);
-        rs.triangleMeshAddVertex_XYZ_ST(1, 1, 0,  1, 1);
-        rs.triangleMeshAddVertex_XYZ_ST(1, 0, 0,  1, 0);
+        float w = mCardWidth / 2;
+        float h = mCardHeight;
+        float z = 0;
 
+        rs.triangleMeshBegin(vtx, idx);
+        rs.triangleMeshAddVertex_XYZ_ST(-w, 0, z,  0, 0);
+        rs.triangleMeshAddVertex_XYZ_ST(-w, h, z,  0, 1);
+        rs.triangleMeshAddVertex_XYZ_ST( w, h, z,  1, 1);
+        rs.triangleMeshAddVertex_XYZ_ST( w, 0, z,  1, 0);
         rs.triangleMeshAddTriangle(0,1,2);
         rs.triangleMeshAddTriangle(0,2,3);
         return rs.triangleMeshCreate();
@@ -48,11 +56,28 @@
         RenderScript.Element idx = rs.elementGetPredefined(
             RenderScript.ElementPredefined.INDEX_16);
 
+
+        float tabSlope = 0.1f;
+        float num = 0;
+
+        float w = (mCardWidth - ((mTabs - 1) * mTabGap)) / mTabs;
+        float w1 = -(mCardWidth / 2) + ((w + mTabGap) * num);
+        float w2 = w1 + (w * tabSlope);
+        float w3 = w1 + w - (w * tabSlope);
+        float w4 = w1 + w;
+        float h1 = mCardHeight;
+        float h2 = h1 + mTabHeight;
+        float z = 0;
+
+        float stScale = w / mTabHeight / 2;
+        float stScale2 = stScale * (tabSlope / w);
+
+
         rs.triangleMeshBegin(vtx, idx);
-        rs.triangleMeshAddVertex_XYZ_ST(0.0f, 0, 0,  -1.0f, 0);
-        rs.triangleMeshAddVertex_XYZ_ST(0.2f, 1, 0,  -0.8f, 1);
-        rs.triangleMeshAddVertex_XYZ_ST(1.8f, 1, 0,   0.8f, 1);
-        rs.triangleMeshAddVertex_XYZ_ST(2.0f, 0, 0,   1.0f, 0);
+        rs.triangleMeshAddVertex_XYZ_ST(w1, h1, z,  -stScale, 0);
+        rs.triangleMeshAddVertex_XYZ_ST(w2, h2, z,  -stScale2, 1);
+        rs.triangleMeshAddVertex_XYZ_ST(w3, h2, z,   stScale2, 1);
+        rs.triangleMeshAddVertex_XYZ_ST(w4, h1, z,   stScale, 0);
         rs.triangleMeshAddTriangle(0,1,2);
         rs.triangleMeshAddTriangle(0,2,3);
         return rs.triangleMeshCreate();
diff --git a/java/Rollo/src/com/android/rollo/RolloRS.java b/java/Rollo/src/com/android/rollo/RolloRS.java
index aa9f338..da0b146 100644
--- a/java/Rollo/src/com/android/rollo/RolloRS.java
+++ b/java/Rollo/src/com/android/rollo/RolloRS.java
@@ -74,8 +74,8 @@
     //private float[] mBufferPV;
 
     private void initNamed() {
-        //mMeshTab = RolloMesh.createTab(mRS);
-        //mMeshTab.setName("MeshTab");
+        mMeshTab = RolloMesh.createTab(mRS);
+        mMeshTab.setName("MeshTab");
         mMeshCard = RolloMesh.createCard(mRS);
         mMeshCard.setName("MeshCard");
         Log.e("rs", "Done loading strips");
@@ -117,10 +117,7 @@
 
         mPVAlloc = new ProgramVertexAlloc(mRS);
         mRS.programVertexBegin(null, null);
-        mRS.programVertexSetCameraMode(true);
         mRS.programVertexSetTextureMatrixEnable(true);
-        mRS.programVertexSetModelMatrixEnable(true);
-        mRS.programVertexSetProjectionMatrixEnable(true);
         mPV = mRS.programVertexCreate();
         mPV.setName("PV");
         mPV.bindAllocation(0, mPVAlloc.mAlloc);
diff --git a/jni/RenderScript_jni.cpp b/jni/RenderScript_jni.cpp
index 7a3a7af..ab17a4a 100644
--- a/jni/RenderScript_jni.cpp
+++ b/jni/RenderScript_jni.cpp
@@ -791,14 +791,6 @@
 }
 
 static void
-nProgramVertexSetCameraMode(JNIEnv *_env, jobject _this, jboolean isOrtho)
-{
-    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
-    LOG_API("nProgramVertexSetCameraMode, con(%p), isOrtho(%i)", con, isOrtho);
-    rsProgramVertexSetCameraMode(isOrtho);
-}
-
-static void
 nProgramVertexSetTextureMatrixEnable(JNIEnv *_env, jobject _this, jboolean enable)
 {
     RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
@@ -806,22 +798,6 @@
     rsProgramVertexSetTextureMatrixEnable(enable);
 }
 
-static void
-nProgramVertexSetModelMatrixEnable(JNIEnv *_env, jobject _this, jboolean enable)
-{
-    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
-    LOG_API("nProgramVertexSetModelMatrixEnable, con(%p), enable(%i)", con, enable);
-    rsProgramVertexSetModelMatrixEnable(enable);
-}
-
-static void
-nProgramVertexSetProjectionMatrixEnable(JNIEnv *_env, jobject _this, jboolean enable)
-{
-    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
-    LOG_API("nProgramVertexSetProjectionMatrixEnable, con(%p), enable(%i)", con, enable);
-    rsProgramVertexSetProjectionMatrixEnable(enable);
-}
-
 static jint
 nProgramVertexCreate(JNIEnv *_env, jobject _this)
 {
@@ -1000,10 +976,7 @@
 {"nProgramVertexBindAllocation",   "(III)V",                               (void*)nProgramVertexBindAllocation },
 {"nProgramVertexBegin",            "(II)V",                                (void*)nProgramVertexBegin },
 {"nProgramVertexSetType",          "(II)V",                                (void*)nProgramVertexSetType },
-{"nProgramVertexSetCameraMode",    "(Z)V",                                 (void*)nProgramVertexSetCameraMode },
 {"nProgramVertexSetTextureMatrixEnable",   "(Z)V",                         (void*)nProgramVertexSetTextureMatrixEnable },
-{"nProgramVertexSetModelMatrixEnable",  "(Z)V",                            (void*)nProgramVertexSetModelMatrixEnable },
-{"nProgramVertexSetProjectionMatrixEnable",  "(Z)V",                       (void*)nProgramVertexSetProjectionMatrixEnable },
 {"nProgramVertexCreate",           "()I",                                  (void*)nProgramVertexCreate },
 
 {"nContextBindRootScript",         "(I)V",                                 (void*)nContextBindRootScript },
diff --git a/rs.spec b/rs.spec
index 107096f..dd489b8 100644
--- a/rs.spec
+++ b/rs.spec
@@ -286,10 +286,6 @@
 	param bool isRoot
 	}
 
-ScriptCSetOrtho {
-	param bool isOrtho
-	}
-
 ScriptCSetScript {
 	param void * codePtr
 	}
@@ -403,19 +399,7 @@
 	param RsType constants
 	}
 
-ProgramVertexSetCameraMode {
-	param bool ortho
-	}
-
 ProgramVertexSetTextureMatrixEnable {
 	param bool enable
 	}
 
-ProgramVertexSetModelMatrixEnable {
-	param bool enable
-	}
-
-ProgramVertexSetProjectionMatrixEnable {
-	param bool enable
-	}
-
diff --git a/rsContext.cpp b/rsContext.cpp
index 266c455..c466f46 100644
--- a/rsContext.cpp
+++ b/rsContext.cpp
@@ -81,24 +81,6 @@
     glEnable(GL_LIGHT0);
     glViewport(0, 0, mWidth, mHeight);
 
-    if(mRootScript->mEnviroment.mIsOrtho) {
-        glMatrixMode(GL_PROJECTION);
-        glLoadIdentity();
-        glOrthof(0, mWidth,  mHeight, 0,  0, 1);
-        glMatrixMode(GL_MODELVIEW);
-    } else {
-        float aspectH = ((float)mWidth) / mHeight;
-        glMatrixMode(GL_PROJECTION);
-        glLoadIdentity();
-        glFrustumf(-1, 1,  -aspectH, aspectH,  1, 100);
-        glRotatef(-90, 0,0,1);
-        glTranslatef(0,  0,  -3);
-        glMatrixMode(GL_MODELVIEW);
-    }
-
-    glMatrixMode(GL_MODELVIEW);
-    glLoadIdentity();
-
     glDepthMask(GL_TRUE);
     glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
 
diff --git a/rsProgramVertex.cpp b/rsProgramVertex.cpp
index fc26ab5..c24f228 100644
--- a/rsProgramVertex.cpp
+++ b/rsProgramVertex.cpp
@@ -25,14 +25,21 @@
     Program(in, out)
 {
     mTextureMatrixEnable = false;
-    mProjectionEnable = false;
-    mTransformEnable = false;
 }
 
 ProgramVertex::~ProgramVertex()
 {
 }
 
+static void logMatrix(const char *txt, const float *f)
+{
+    LOGE("Matrix %s, %p", txt, f);
+    LOGE("%6.2f, %6.2f, %6.2f, %6.2f", f[0], f[4], f[8], f[12]);
+    LOGE("%6.2f, %6.2f, %6.2f, %6.2f", f[1], f[5], f[9], f[13]);
+    LOGE("%6.2f, %6.2f, %6.2f, %6.2f", f[2], f[6], f[10], f[14]);
+    LOGE("%6.2f, %6.2f, %6.2f, %6.2f", f[3], f[7], f[11], f[15]);
+}
+
 void ProgramVertex::setupGL()
 {
     const float *f = static_cast<const float *>(mConstants[0]->getPtr());
@@ -44,19 +51,13 @@
         glLoadIdentity();
     }
 
+    //logMatrix("prog", &f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET]);
+    //logMatrix("model", &f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET]);
 
     glMatrixMode(GL_PROJECTION);
-    if (mProjectionEnable) {
-        glLoadMatrixf(&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET]);
-    } else {
-    }
-
+    glLoadMatrixf(&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET]);
     glMatrixMode(GL_MODELVIEW);
-    if (mTransformEnable) {
-        glLoadMatrixf(&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET]);
-    } else {
-        glLoadIdentity();
-    }
+    glLoadMatrixf(&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET]);
 }
 
 void ProgramVertex::setConstantType(uint32_t slot, const Type *t)
@@ -110,26 +111,11 @@
     rsc->mStateVertex.mPV->setConstantType(slot, static_cast<const Type *>(constants));
 }
 
-void rsi_ProgramVertexSetCameraMode(Context *rsc, bool ortho)
-{
-    rsc->mStateVertex.mPV->setProjectionEnabled(!ortho);
-}
-
 void rsi_ProgramVertexSetTextureMatrixEnable(Context *rsc, bool enable)
 {
     rsc->mStateVertex.mPV->setTextureMatrixEnable(enable);
 }
 
-void rsi_ProgramVertexSetModelMatrixEnable(Context *rsc, bool enable)
-{
-    rsc->mStateVertex.mPV->setTransformEnable(enable);
-}
-
-void rsi_ProgramVertexSetProjectionMatrixEnable(Context *rsc, bool enable)
-{
-    rsc->mStateVertex.mPV->setProjectionEnable(enable);
-}
-
 
 
 }
diff --git a/rsProgramVertex.h b/rsProgramVertex.h
index 677be6e..0b3a3eb 100644
--- a/rsProgramVertex.h
+++ b/rsProgramVertex.h
@@ -38,9 +38,6 @@
     void setConstantType(uint32_t slot, const Type *);
     void bindAllocation(uint32_t slot, Allocation *);
     void setTextureMatrixEnable(bool e) {mTextureMatrixEnable = e;}
-    void setProjectionEnabled(bool e) {mProjectionEnable = e;}
-    void setTransformEnable(bool e) {mTransformEnable = e;}
-    void setProjectionEnable(bool e) {mProjectionEnable = e;}
 
 protected:
     bool mDirty;
@@ -50,8 +47,6 @@
 
     // Hacks to create a program for now
     bool mTextureMatrixEnable;
-    bool mProjectionEnable;
-    bool mTransformEnable;
 
 };
 
diff --git a/rsScript.h b/rsScript.h
index d32f116..7dd2b61 100644
--- a/rsScript.h
+++ b/rsScript.h
@@ -39,7 +39,6 @@
 
     struct Enviroment_t {
         bool mIsRoot;
-        bool mIsOrtho;
         float mClearColor[4];
         float mClearDepth;
         uint32_t mClearStencil;
diff --git a/rsScriptC.cpp b/rsScriptC.cpp
index d29eb9f..2963831 100644
--- a/rsScriptC.cpp
+++ b/rsScriptC.cpp
@@ -428,7 +428,6 @@
     mEnviroment.mClearDepth = 1;
     mEnviroment.mClearStencil = 0;
     mEnviroment.mIsRoot = false;
-    mEnviroment.mIsOrtho = true;
 
     mAccScript = NULL;
 
@@ -556,12 +555,6 @@
     ss->mEnviroment.mIsRoot = isRoot;
 }
 
-void rsi_ScriptCSetOrtho(Context * rsc, bool isOrtho)
-{
-    ScriptCState *ss = &rsc->mScriptC;
-    ss->mEnviroment.mIsOrtho = isOrtho;
-}
-
 void rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len)
 {
     ScriptCState *ss = &rsc->mScriptC;