diff --git a/res/drawable-nodpi/dot.png b/res/drawable-nodpi/dot.png
index fd8729f..586c3e2 100644
--- a/res/drawable-nodpi/dot.png
+++ b/res/drawable-nodpi/dot.png
Binary files differ
diff --git a/res/drawable-nodpi/wallpaper_thumb.png b/res/drawable-nodpi/wallpaper_thumb.png
index b0f604d..33ab307 100644
--- a/res/drawable-nodpi/wallpaper_thumb.png
+++ b/res/drawable-nodpi/wallpaper_thumb.png
Binary files differ
diff --git a/res/raw/bg_fs.glsl b/res/raw/bg_fs.glsl
new file mode 100644
index 0000000..d20885d
--- /dev/null
+++ b/res/raw/bg_fs.glsl
@@ -0,0 +1,5 @@
+varying lowp vec4 color;
+
+void main() {
+    gl_FragColor = color;
+}
\ No newline at end of file
diff --git a/res/raw/bg_vs.glsl b/res/raw/bg_vs.glsl
new file mode 100644
index 0000000..d604369
--- /dev/null
+++ b/res/raw/bg_vs.glsl
@@ -0,0 +1,6 @@
+varying lowp vec4 color;
+
+void main() {
+    color = ATTRIB_color;
+    gl_Position = vec4(ATTRIB_position.x + ATTRIB_offsetX, ATTRIB_position.y, 0.0, 1.0);
+}
\ No newline at end of file
diff --git a/res/raw/noisefield_vs.glsl b/res/raw/noisefield_vs.glsl
index ea38887..94f41f2 100644
--- a/res/raw/noisefield_vs.glsl
+++ b/res/raw/noisefield_vs.glsl
@@ -1,17 +1,10 @@
 varying float pointSize;
 varying float alpha;
-
 void main() {
-    vec4 pos;
-    pos.xyz = ATTRIB_position.xyz;
-    pos.w = 1.0;
-    pos.x = pos.x - ATTRIB_offsetX;
+    vec4 pos = vec4(ATTRIB_position.xyz, 1.0);
     gl_Position = UNI_MVP * pos;
 
-    float pointSize = 1.0 + ATTRIB_speed * ATTRIB_scaleSize * 3000.0;
+    float pointSize = 1.0 + ATTRIB_speed * UNI_scaleSize * 2500.0;
     alpha = ATTRIB_alpha;
     gl_PointSize = pointSize;
-}
-
-
-
+}
\ No newline at end of file
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 300b45a..e48c411 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
-    <string name="wallpaper_label">Bubble</string>
+    <string name="wallpaper_label">Bubbles</string>
     <string name="wallpaper_author">Google</string>
-    <string name="wallpaper_description">DESC</string>
+    <string name="wallpaper_description">Watch some bubbles</string>
 </resources>
diff --git a/src/com/android/noisefield/NoiseFieldRS.java b/src/com/android/noisefield/NoiseFieldRS.java
index 0ce7ca1..3962e0a 100644
--- a/src/com/android/noisefield/NoiseFieldRS.java
+++ b/src/com/android/noisefield/NoiseFieldRS.java
@@ -1,12 +1,11 @@
 package com.android.noisefield;
 
-import static android.renderscript.Sampler.Value.NEAREST;
-import static android.renderscript.Sampler.Value.WRAP;
-
 import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.renderscript.Allocation;
+import android.renderscript.Float3;
+import android.renderscript.Float4;
 import android.renderscript.Matrix4f;
 import android.renderscript.Mesh;
 import android.renderscript.Program;
@@ -18,14 +17,13 @@
 import android.renderscript.ProgramVertexFixedFunction;
 import android.renderscript.RenderScriptGL;
 import android.renderscript.Sampler;
