Use arrays in Grass RS
diff --git a/libs/rs/java/Grass/res/raw/grass.c b/libs/rs/java/Grass/res/raw/grass.c
index 83c8fed..59c6d9a 100644
--- a/libs/rs/java/Grass/res/raw/grass.c
+++ b/libs/rs/java/Grass/res/raw/grass.c
@@ -72,42 +72,43 @@
 }
 
 void drawNight(int width, int height) {
-    bindTexture(NAMED_PFBackground, 0, loadI32(RSID_TEXTURES, RSID_SKY_TEXTURE_NIGHT));
+    bindTexture(NAMED_PFBackground, 0, NAMED_TNight);
     drawRect(width - 512.0f, -32.0f, width, 1024.0f - 32.0f, 0.0f);
 }
 
 void drawSunrise(int width, int height) {
-    bindTexture(NAMED_PFBackground, 0, loadI32(RSID_TEXTURES, RSID_SKY_TEXTURE_SUNRISE));
+    bindTexture(NAMED_PFBackground, 0, NAMED_TSunrise);
     drawRect(0.0f, 0.0f, width, height, 0.0f);
 }
 
 void drawNoon(int width, int height) {
-    bindTexture(NAMED_PFBackground, 0, loadI32(RSID_TEXTURES, RSID_SKY_TEXTURE_NOON));
+    bindTexture(NAMED_PFBackground, 0, NAMED_TSky);
     drawRect(0.0f, 0.0f, width, height, 0.0f);
 }
 
 void drawSunset(int width, int height) {
-    bindTexture(NAMED_PFBackground, 0, loadI32(RSID_TEXTURES, RSID_SKY_TEXTURE_SUNSET));
+    bindTexture(NAMED_PFBackground, 0, NAMED_TSunset);
     drawRect(0.0f, 0.0f, width, height, 0.0f);
 }
 
 void drawBlade(int index, float now, int frameCount) {
-    float offset = loadF(RSID_BLADES, index + BLADE_STRUCT_OFFSET);
-    float scale = loadF(RSID_BLADES, index + BLADE_STRUCT_SCALE);
-    float angle = loadF(RSID_BLADES, index + BLADE_STRUCT_ANGLE);
-    float hardness = loadF(RSID_BLADES, index + BLADE_STRUCT_HARDNESS);
+    float *bladeStruct = loadArrayF(RSID_BLADES, index);
+    float offset = bladeStruct[BLADE_STRUCT_OFFSET];
+    float scale = bladeStruct[BLADE_STRUCT_SCALE];
+    float angle = bladeStruct[BLADE_STRUCT_ANGLE];
+    float hardness = bladeStruct[BLADE_STRUCT_HARDNESS];
     
-    float xpos = loadF(RSID_BLADES, index + BLADE_STRUCT_XPOS);
-    float ypos = loadF(RSID_BLADES, index + BLADE_STRUCT_YPOS);
+    float xpos = bladeStruct[BLADE_STRUCT_XPOS];
+    float ypos = bladeStruct[BLADE_STRUCT_YPOS];
 
-    float lengthX = loadF(RSID_BLADES, index + BLADE_STRUCT_LENGTHX);
-    float lengthY = loadF(RSID_BLADES, index + BLADE_STRUCT_LENGTHY);
+    float lengthX = bladeStruct[BLADE_STRUCT_LENGTHX];
+    float lengthY = bladeStruct[BLADE_STRUCT_LENGTHY];
 
-    int size = loadF(RSID_BLADES, index + BLADE_STRUCT_SIZE);
+    int size = bladeStruct[BLADE_STRUCT_SIZE];
 
-    float h = loadF(RSID_BLADES, index + BLADE_STRUCT_H);
-    float s = loadF(RSID_BLADES, index + BLADE_STRUCT_S);
-    float b = loadF(RSID_BLADES, index + BLADE_STRUCT_B);
+    float h = bladeStruct[BLADE_STRUCT_H];
+    float s = bladeStruct[BLADE_STRUCT_S];
+    float b = bladeStruct[BLADE_STRUCT_B];
 
     float newB = 1.0f;
     if (now >= MIDNIGHT && now < MORNING) {
@@ -162,9 +163,7 @@
 
 void drawBlades(float now, int frameCount) {
     // For anti-aliasing
-    bindProgramFragmentStore(NAMED_PFSGrass);
-    bindProgramFragment(NAMED_PFGrass);
-    bindTexture(NAMED_PFGrass, 0, loadI32(RSID_TEXTURES, RSID_GRASS_TEXTURE));
+    bindTexture(NAMED_PFBackground, 0, NAMED_TAa);
 
     int bladesCount = loadI32(RSID_STATE, RSID_BLADES_COUNT);
     int count = bladesCount * BLADE_STRUCT_FIELDS_COUNT;
diff --git a/libs/rs/java/Grass/src/com/android/grass/rs/GrassRS.java b/libs/rs/java/Grass/src/com/android/grass/rs/GrassRS.java
index d6fa105..a32739c 100644
--- a/libs/rs/java/Grass/src/com/android/grass/rs/GrassRS.java
+++ b/libs/rs/java/Grass/src/com/android/grass/rs/GrassRS.java
@@ -29,8 +29,6 @@
 import android.renderscript.ProgramVertex;
 import static android.renderscript.Element.*;
 import static android.util.MathUtils.*;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
 import android.renderscript.ScriptC;
 import android.renderscript.Type;
 import android.renderscript.Dimension;
@@ -84,9 +82,6 @@
     private Allocation mState;
     private Allocation mBlades;
 
-    private ProgramFragment mPfGrass;
-    private ProgramStore mPfsGrass;
-
     public GrassRS(int width, int height) {
         mWidth = width;
         mHeight = height;
@@ -111,8 +106,6 @@
         }
         mState.destroy();
         mBlades.destroy();
-        mPfGrass.destroy();
-        mPfsGrass.destroy();
         mTextureBufferIDs = null;
     }
 
@@ -130,6 +123,7 @@
         createProgramFragmentStore();
         createProgramFragment();
         createScriptStructures();
+        loadSkyTextures();
 
         ScriptC.Builder sb = new ScriptC.Builder(mRS);
         sb.setScript(mResources, R.raw.grass);
@@ -138,7 +132,6 @@
         mScript.setClearColor(0.0f, 0.0f, 0.0f, 1.0f);
         mScript.setTimeZone(TimeZone.getDefault().getID());
 
-        loadSkyTextures();
         mScript.bindAllocation(mState, RSID_STATE);
         mScript.bindAllocation(mTexturesIDs, RSID_TEXTURES);
         mScript.bindAllocation(mBlades, RSID_BLADES);
@@ -185,11 +178,11 @@
         mTexturesIDs = Allocation.createSized(mRS, USER_FLOAT, TEXTURES_COUNT);
 
         final Allocation[] textures = mTextures;
-        textures[0] = loadTexture(R.drawable.night, "night");
-        textures[1] = loadTexture(R.drawable.sunrise, "sunrise");
-        textures[2] = loadTexture(R.drawable.sky, "sky");
-        textures[3] = loadTexture(R.drawable.sunset, "sunset");
-        textures[4] = generateTextureAlpha(4, 1, new int[] { 0x00FFFF00 }, "aa");
+        textures[0] = loadTexture(R.drawable.night, "TNight");
+        textures[1] = loadTexture(R.drawable.sunrise, "TSunrise");
+        textures[2] = loadTexture(R.drawable.sky, "TSky");
+        textures[3] = loadTexture(R.drawable.sunset, "TSunset");
+        textures[4] = generateTextureAlpha(4, 1, new int[] { 0x00FFFF00 }, "TAa");
 
         final int[] bufferIds = mTextureBufferIDs;
         final int count = textures.length;
@@ -236,11 +229,6 @@
         mPfBackground = b.create();
         mPfBackground.setName("PFBackground");
         mPfBackground.bindSampler(mSampler, 0);
-
-        b.setTexEnvMode(REPLACE, 0);
-        mPfGrass = b.create();
-        mPfGrass.setName("PFGrass");
-        mPfGrass.bindSampler(mSampler, 0);
     }
 
     private void createProgramFragmentStore() {
@@ -253,10 +241,6 @@
         b.setDepthMask(false);
         mPfsBackground = b.create();
         mPfsBackground.setName("PFSBackground");
-
-        b.setBlendFunc(BlendSrcFunc.SRC_ALPHA, BlendDstFunc.ONE_MINUS_SRC_ALPHA);
-        mPfsGrass = b.create();
-        mPfsGrass.setName("PFSGrass");
     }
 
     private void createProgramVertex() {
diff --git a/libs/rs/rsScriptC_Lib.cpp b/libs/rs/rsScriptC_Lib.cpp
index 8a29be34..b7c66e2 100644
--- a/libs/rs/rsScriptC_Lib.cpp
+++ b/libs/rs/rsScriptC_Lib.cpp
@@ -59,22 +59,23 @@
     return i[offset];
 }
 
-static float* SC_loadArrayF(uint32_t bank)
+static float* SC_loadArrayF(uint32_t bank, uint32_t offset)
 {
     GET_TLS();
     void *vp = sc->mSlots[bank]->getPtr();
     float *f = static_cast<float *>(vp);
-    return f;
+    return f + offset;
 }
 
-static int32_t* SC_loadArrayI32(uint32_t bank)
+static int32_t* SC_loadArrayI32(uint32_t bank, uint32_t offset)
 {
     GET_TLS();
     void *vp = sc->mSlots[bank]->getPtr();
     int32_t *i = static_cast<int32_t *>(vp);
-    return i;
+    return i + offset;
 }
 
+
 static uint32_t SC_loadU32(uint32_t bank, uint32_t offset)
 {
     GET_TLS();
@@ -695,9 +696,9 @@
     { "loadF", (void *)&SC_loadF,
         "float", "(int, int)" },
     { "loadArrayF", (void *)&SC_loadArrayF,
-        "float*", "(int)" },
+        "float*", "(int, int)" },
     { "loadArrayI32", (void *)&SC_loadArrayI32,
-        "int*", "(int)" },
+        "int*", "(int, int)" },
     { "loadVec4", (void *)&SC_loadVec4,
         "void", "(int, int, float *)" },
     { "loadMatrix", (void *)&SC_loadMatrix,