diff --git a/res/raw/allapps.rs b/res/raw/allapps.rs
index e1a762d..d947613 100644
--- a/res/raw/allapps.rs
+++ b/res/raw/allapps.rs
@@ -18,7 +18,7 @@
 int gNewTouchDown;
 float gFlingVelocity;
 int gIconCount;
-int gSelectedIconIndex;
+int gSelectedIconIndex = -1;
 rs_allocation gSelectedIconTexture;
 float gZoomTarget;
 rs_allocation gHomeButton;
@@ -34,7 +34,7 @@
 rs_allocation *gIconIDs;
 rs_allocation *gLabelIDs;
 
-typedef struct VpConsts_s {
+typedef struct VpConsts {
     float4 Position;
     float4 ScaleOffset;
     float2 BendPos;
@@ -310,7 +310,7 @@
                 float x = colWidth * col + (colWidth / 2);
                 vpConstants->Position.x = x + 0.2f;
 
-                if (gSelectedIconIndex == iconNum && !p && gSelectedIconTexture) {
+                if (gSelectedIconIndex == iconNum && !p && gSelectedIconTexture.p) {
                     rsgBindProgramFragment(gPFTexNearest);
                     rsgBindTexture(gPFTexNearest, 0, gSelectedIconTexture);
                     vpConstants->ImgSize.x = rsAllocationGetDimX(gSelectedIconTexture);
diff --git a/res/raw/allapps_bc.bc b/res/raw/allapps_bc.bc
index 36e234c..3835d7d 100644
--- a/res/raw/allapps_bc.bc
+++ b/res/raw/allapps_bc.bc
Binary files differ
diff --git a/src/com/android/launcher2/AllApps3D.java b/src/com/android/launcher2/AllApps3D.java
index 1279ff8..8896ec0 100644
--- a/src/com/android/launcher2/AllApps3D.java
+++ b/src/com/android/launcher2/AllApps3D.java
@@ -965,7 +965,7 @@
         private int mHeight;
 
         private Resources mRes;
-        ScriptC_allapps mScript;
+        ScriptC_Allapps mScript;
 
         //private ProgramStore mPSIcons;
         private ProgramFragment mPFTexMip;
@@ -1033,7 +1033,7 @@
             mRes = res;
             mWidth = width;
             mHeight = height;
-            mScript = new ScriptC_allapps(sRS, mRes, R.raw.allapps_bc, true);
+            mScript = new ScriptC_Allapps(sRS, mRes, R.raw.allapps_bc, true);
 
             initProgramVertex();
             initProgramFragment();
@@ -1264,7 +1264,7 @@
                 sRollo.mScript.set_gZoomTarget(0);
             }
             if (!animate) {
-                sRollo.mScript.invokable_SetZoom();
+                sRollo.mScript.invoke_setZoom();
             }
         }
 
@@ -1368,16 +1368,16 @@
         }
 
         void fling() {
-            mScript.invokable_Fling();
+            mScript.invoke_fling();
         }
 
         void move() {
-            mScript.invokable_Move();
+            mScript.invoke_move();
         }
 
         void moveTo(float row) {
             mScript.set_gTargetPos(row);
-            mScript.invokable_MoveTo();
+            mScript.invoke_moveTo();
         }
 
         /**
diff --git a/src/com/android/launcher2/ScriptC_Allapps.java b/src/com/android/launcher2/ScriptC_Allapps.java
new file mode 100644
index 0000000..55e3df0
--- /dev/null
+++ b/src/com/android/launcher2/ScriptC_Allapps.java
@@ -0,0 +1,300 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.launcher2;
+
+import android.renderscript.*;
+import android.content.res.Resources;
+import android.util.Log;
+
+public class ScriptC_Allapps extends ScriptC {
+    // Constructor
+    public  ScriptC_Allapps(RenderScript rs, Resources resources, int id, boolean isRoot) {
+        super(rs, resources, id, isRoot);
+    }
+
+    private final static int mExportVarIdx_COLUMNS_PER_PAGE_PORTRAIT = 0;
+    private int mExportVar_COLUMNS_PER_PAGE_PORTRAIT;
+    public void set_COLUMNS_PER_PAGE_PORTRAIT(int v) {
+        mExportVar_COLUMNS_PER_PAGE_PORTRAIT = v;
+        setVar(mExportVarIdx_COLUMNS_PER_PAGE_PORTRAIT, v);
+    }
+
+    public int get_COLUMNS_PER_PAGE_PORTRAIT() {
+        return mExportVar_COLUMNS_PER_PAGE_PORTRAIT;
+    }
+
+    private final static int mExportVarIdx_ROWS_PER_PAGE_PORTRAIT = 1;
+    private int mExportVar_ROWS_PER_PAGE_PORTRAIT;
+    public void set_ROWS_PER_PAGE_PORTRAIT(int v) {
+        mExportVar_ROWS_PER_PAGE_PORTRAIT = v;
+        setVar(mExportVarIdx_ROWS_PER_PAGE_PORTRAIT, v);
+    }
+
+    public int get_ROWS_PER_PAGE_PORTRAIT() {
+        return mExportVar_ROWS_PER_PAGE_PORTRAIT;
+    }
+
+    private final static int mExportVarIdx_COLUMNS_PER_PAGE_LANDSCAPE = 2;
+    private int mExportVar_COLUMNS_PER_PAGE_LANDSCAPE;
+    public void set_COLUMNS_PER_PAGE_LANDSCAPE(int v) {
+        mExportVar_COLUMNS_PER_PAGE_LANDSCAPE = v;
+        setVar(mExportVarIdx_COLUMNS_PER_PAGE_LANDSCAPE, v);
+    }
+
+    public int get_COLUMNS_PER_PAGE_LANDSCAPE() {
+        return mExportVar_COLUMNS_PER_PAGE_LANDSCAPE;
+    }
+
+    private final static int mExportVarIdx_ROWS_PER_PAGE_LANDSCAPE = 3;
+    private int mExportVar_ROWS_PER_PAGE_LANDSCAPE;
+    public void set_ROWS_PER_PAGE_LANDSCAPE(int v) {
+        mExportVar_ROWS_PER_PAGE_LANDSCAPE = v;
+        setVar(mExportVarIdx_ROWS_PER_PAGE_LANDSCAPE, v);
+    }
+
+    public int get_ROWS_PER_PAGE_LANDSCAPE() {
+        return mExportVar_ROWS_PER_PAGE_LANDSCAPE;
+    }
+
+    private final static int mExportVarIdx_gNewPositionX = 4;
+    private float mExportVar_gNewPositionX;
+    public void set_gNewPositionX(float v) {
+        mExportVar_gNewPositionX = v;
+        setVar(mExportVarIdx_gNewPositionX, v);
+    }
+
+    public float get_gNewPositionX() {
+        return mExportVar_gNewPositionX;
+    }
+
+    private final static int mExportVarIdx_gNewTouchDown = 5;
+    private int mExportVar_gNewTouchDown;
+    public void set_gNewTouchDown(int v) {
+        mExportVar_gNewTouchDown = v;
+        setVar(mExportVarIdx_gNewTouchDown, v);
+    }
+
+    public int get_gNewTouchDown() {
+        return mExportVar_gNewTouchDown;
+    }
+
+    private final static int mExportVarIdx_gFlingVelocity = 6;
+    private float mExportVar_gFlingVelocity;
+    public void set_gFlingVelocity(float v) {
+        mExportVar_gFlingVelocity = v;
+        setVar(mExportVarIdx_gFlingVelocity, v);
+    }
+
+    public float get_gFlingVelocity() {
+        return mExportVar_gFlingVelocity;
+    }
+
+    private final static int mExportVarIdx_gIconCount = 7;
+    private int mExportVar_gIconCount;
+    public void set_gIconCount(int v) {
+        mExportVar_gIconCount = v;
+        setVar(mExportVarIdx_gIconCount, v);
+    }
+
+    public int get_gIconCount() {
+        return mExportVar_gIconCount;
+    }
+
+    private final static int mExportVarIdx_gSelectedIconIndex = 8;
+    private int mExportVar_gSelectedIconIndex;
+    public void set_gSelectedIconIndex(int v) {
+        mExportVar_gSelectedIconIndex = v;
+        setVar(mExportVarIdx_gSelectedIconIndex, v);
+    }
+
+    public int get_gSelectedIconIndex() {
+        return mExportVar_gSelectedIconIndex;
+    }
+
+    private final static int mExportVarIdx_gSelectedIconTexture = 9;
+    private Allocation mExportVar_gSelectedIconTexture;
+    public void set_gSelectedIconTexture(Allocation v) {
+        mExportVar_gSelectedIconTexture = v;
+        setVar(mExportVarIdx_gSelectedIconTexture, (v == null) ? 0 : v.getID());
+    }
+
+    public Allocation get_gSelectedIconTexture() {
+        return mExportVar_gSelectedIconTexture;
+    }
+
+    private final static int mExportVarIdx_gZoomTarget = 10;
+    private float mExportVar_gZoomTarget;
+    public void set_gZoomTarget(float v) {
+        mExportVar_gZoomTarget = v;
+        setVar(mExportVarIdx_gZoomTarget, v);
+    }
+
+    public float get_gZoomTarget() {
+        return mExportVar_gZoomTarget;
+    }
+
+    private final static int mExportVarIdx_gHomeButton = 11;
+    private Allocation mExportVar_gHomeButton;
+    public void set_gHomeButton(Allocation v) {
+        mExportVar_gHomeButton = v;
+        setVar(mExportVarIdx_gHomeButton, (v == null) ? 0 : v.getID());
+    }
+
+    public Allocation get_gHomeButton() {
+        return mExportVar_gHomeButton;
+    }
+
+    private final static int mExportVarIdx_gTargetPos = 12;
+    private float mExportVar_gTargetPos;
+    public void set_gTargetPos(float v) {
+        mExportVar_gTargetPos = v;
+        setVar(mExportVarIdx_gTargetPos, v);
+    }
+
+    public float get_gTargetPos() {
+        return mExportVar_gTargetPos;
+    }
+
+    private final static int mExportVarIdx_gPFTexNearest = 13;
+    private ProgramFragment mExportVar_gPFTexNearest;
+    public void set_gPFTexNearest(ProgramFragment v) {
+        mExportVar_gPFTexNearest = v;
+        setVar(mExportVarIdx_gPFTexNearest, (v == null) ? 0 : v.getID());
+    }
+
+    public ProgramFragment get_gPFTexNearest() {
+        return mExportVar_gPFTexNearest;
+    }
+
+    private final static int mExportVarIdx_gPFTexMip = 14;
+    private ProgramFragment mExportVar_gPFTexMip;
+    public void set_gPFTexMip(ProgramFragment v) {
+        mExportVar_gPFTexMip = v;
+        setVar(mExportVarIdx_gPFTexMip, (v == null) ? 0 : v.getID());
+    }
+
+    public ProgramFragment get_gPFTexMip() {
+        return mExportVar_gPFTexMip;
+    }
+
+    private final static int mExportVarIdx_gPFTexMipAlpha = 15;
+    private ProgramFragment mExportVar_gPFTexMipAlpha;
+    public void set_gPFTexMipAlpha(ProgramFragment v) {
+        mExportVar_gPFTexMipAlpha = v;
+        setVar(mExportVarIdx_gPFTexMipAlpha, (v == null) ? 0 : v.getID());
+    }
+
+    public ProgramFragment get_gPFTexMipAlpha() {
+        return mExportVar_gPFTexMipAlpha;
+    }
+
+    private final static int mExportVarIdx_gPVCurve = 16;
+    private ProgramVertex mExportVar_gPVCurve;
+    public void set_gPVCurve(ProgramVertex v) {
+        mExportVar_gPVCurve = v;
+        setVar(mExportVarIdx_gPVCurve, (v == null) ? 0 : v.getID());
+    }
+
+    public ProgramVertex get_gPVCurve() {
+        return mExportVar_gPVCurve;
+    }
+
+    private final static int mExportVarIdx_gPS = 17;
+    private ProgramStore mExportVar_gPS;
+    public void set_gPS(ProgramStore v) {
+        mExportVar_gPS = v;
+        setVar(mExportVarIdx_gPS, (v == null) ? 0 : v.getID());
+    }
+
+    public ProgramStore get_gPS() {
+        return mExportVar_gPS;
+    }
+
+    private final static int mExportVarIdx_gSMCell = 18;
+    private SimpleMesh mExportVar_gSMCell;
+    public void set_gSMCell(SimpleMesh v) {
+        mExportVar_gSMCell = v;
+        setVar(mExportVarIdx_gSMCell, (v == null) ? 0 : v.getID());
+    }
+
+    public SimpleMesh get_gSMCell() {
+        return mExportVar_gSMCell;
+    }
+
+    private final static int mExportVarIdx_gIconIDs = 19;
+    private Allocation mExportVar_gIconIDs;
+    public void bind_gIconIDs(Allocation v) {
+        mExportVar_gIconIDs = v;
+        if(v == null) bindAllocation(null, mExportVarIdx_gIconIDs);
+        else bindAllocation(v, mExportVarIdx_gIconIDs);
+    }
+
+    public Allocation get_gIconIDs() {
+        return mExportVar_gIconIDs;
+    }
+
+    private final static int mExportVarIdx_gLabelIDs = 20;
+    private Allocation mExportVar_gLabelIDs;
+    public void bind_gLabelIDs(Allocation v) {
+        mExportVar_gLabelIDs = v;
+        if(v == null) bindAllocation(null, mExportVarIdx_gLabelIDs);
+        else bindAllocation(v, mExportVarIdx_gLabelIDs);
+    }
+
+    public Allocation get_gLabelIDs() {
+        return mExportVar_gLabelIDs;
+    }
+
+    private final static int mExportVarIdx_vpConstants = 21;
+    private ScriptField_VpConsts mExportVar_vpConstants;
+    public void bind_vpConstants(ScriptField_VpConsts v) {
+        mExportVar_vpConstants = v;
+        if(v == null) bindAllocation(null, mExportVarIdx_vpConstants);
+        else bindAllocation(v.getAllocation(), mExportVarIdx_vpConstants);
+    }
+
+    public ScriptField_VpConsts get_vpConstants() {
+        return mExportVar_vpConstants;
+    }
+
+    private final static int mExportFuncIdx_resetHWWar = 0;
+    public void invoke_resetHWWar() {
+        invoke(mExportFuncIdx_resetHWWar);
+    }
+
+    private final static int mExportFuncIdx_move = 1;
+    public void invoke_move() {
+        invoke(mExportFuncIdx_move);
+    }
+
+    private final static int mExportFuncIdx_moveTo = 2;
+    public void invoke_moveTo() {
+        invoke(mExportFuncIdx_moveTo);
+    }
+
+    private final static int mExportFuncIdx_setZoom = 3;
+    public void invoke_setZoom() {
+        invoke(mExportFuncIdx_setZoom);
+    }
+
+    private final static int mExportFuncIdx_fling = 4;
+    public void invoke_fling() {
+        invoke(mExportFuncIdx_fling);
+    }
+
+}
+
diff --git a/src/com/android/launcher2/ScriptC_allapps.java b/src/com/android/launcher2/ScriptC_allapps.java
deleted file mode 100644
index 4bd1c39..0000000
--- a/src/com/android/launcher2/ScriptC_allapps.java
+++ /dev/null
@@ -1,197 +0,0 @@
-
-package com.android.launcher2;
-
-import android.content.res.Resources;
-import android.renderscript.*;
-import android.util.Log;
-
-public class ScriptC_allapps
-    extends android.renderscript.ScriptC
-{
-    public ScriptC_allapps(RenderScript rs, Resources resources, int id, boolean isRoot) {
-        super(rs, resources, id, isRoot);
-    }
-
-    private int mField_COLUMNS_PER_PAGE_PORTRAIT;
-    public void set_COLUMNS_PER_PAGE_PORTRAIT(int v) {
-        mField_COLUMNS_PER_PAGE_PORTRAIT = v;
-        setVar(0, v);
-    }
-
-    private int mField_ROWS_PER_PAGE_PORTRAIT;
-    public void set_ROWS_PER_PAGE_PORTRAIT(int v) {
-        mField_ROWS_PER_PAGE_PORTRAIT = v;
-        setVar(1, v);
-    }
-
-    private int mField_COLUMNS_PER_PAGE_LANDSCAPE;
-    public void set_COLUMNS_PER_PAGE_LANDSCAPE(int v) {
-        mField_COLUMNS_PER_PAGE_LANDSCAPE = v;
-        setVar(2, v);
-    }
-
-    private int mField_ROWS_PER_PAGE_LANDSCAPE;
-    public void set_ROWS_PER_PAGE_LANDSCAPE(int v) {
-        mField_ROWS_PER_PAGE_LANDSCAPE = v;
-        setVar(3, v);
-    }
-
-
-    private float mField_gNewPositionX;
-    public void set_gNewPositionX(float v) {
-        mField_gNewPositionX = v;
-        setVar(4, v);
-    }
-
-    private int mField_gNewTouchDown;
-    public void set_gNewTouchDown(int v) {
-        mField_gNewTouchDown = v;
-        setVar(5, v);
-    }
-
-    private float mField_gFlingVelocity;
-    public void set_gFlingVelocity(float v) {
-        mField_gFlingVelocity = v;
-        setVar(6, v);
-    }
-
-    private int mField_gIconCount;
-    public void set_gIconCount(int v) {
-        mField_gIconCount = v;
-        setVar(7, v);
-    }
-    public int get_gIconCount() {
-        return mField_gIconCount;
-    }
-
-    private int mField_gSelectedIconIndex;
-    public void set_gSelectedIconIndex(int v) {
-        mField_gSelectedIconIndex = v;
-        setVar(8, v);
-    }
-    public int get_gSelectedIconIndex() {
-        return mField_gSelectedIconIndex;
-    }
-
-    private Allocation mField_gSelectedIconTexture;
-    public void set_gSelectedIconTexture(Allocation v) {
-        mField_gSelectedIconTexture = v;
-        setVar(9, v.getID());
-    }
-
-    private float mField_gZoomTarget;
-    public void set_gZoomTarget(float v) {
-        mField_gZoomTarget = v;
-        setVar(10, v);
-    }
-
-    private Allocation mField_gHomeButton;
-    public void set_gHomeButton(Allocation v) {
-        mField_gHomeButton = v;
-        setVar(11, v.getID());
-    }
-
-    private float mField_gTargetPos;
-    public void set_gTargetPos(float v) {
-        mField_gTargetPos = v;
-        setVar(12, v);
-    }
-
-
-    private ProgramFragment mField_gPFTexNearest;
-    public void set_gPFTexNearest(ProgramFragment v) {
-        mField_gPFTexNearest = v;
-        setVar(13, v.getID());
-    }
-
-    private ProgramFragment mField_gPFTexMip;
-    public void set_gPFTexMip(ProgramFragment v) {
-        mField_gPFTexMip = v;
-        setVar(14, v.getID());
-    }
-
-    private ProgramFragment mField_gPFTexMipAlpha;
-    public void set_gPFTexMipAlpha(ProgramFragment v) {
-        mField_gPFTexMipAlpha = v;
-        setVar(15, v.getID());
-    }
-
-    private ProgramVertex mField_gPVCurve;
-    public void set_gPVCurve(ProgramVertex v) {
-        mField_gPVCurve = v;
-        setVar(16, v.getID());
-    }
-
-    private ProgramStore mField_gPS;
-    public void set_gPS(ProgramStore v) {
-        mField_gPS = v;
-        setVar(17, v.getID());
-    }
-
-    private SimpleMesh mField_gSMCell;
-    public void set_gSMCell(SimpleMesh v) {
-        mField_gSMCell = v;
-        setVar(18, v.getID());
-    }
-
-
-    // binds
-    private Allocation mField_gIconIDs;
-    public void bind_gIconIDs(Allocation f) {
-        mField_gIconIDs = f;
-        bindAllocation(f, 19);
-    }
-    public Allocation get_gIconIDs() {
-        return mField_gIconIDs;
-    }
-
-    private Allocation mField_gLabelIDs;
-    public void bind_gLabelIDs(Allocation f) {
-        mField_gLabelIDs = f;
-        bindAllocation(f, 20);
-    }
-    public Allocation get_gLabelIDs() {
-        return mField_gLabelIDs;
-    }
-
-    private ScriptField_VpConsts mField_vpConstants;
-    public void bind_vpConstants(ScriptField_VpConsts f) {
-        android.util.Log.e("rs", "bind_vpConstants " + f);
-        mField_vpConstants = f;
-        if (f == null) {
-            bindAllocation(null, 21);
-        } else {
-            bindAllocation(f.getAllocation(), 21);
-        }
-    }
-    public ScriptField_VpConsts get_vpConstants() {
-        return mField_vpConstants;
-    }
-
-
-
-//#pragma rs export_func(resetHWWar, move, moveTo, setZoom, fling)
-
-    public void invokable_Move() {
-        //android.util.Log.e("rs", "invokable_Move");
-        invoke(7);  // verified
-    }
-    public void invokable_MoveTo() {
-        //android.util.Log.e("rs", "invokable_MoveTo");
-        invoke(8);  // verified
-    }
-    public void invokable_Fling() {
-        //android.util.Log.e("rs", "invokable_Fling");
-        invoke(2);
-    }
-    //public void invokable_ResetWAR() {
-        //android.util.Log.e("rs", "invokable_WAR");
-        //invoke(9);  // verified
-    //}
-    public void invokable_SetZoom() {
-        //android.util.Log.e("rs", "invokable_SetZoom");
-        invoke(12);
-    }
-}
-
-
diff --git a/src/com/android/launcher2/ScriptField_VpConsts.java b/src/com/android/launcher2/ScriptField_VpConsts.java
index c6411fe..f3ef684 100644
--- a/src/com/android/launcher2/ScriptField_VpConsts.java
+++ b/src/com/android/launcher2/ScriptField_VpConsts.java
@@ -1,15 +1,34 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 
 package com.android.launcher2;
 
-import android.content.res.Resources;
 import android.renderscript.*;
+import android.content.res.Resources;
 import android.util.Log;
 
-public class ScriptField_VpConsts
-    extends android.renderscript.Script.FieldBase
-{
-
+public class ScriptField_VpConsts extends android.renderscript.Script.FieldBase {
     static public class Item {
+        public static final int sizeof = 48;
+
+        Float4 Position;
+        Float4 ScaleOffset;
+        Float2 BendPos;
+        Float2 ImgSize;
+
         Item() {
             Position = new Float4();
             ScaleOffset = new Float4();
@@ -17,32 +36,27 @@
             ImgSize = new Float2();
         }
 
-        public static final int sizeof = (12*4);
-
-        Float4 Position;
-        Float4 ScaleOffset;
-        Float2 BendPos;
-        Float2 ImgSize;
     }
+
     private Item mItemArray[];
-
-
-    public ScriptField_VpConsts(RenderScript rs, int count) {
-        // Allocate a pack/unpack buffer
-        mIOBuffer = new FieldPacker(Item.sizeof * count);
-        mItemArray = new Item[count];
-
-        Element.Builder eb = new Element.Builder(rs);
-        eb.add(Element.F32_4(rs), "Position");
-        eb.add(Element.F32_4(rs), "ScaleOffset");
-        eb.add(Element.F32_2(rs), "BendPos");
-        eb.add(Element.F32_2(rs), "ImgSize");
-        mElement = eb.create();
+    private FieldPacker mIOBuffer;
+    public  ScriptField_VpConsts(RenderScript rs, int count) {
+        mItemArray = null;
+        mIOBuffer = null;
+        {
+            Element.Builder eb = new Element.Builder(rs);
+            eb.add(Element.createVector(rs, Element.DataType.FLOAT_32, 4), "Position");
+            eb.add(Element.createVector(rs, Element.DataType.FLOAT_32, 4), "ScaleOffset");
+            eb.add(Element.createVector(rs, Element.DataType.FLOAT_32, 2), "BendPos");
+            eb.add(Element.createVector(rs, Element.DataType.FLOAT_32, 2), "ImgSize");
+            mElement = eb.create();
+        }
 
         init(rs, count);
     }
 
     private void copyToArray(Item i, int index) {
+        if (mIOBuffer == null) mIOBuffer = new FieldPacker(Item.sizeof * mType.getX() /* count */);
         mIOBuffer.reset(index * Item.sizeof);
         mIOBuffer.addF32(i.Position);
         mIOBuffer.addF32(i.ScaleOffset);
@@ -51,23 +65,19 @@
     }
 
     public void set(Item i, int index, boolean copyNow) {
+        if (mItemArray == null) mItemArray = new Item[mType.getX() /* count */];
         mItemArray[index] = i;
-        if (copyNow) {
+        if (copyNow)  {
             copyToArray(i, index);
             mAllocation.subData1D(index * Item.sizeof, Item.sizeof, mIOBuffer.getData());
         }
+
     }
 
     public void copyAll() {
-        for (int ct=0; ct < mItemArray.length; ct++) {
-            copyToArray(mItemArray[ct], ct);
-        }
+        for (int ct=0; ct < mItemArray.length; ct++) copyToArray(mItemArray[ct], ct);
         mAllocation.data(mIOBuffer.getData());
     }
 
-
-    private FieldPacker mIOBuffer;
-
-
 }
 