+import android.renderscript.Mesh.Primitive;
 import android.renderscript.ProgramStore.BlendDstFunc;
 import android.renderscript.ProgramStore.BlendSrcFunc;
 import android.util.Log;
 
 public class NoiseFieldRS {
 
-    public static final int DOT_COUNT = 300;
-
     private Resources mRes;
     private RenderScriptGL mRS;
     private ScriptC_noisefield mScript;
@@ -34,55 +32,49 @@
     private final BitmapFactory.Options mOptionsARGB = new BitmapFactory.Options();
 
     private ScriptField_VpConsts mPvConsts;
-    private Allocation dotAllocation;
-    private Allocation bgAllocation;
-    private Allocation vignetteAllocation;
+    private Allocation mDotAllocation;
+    private ScriptField_VertexColor_s mVertexColors;
+    private ScriptField_Particle mDotParticles;
+    private Mesh mDotMesh;
+    private int mDensityDPI;
 
-    private ScriptField_Particle dotParticles;
-    private Mesh dotMesh;
+    public void init(int dpi, RenderScriptGL rs,
+                     Resources res, int width, int height) {
+        mDensityDPI = dpi;
 
-    private int densityDPI;
+        mRS = rs;
+        mRes = res;
 
-    boolean inited = false;
+        mWidth = width;
+        mHeight = height;
 
-    public void init(int dpi, RenderScriptGL rs, Resources res, int width, int height) {
-        if (!inited) {
-            densityDPI = dpi;
+        mOptionsARGB.inScaled = false;
+        mOptionsARGB.inPreferredConfig = Bitmap.Config.ARGB_8888;
 
-            mRS = rs;
-            mRes = res;
+        Mesh.AllocationBuilder smb2 = new Mesh.AllocationBuilder(mRS);
 
-            mWidth = width;
-            mHeight = height;
+        mDotParticles = new ScriptField_Particle(mRS, 150);
+        smb2.addVertexAllocation(mDotParticles.getAllocation());
 
-            mOptionsARGB.inScaled = false;
-            mOptionsARGB.inPreferredConfig = Bitmap.Config.ARGB_8888;
+        smb2.addIndexSetType(Mesh.Primitive.POINT);
+        mScript = new ScriptC_noisefield(mRS, mRes, R.raw.noisefield);
 
-            dotParticles = new ScriptField_Particle(mRS, DOT_COUNT);
-            Mesh.AllocationBuilder smb2 = new Mesh.AllocationBuilder(mRS);
-            smb2.addVertexAllocation(dotParticles.getAllocation());
-            smb2.addIndexSetType(Mesh.Primitive.POINT);
-            dotMesh = smb2.create();
 
-            mScript = new ScriptC_noisefield(mRS, mRes, R.raw.noisefield);
-            mScript.set_dotMesh(dotMesh);
-            mScript.bind_dotParticles(dotParticles);
+        mDotMesh = smb2.create();
+        mScript.set_dotMesh(mDotMesh);
+        mScript.bind_dotParticles(mDotParticles);
 
-            mPvConsts = new ScriptField_VpConsts(mRS, 1);
+        mPvConsts = new ScriptField_VpConsts(mRS, 1);
 
-            createProgramVertex();
-            createProgramRaster();
-            createProgramFragmentStore();
-            createProgramFragment();
-            loadTextures();
+        createProgramVertex();
+        createProgramRaster();
+        createProgramFragmentStore();
+        createProgramFragment();
+        createBackgroundMesh();
+        loadTextures();
 
-            mScript.set_densityDPI(densityDPI);
-
-            mRS.bindRootScript(mScript);
-
-            mScript.invoke_positionParticles();
-            inited = true;
-        }
+        mScript.set_densityDPI(mDensityDPI);
+        mScript.invoke_positionParticles();
     }
 
     private Matrix4f getProjectionNormalized(int w, int h) {
@@ -110,49 +102,154 @@
     }
 
     private void updateProjectionMatrices() {
-        Matrix4f proj = new Matrix4f();
-        proj.loadOrthoWindow(mWidth, mHeight);
-
-        Log.d("------------------- UPDATE PROJECTION MATRICES", mWidth + "  " + mHeight);
-
         Matrix4f projNorm = getProjectionNormalized(mWidth, mHeight);
         ScriptField_VpConsts.Item i = new ScriptField_VpConsts.Item();
-        // i.Proj = projNorm;
         i.MVP = projNorm;
+        i.scaleSize = mDensityDPI/240.0f;
         mPvConsts.set(i, 0, true);
     }
 
+    private void createBackgroundMesh() {
+        // The composition and colors of the background mesh were plotted on paper and photoshop
+        // first then translated to the code you see below. Points and colors are not random.
+
+        mVertexColors = new ScriptField_VertexColor_s(mRS, 48);
+        Float3 a = new Float3(-1.5f, 1.0f, 0.0f);
+        Float3 b = new Float3(0.0f, 1.0f, 0.0f);
+        Float3 c = new Float3(1.5f, 1.0f, 0.0f);
+        Float3 d = new Float3(-1.05f, 0.3f, 0.0f);
+        Float3 e = new Float3(-0.6f, 0.4f, 0.0f);
+        Float3 f = new Float3(0.3f, 0.4f, 0.0f);
+        Float3 g = new Float3(0.0f, 0.2f, 0.0f);
+        Float3 h = new Float3(-0.6f, 0.1f, 0.0f);
+        Float3 i = new Float3(-1.5f, -0.2f, 0.0f);
+        Float3 j = new Float3(-0.45f, -0.3f, 0.0f);
+        Float3 k = new Float3(-1.5f, -1.0f, 0.0f);
+        Float3 l = new Float3(1.5f, -1.0f, 0.0f);
+        mVertexColors.set_position(0, a, false);
+        mVertexColors.set_color(0, (new Float4(0.08f,0.335f,0.406f, 1.0f)), false);
+        mVertexColors.set_position(1, i, false);
+        mVertexColors.set_color(1, (new Float4(0.137f,0.176f,0.225f, 1.0f)), false);
+        mVertexColors.set_position(2, d, false);
+        mVertexColors.set_color(2, (new Float4(0.0f,0.088f,0.135f, 1.0f)), false);
+        mVertexColors.set_position(3, a, false);
+        mVertexColors.set_color(3, (new Float4(0.08f,0.335f,0.406f, 1.0f)), false);
+        mVertexColors.set_position(4, d, false);
+        mVertexColors.set_color(4, (new Float4(0.0f,0.088f,0.135f, 1.0f)), false);
+        mVertexColors.set_position(5, e, false);
+        mVertexColors.set_color(5, (new Float4(0.0f,0.184f,0.233f, 1.0f)), false);
+        mVertexColors.set_position(6, a, false);
+        mVertexColors.set_color(6, (new Float4(0.08f,0.335f,0.406f, 1.0f)), false);
+        mVertexColors.set_position(7, e, false);
+        mVertexColors.set_color(7, (new Float4(0.0f,0.184f,0.233f, 1.0f)), false);
+        mVertexColors.set_position(8, b, false);
+        mVertexColors.set_color(8, (new Float4(0.133f,0.404f,0.478f, 1.0f)), false);
+        mVertexColors.set_position(9, b, false);
+        mVertexColors.set_color(9, (new Float4(0.133f,0.404f,0.478f, 1.0f)), false);
+        mVertexColors.set_position(10, e, false);
+        mVertexColors.set_color(10, (new Float4(0.0f,0.184f,0.233f, 1.0f)), false);
+        mVertexColors.set_position(11, f, false);
+        mVertexColors.set_color(11, (new Float4(0.0f,0.124f,0.178f, 1.0f)), false);
+        mVertexColors.set_position(12, b, false);
+        mVertexColors.set_color(12, (new Float4(0.133f,0.404f,0.478f, 1.0f)), false);
+        mVertexColors.set_position(13, f, false);
+        mVertexColors.set_color(13, (new Float4(0.0f,0.124f,0.178f, 1.0f)), false);
+        mVertexColors.set_position(14, c, false);
+        mVertexColors.set_color(14, (new Float4(0.002f,0.173f,0.231f, 1.0f)), false);
+        mVertexColors.set_position(15, c, false);
+        mVertexColors.set_color(15, (new Float4(0.002f,0.173f,0.231f, 1.0f)), false);
+        mVertexColors.set_position(16, f, false);
+        mVertexColors.set_color(16, (new Float4(0.0f,0.124f,0.178f, 1.0f)), false);
+        mVertexColors.set_position(17, l, false);
+        mVertexColors.set_color(17, (new Float4(0.0f,0.088f,0.135f, 1.0f)), false);
+        mVertexColors.set_position(18, f, false);
+        mVertexColors.set_color(18, (new Float4(0.0f,0.124f,0.178f, 1.0f)), false);
+        mVertexColors.set_position(19, e, false);
+        mVertexColors.set_color(19, (new Float4(0.0f,0.184f,0.233f, 1.0f)), false);
+        mVertexColors.set_position(20, g, false);
+        mVertexColors.set_color(20, (new Float4(0.0f,0.088f,0.135f, 1.0f)), false);
+        mVertexColors.set_position(21, f, false);
+        mVertexColors.set_color(21, (new Float4(0.0f,0.124f,0.178f, 1.0f)), false);
+        mVertexColors.set_position(22, g, false);
+        mVertexColors.set_color(22, (new Float4(0.0f,0.088f,0.135f, 1.0f)), false);
+        mVertexColors.set_position(23, l, false);
+        mVertexColors.set_color(23, (new Float4(0.0f,0.088f,0.135f, 1.0f)), false);
+        mVertexColors.set_position(24, g, false);
+        mVertexColors.set_color(24, (new Float4(0.0f,0.088f,0.135f, 1.0f)), false);
+        mVertexColors.set_position(25, e, false);
+        mVertexColors.set_color(25, (new Float4(0.0f,0.184f,0.233f, 1.0f)), false);
+        mVertexColors.set_position(26, h, false);
+        mVertexColors.set_color(26, (new Float4(0.002f,0.196f,0.233f, 1.0f)), false);
+        mVertexColors.set_position(27, h, false);
+        mVertexColors.set_color(27, (new Float4(0.002f,0.196f,0.233f, 1.0f)), false);
+        mVertexColors.set_position(28, e, false);
+        mVertexColors.set_color(28, (new Float4(0.0f,0.184f,0.233f, 1.0f)), false);
+        mVertexColors.set_position(29, d, false);
+        mVertexColors.set_color(29, (new Float4(0.0f,0.088f,0.135f, 1.0f)), false);
+        mVertexColors.set_position(30, d, false);
+        mVertexColors.set_color(30, (new Float4(0.0f,0.088f,0.135f, 1.0f)), false);
+        mVertexColors.set_position(31, i, false);
+        mVertexColors.set_color(31, (new Float4(0.137f,0.176f,0.225f, 1.0f)), false);
+        mVertexColors.set_position(32, h, false);
+        mVertexColors.set_color(32, (new Float4(0.002f,0.196f,0.233f, 1.0f)), false);
+        mVertexColors.set_position(33, j, false);
+        mVertexColors.set_color(33, (new Float4(0.002f,0.059f,0.09f, 1.0f)), false);
+        mVertexColors.set_position(34, h, false);
+        mVertexColors.set_color(34, (new Float4(0.002f,0.196f,0.233f, 1.0f)), false);
+        mVertexColors.set_position(35, i, false);
+        mVertexColors.set_color(35, (new Float4(0.137f,0.176f,0.225f, 1.0f)), false);
+        mVertexColors.set_position(36, j, false);
+        mVertexColors.set_color(36, (new Float4(0.002f,0.059f,0.09f, 1.0f)), false);
+        mVertexColors.set_position(37, i, false);
+        mVertexColors.set_color(37, (new Float4(0.137f,0.176f,0.225f, 1.0f)), false);
+        mVertexColors.set_position(38, k, false);
+        mVertexColors.set_color(38, (new Float4(0.204f,0.212f,0.218f, 1.0f)), false);
+        mVertexColors.set_position(39, l, false);
+        mVertexColors.set_color(39, (new Float4(0.0f,0.088f,0.135f, 1.0f)), false);
+        mVertexColors.set_position(40, j, false);
+        mVertexColors.set_color(40, (new Float4(0.002f,0.059f,0.09f, 1.0f)), false);
+        mVertexColors.set_position(41, k, false);
+        mVertexColors.set_color(41, (new Float4(0.204f,0.212f,0.218f, 1.0f)), false);
+        mVertexColors.set_position(42, g, false);
+        mVertexColors.set_color(42, (new Float4(0.0f,0.088f,0.135f, 1.0f)), false);
+        mVertexColors.set_position(43, h, false);
+        mVertexColors.set_color(43, (new Float4(0.002f,0.196f,0.233f, 1.0f)), false);
+        mVertexColors.set_position(44, j, false);
+        mVertexColors.set_color(44, (new Float4(0.002f,0.059f,0.09f, 1.0f)), false);
+        mVertexColors.set_position(45, l, false);
+        mVertexColors.set_color(45, (new Float4(0.0f,0.088f,0.135f, 1.0f)), false);
+        mVertexColors.set_position(46, g, false);
+        mVertexColors.set_color(46, (new Float4(0.0f,0.088f,0.135f, 1.0f)), false);
+        mVertexColors.set_position(47, j, false);
+        mVertexColors.set_color(47, (new Float4(0.002f,0.059f,0.09f, 1.0f)), false);
+
+        mVertexColors.copyAll();
+
+        Mesh.AllocationBuilder backgroundBuilder = new Mesh.AllocationBuilder(mRS);
+        backgroundBuilder.addIndexSetType(Primitive.TRIANGLE);
+        backgroundBuilder.addVertexAllocation(mVertexColors.getAllocation());
+        mScript.set_gBackgroundMesh(backgroundBuilder.create());
+
+        mScript.bind_vertexColors(mVertexColors);
+    }
+
     private Allocation loadTexture(int id) {
         final Allocation allocation = Allocation.createFromBitmapResource(mRS, mRes, id);
         return allocation;
     }
 
-    private Allocation loadTextureARGB(int id) {
-        Bitmap b = BitmapFactory.decodeResource(mRes, id, mOptionsARGB);
-        return Allocation.createFromBitmap(mRS, b,
-                Allocation.MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE,
-                Allocation.USAGE_GRAPHICS_TEXTURE);
-    }
-
     private void loadTextures() {
-        dotAllocation = loadTexture(R.drawable.dot);
-        bgAllocation = loadTexture(R.drawable.bg);
-        vignetteAllocation = loadTextureARGB(R.drawable.vignette);
-        mScript.set_textureDot(dotAllocation);
-        mScript.set_textureBg(bgAllocation);
-        mScript.set_textureVignette(vignetteAllocation);
+        mDotAllocation = loadTexture(R.drawable.dot);
+        mScript.set_textureDot(mDotAllocation);
     }
 
     private void createProgramVertex() {
-        ProgramVertexFixedFunction.Constants mPvOrthoAlloc = new ProgramVertexFixedFunction.Constants(
-                mRS);
-        Matrix4f proj = new Matrix4f();
-        proj.loadOrthoWindow(mWidth, mHeight);
-        mPvOrthoAlloc.setProjection(proj);
-        ProgramVertexFixedFunction.Builder pvb = new ProgramVertexFixedFunction.Builder(mRS);
-        ProgramVertex pv = pvb.create();
-        ((ProgramVertexFixedFunction) pv).bindConstants(mPvOrthoAlloc);
-        mScript.set_vertBg(pv);
+        ProgramVertex.Builder backgroundBuilder = new ProgramVertex.Builder(mRS);
+        backgroundBuilder.setShader(mRes, R.raw.bg_vs);
+        backgroundBuilder.addInput(ScriptField_VertexColor_s.createElement(mRS));
+        ProgramVertex programVertexBackground = backgroundBuilder.create();
+        mScript.set_vertBg(programVertexBackground);
+
 
         updateProjectionMatrices();
 
@@ -160,36 +257,23 @@
         builder = new ProgramVertex.Builder(mRS);
         builder.setShader(mRes, R.raw.noisefield_vs);
         builder.addConstant(mPvConsts.getType());
-        builder.addInput(dotMesh.getVertexAllocation(0).getType().getElement());
+        builder.addInput(mDotMesh.getVertexAllocation(0).getType().getElement());
+
         ProgramVertex pvs = builder.create();
         pvs.bindConstants(mPvConsts.getAllocation(), 0);
         mRS.bindProgramVertex(pvs);
         mScript.set_vertDots(pvs);
-
     }
 
     private void createProgramFragment() {
-        Sampler.Builder samplerBuilder = new Sampler.Builder(mRS);
-        samplerBuilder.setMinification(NEAREST);
-        samplerBuilder.setMagnification(NEAREST);
-        samplerBuilder.setWrapS(WRAP);
-        samplerBuilder.setWrapT(WRAP);
-        Sampler sn = samplerBuilder.create();
-        ProgramFragmentFixedFunction.Builder builderff = new ProgramFragmentFixedFunction.Builder(
-                mRS);
-        builderff.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE,
-                ProgramFragmentFixedFunction.Builder.Format.RGB, 0);
-
-        builderff.setVaryingColor(true);
-        ProgramFragment pfff = builderff.create();
-
-        mScript.set_fragBg(pfff);
-        pfff.bindSampler(sn, 0);
+        ProgramFragment.Builder backgroundBuilder = new ProgramFragment.Builder(mRS);
+        backgroundBuilder.setShader(mRes, R.raw.bg_fs);
+        ProgramFragment programFragmentBackground = backgroundBuilder.create();
+        mScript.set_fragBg(programFragmentBackground);
 
         ProgramFragment.Builder builder = new ProgramFragment.Builder(mRS);
-        builder = new ProgramFragment.Builder(mRS);
-        builder.addTexture(Program.TextureType.TEXTURE_2D);
         builder.setShader(mRes, R.raw.noisefield_fs);
+        builder.addTexture(Program.TextureType.TEXTURE_2D);
         ProgramFragment pf = builder.create();
         pf.bindSampler(Sampler.CLAMP_LINEAR(mRS), 0);
         mScript.set_fragDots(pf);
@@ -204,15 +288,8 @@
 
     private void createProgramFragmentStore() {
         ProgramStore.Builder builder = new ProgramStore.Builder(mRS);
-        // builder.setBlendFunc(BlendSrcFunc.SRC_ALPHA, BlendDstFunc.ONE_MINUS_SRC_ALPHA );
-        builder.setBlendFunc(BlendSrcFunc.SRC_ALPHA, BlendDstFunc.ONE);
-        // why alpha no work with additive blending?
-        // builder.setBlendFunc(BlendSrcFunc.ONE, BlendDstFunc.ONE);
+        builder.setBlendFunc(BlendSrcFunc.SRC_ALPHA, BlendDstFunc.ONE );
         mRS.bindProgramStore(builder.create());
-        mScript.set_storeAdd(builder.create());
-
-        builder.setBlendFunc(BlendSrcFunc.SRC_ALPHA, BlendDstFunc.ONE_MINUS_SRC_ALPHA);
-        mScript.set_storeAlpha(builder.create());
     }
 
     public void start() {
@@ -229,17 +306,7 @@
     }
 
     public void resize(int w, int h) {
-        // why do i need to do this again when surface changed for wallpaper, but not when as an app?
-        ProgramVertexFixedFunction.Constants mPvOrthoAlloc = new ProgramVertexFixedFunction.Constants(
-                mRS);
-        Matrix4f proj = new Matrix4f();
-        proj.loadOrthoWindow(w, h);
-        mPvOrthoAlloc.setProjection(proj);
 
-        ProgramVertexFixedFunction.Builder pvb = new ProgramVertexFixedFunction.Builder(mRS);
-        ProgramVertex pv = pvb.create();
-        ((ProgramVertexFixedFunction) pv).bindConstants(mPvOrthoAlloc);
-        mScript.set_vertBg(pv);
     }
 
 }
diff --git a/src/com/android/noisefield/NoiseFieldWallpaper.java b/src/com/android/noisefield/NoiseFieldWallpaper.java
index 7d26bd9..09661cf 100644
--- a/src/com/android/noisefield/NoiseFieldWallpaper.java
+++ b/src/com/android/noisefield/NoiseFieldWallpaper.java
@@ -28,7 +28,7 @@
             super.onCreate(surfaceHolder);
             setTouchEventsEnabled(true);
             surfaceHolder.setSizeFromLayout();
-            surfaceHolder.setFormat(PixelFormat.RGBA_8888);
+            surfaceHolder.setFormat(PixelFormat.RGB_888);
 
             DisplayMetrics metrics = new DisplayMetrics();
             ((WindowManager) getApplication().getSystemService(Service.WINDOW_SERVICE))
diff --git a/src/com/android/noisefield/noisefield.rs b/src/com/android/noisefield/noisefield.rs
index 1fb2ad9..f6b16d8 100644
--- a/src/com/android/noisefield/noisefield.rs
+++ b/src/com/android/noisefield/noisefield.rs
@@ -8,7 +8,6 @@
 
 
 rs_allocation textureDot;
-rs_allocation textureBg;
 rs_allocation textureVignette;
 
 rs_program_vertex vertBg;
@@ -20,33 +19,37 @@
 rs_program_store storeAlpha;
 rs_program_store storeAdd;
 
-typedef struct __attribute__((packed, aligned(4))) Particle {
-    float3 position;
-    float offsetX;
+typedef struct VpConsts {
+    rs_matrix4x4 MVP;
     float scaleSize;
+} VpConsts_t;
+VpConsts_t *vpConstants;
+
+typedef struct Particle {
+    float3 position;
     float speed;
     float wander;
     float alphaStart;
     float alpha;
-    float life;
-    float death;
+    int life;
+    int death;
 } Particle_t;
+Particle_t *dotParticles;
 
-typedef struct VpConsts {
-    rs_matrix4x4 MVP;
-} VpConsts_t;
-VpConsts_t *vpConstants;
 
-Particle_t *dotParticles; 
+typedef struct VertexColor_s {
+    float3 position;
+    float4 color;
+    float offsetX;
+
+} VertexColor;
+VertexColor* vertexColors;
+
 rs_mesh dotMesh;
-
+rs_mesh gBackgroundMesh;
 
 float densityDPI;
-float xOffset;
-
-
-
-
+float xOffset = 0.0;
 
 #define B 0x100
 #define BM 0xff
@@ -149,151 +152,100 @@
     q = g2[b11]; v = rx1 * q[0] + ry1 * q[1];
     b = mix(u, v, sx);
 
-    //return 1.5f * mix(a, b, sy);
-    return 8.0f * mix(a, b, sy);
+    return 1.5f * mix(a, b, sy);
 }
 
-
-
-
-
-
 void positionParticles(){
-    rsDebug("HELLO!!!!!!!!!!", rsUptimeMillis());
-
-    float width = rsgGetWidth();
-    float height = rsgGetHeight();
-
     Particle_t* particle = dotParticles;
     int size = rsAllocationGetDimX(rsGetAllocation(dotParticles));
-    
-    
-    
     for(int i=0; i<size; i++){
-    
-
         particle->position.x = rsRand(-1.0f, 1.0f);
         particle->position.y = rsRand(-1.0f, 1.0f);
-        particle->scaleSize = densityDPI/240.0f;
-        particle->position.z = 0.0;
-        particle->offsetX = xOffset;
         particle->speed = rsRand(0.0002f, 0.02f);
         particle->wander = rsRand(0.50f, 1.5f);
-        particle->death = 0.0;
-        particle->life = rsRand(300.0, 800.0f);
+        particle->death = 0;
+        particle->life = rsRand(300, 800);
         particle->alphaStart = rsRand(0.01f, 1.0f);
         particle->alpha = particle->alphaStart;
         particle++;
-        
-        float dist = sqrt(particle->position.x*particle->position.x + particle->position.y*particle->position.y);
-        if(dist < 0.75){
-            dist = 0;
-        } else {
-            dist = dist-0.75;
-        }
-        if(particle->alpha < 1.0f){
-            particle->alpha+=0.01;
-            particle->alpha *= (1-dist);
-        }
-        
     }
-    
-    
-    
-    
 }
 
-
-
 int root(){
-    float width = rsgGetWidth();
-    float height = rsgGetHeight();
-    
-    
-    
-    rsgClearColor(0.0f, 0.f, 0.f, 0.5f);
-    
-    rsgBindProgramStore(storeAdd);
-    
-    // bg
-    rsgBindProgramVertex(vertBg);
-    rsgBindProgramFragment(fragBg);
-    
-    rsgBindTexture(fragBg, 0, textureBg);
-    rsgDrawRect(0.0f, 0.0f, width, height, 0.0f);
-    
-    
+    rsgClearColor(0.0, 0.0, 0.0, 1.0f);
+
+    VertexColor* vert = vertexColors;
+    int size = rsAllocationGetDimX(rsGetAllocation(vertexColors));
+    for(int i=0; i<size; i++){
+        vert->offsetX = xOffset;
+        vert++;
+    }
+
     rsgBindProgramVertex(vertDots);
     rsgBindProgramFragment(fragDots);
     rsgBindTexture(fragDots, 0, textureDot);
-    
-    // dots
-    Particle_t* particle = dotParticles;
-    int size = rsAllocationGetDimX(rsGetAllocation(dotParticles));
-    for(int i=0; i<size; i++){
-        
-        if(particle->life < 0 || particle->position.x < -1.1 || particle->position.x >1.1 || particle->position.y < -1.7 || particle->position.y >1.7){
-            particle->position.x = rsRand(-1.0f, 1.0f);
-            particle->position.y = rsRand(-1.0f, 1.0f);
-
-            particle->speed = rsRand(0.0002f, 0.02f);
-            particle->wander = rsRand(0.50f, 1.5f);
-            particle->life = rsRand(300.0f, 800.0f);
-            particle->alphaStart = rsRand(0.01f, 1.0f);
-            particle->alpha = particle->alphaStart;
-            
-            particle->death = 0.0;
-        }
-        
-        
-        
-        
-            float noiseval = noisef2(particle->position.x*0.65, particle->position.y*0.65);
-            
-            float speed = noiseval * particle->speed + 0.01;
-            float angle = 360 * noiseval * particle->wander;
-            float rads = angle * 3.14159265 / 180.0;
-        
-            particle->position.x += cos(rads) * speed * 0.24;
-            particle->position.y += sin(rads) * speed * 0.24;
-        
-    
-            particle->life--;
-            particle->death++;
-        
-            float dist = sqrt(particle->position.x*particle->position.x + particle->position.y*particle->position.y);
-            if(dist < 0.75){
-                dist = 0;
-                particle->alphaStart *= (1-dist);
-                
-            } else {
-                dist = dist-0.75;
-                if(particle->alphaStart < 1.0f){
-                    particle->alphaStart +=0.01;
-                    particle->alphaStart *= (1-dist);
-                    
-                    
-                }
-            }
-            
-        
-            if(particle->death < 101.0){
-                particle->alpha = (particle->alphaStart)*(particle->death)/100.0;
-            } else if(particle->life < 101.0){
-                particle->alpha = particle->alpha*particle->life/100.0;
-            } else {
-                particle->alpha = particle->alphaStart;
-            }
-        
-            particle->offsetX = xOffset;
-        
-        
-        
-        particle++;
-    }
-    
-    
     rsgDrawMesh(dotMesh);
 
+    // bg
+    rsgBindProgramVertex(vertBg);
+    rsgBindProgramFragment(fragBg);
+    rsgDrawMesh(gBackgroundMesh);
+
+    // dots
+    Particle_t* particle = dotParticles;
+    size = rsAllocationGetDimX(rsGetAllocation(dotParticles));
+    for(int i=0; i<size; i++){
+
+        if(particle->life < 0 || particle->position.x < -1.2 ||
+           particle->position.x >1.2 || particle->position.y < -1.7 ||
+           particle->position.y >1.7){
+            particle->position.x = rsRand(-1.0f, 1.0f);
+            particle->position.y = rsRand(-1.0f, 1.0f);
+            particle->speed = rsRand(0.0002f, 0.02f);
+            particle->wander = rsRand(0.50f, 1.5f);
+            particle->death = 0;
+            particle->life = rsRand(300, 800);
+            particle->alphaStart = rsRand(0.01f, 1.0f);
+            particle->alpha = particle->alphaStart;
+        }
+
+        float noiseval = noisef2(particle->position.x, particle->position.y);
+
+        float speed = noiseval * particle->speed + 0.01;
+        float angle = 360 * noiseval * particle->wander;
+        float rads = angle * 3.14159265 / 180.0;
+
+        particle->position.x += cos(rads) * speed * 0.24;
+        particle->position.y += sin(rads) * speed * 0.24;
+
+        particle->life--;
+        particle->death++;
+
+        float dist = sqrt(particle->position.x*particle->position.x +
+                          particle->position.y*particle->position.y);
+        if(dist < 0.95){
+            dist = 0;
+            particle->alphaStart *= (1-dist);
+
+        } else {
+            dist = dist-0.95;
+            if(particle->alphaStart < 1.0f){
+                particle->alphaStart +=0.01;
+                particle->alphaStart *= (1-dist);
+            }
+        }
+
+        if(particle->death < 101){
+            particle->alpha = (particle->alphaStart)*(particle->death)/100.0;
+        } else if(particle->life < 101){
+            particle->alpha = particle->alpha*particle->life/100.0;
+        } else {
+            particle->alpha = particle->alphaStart;
+        }
+
+        particle++;
+    }
+
     return 35;
+
 }
