diff --git a/res/raw/bg_vs.glsl b/res/raw/bg_vs.glsl
index d604369..d83c5f1 100644
--- a/res/raw/bg_vs.glsl
+++ b/res/raw/bg_vs.glsl
@@ -2,5 +2,5 @@
 
 void main() {
     color = ATTRIB_color;
-    gl_Position = vec4(ATTRIB_position.x + ATTRIB_offsetX, ATTRIB_position.y, 0.0, 1.0);
+    gl_Position = vec4(ATTRIB_position.x, ATTRIB_position.y, 0.0, 1.0);
 }
\ No newline at end of file
diff --git a/res/raw/bgmesh.csv b/res/raw/bgmesh.csv
new file mode 100644
index 0000000..56ca0b4
--- /dev/null
+++ b/res/raw/bgmesh.csv
@@ -0,0 +1,48 @@
+-1.5,1.0,0.08,0.335,0.406
+-1.5,-0.2,0.137,0.176,0.225
+-1.05,0.3,0.0,0.088,0.135
+-1.5,1.0,0.08,0.335,0.406
+-1.05,0.3,0.0,0.088,0.135
+-0.6,0.4,0.0,0.184,0.233
+-1.5,1.0,0.08,0.335,0.406
+-0.6,0.4,0.0,0.184,0.233
+0.0,1.0,0.133,0.404,0.478
+0.0,1.0,0.133,0.404,0.478
+-0.6,0.4,0.0,0.184,0.233
+0.3,0.4,0.0,0.124,0.178
+0.0,1.0,0.133,0.404,0.478
+0.3,0.4,0.0,0.124,0.178
+1.5,1.0,0.002,0.173,0.231
+1.5,1.0,0.002,0.173,0.231
+0.3,0.4,0.0,0.124,0.178
+1.5,-1.0,0.0,0.088,0.135
+0.3,0.4,0.0,0.124,0.178
+-0.6,0.4,0.0,0.184,0.233
+0.0,0.2,0.0,0.088,0.135
+0.3,0.4,0.0,0.124,0.178
+0.0,0.2,0.0,0.088,0.135
+1.5,-1.0,0.0,0.088,0.135
+0.0,0.2,0.0,0.088,0.135
+-0.6,0.4,0.0,0.184,0.233
+-0.6,0.1,0.002,0.196,0.233
+-0.6,0.1,0.002,0.196,0.233
+-0.6,0.4,0.0,0.184,0.233
+-1.05,0.3,0.0,0.088,0.135
+-1.05,0.3,0.0,0.088,0.135
+-1.5,-0.2,0.137,0.176,0.225
+-0.6,0.1,0.002,0.196,0.233
+-0.45,-0.3,0.002,0.059,0.09
+-0.6,0.1,0.002,0.196,0.233
+-1.5,-0.2,0.137,0.176,0.225
+-0.45,-0.3,0.002,0.059,0.09
+-1.5,-0.2,0.137,0.176,0.225
+-1.5,-1.0,0.204,0.212,0.218
+1.5,-1.0,0.0,0.088,0.135
+-0.45,-0.3,0.002,0.059,0.09
+-1.5,-1.0,0.204,0.212,0.218
+0.0,0.2,0.0,0.088,0.135
+-0.6,0.1,0.002,0.196,0.233
+-0.45,-0.3,0.002,0.059,0.09
+1.5,-1.0,0.0,0.088,0.135
+0.0,0.2,0.0,0.088,0.135
+-0.45,-0.3,0.002,0.059,0.09
\ No newline at end of file
diff --git a/src/com/android/noisefield/NoiseFieldRS.java b/src/com/android/noisefield/NoiseFieldRS.java
index 3962e0a..2ea4878 100644
--- a/src/com/android/noisefield/NoiseFieldRS.java
+++ b/src/com/android/noisefield/NoiseFieldRS.java
@@ -20,15 +20,25 @@
 import android.renderscript.Mesh.Primitive;
 import android.renderscript.ProgramStore.BlendDstFunc;
 import android.renderscript.ProgramStore.BlendSrcFunc;
+import android.os.Bundle;
+import android.app.WallpaperManager;
 import android.util.Log;
+import android.view.MotionEvent;
+import java.io.InputStreamReader;
+import java.io.InputStream;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.util.ArrayList;
 
 public class NoiseFieldRS {
+    public static String LOG_TAG = "NoiseField";
 
     private Resources mRes;
     private RenderScriptGL mRS;
     private ScriptC_noisefield mScript;
-    int mHeight;
-    int mWidth;
+    private int mHeight;
+    private int mWidth;
+    private boolean mTouchDown;
     private final BitmapFactory.Options mOptionsARGB = new BitmapFactory.Options();
 
     private ScriptField_VpConsts mPvConsts;
@@ -41,7 +51,6 @@
     public void init(int dpi, RenderScriptGL rs,
                      Resources res, int width, int height) {
         mDensityDPI = dpi;
-
         mRS = rs;
         mRes = res;
 
@@ -53,13 +62,12 @@
 
         Mesh.AllocationBuilder smb2 = new Mesh.AllocationBuilder(mRS);
 
-        mDotParticles = new ScriptField_Particle(mRS, 150);
+        mDotParticles = new ScriptField_Particle(mRS, 83);
         smb2.addVertexAllocation(mDotParticles.getAllocation());
 
         smb2.addIndexSetType(Mesh.Primitive.POINT);
         mScript = new ScriptC_noisefield(mRS, mRes, R.raw.noisefield);
 
-
         mDotMesh = smb2.create();
         mScript.set_dotMesh(mDotMesh);
         mScript.bind_dotParticles(mDotParticles);
@@ -111,125 +119,44 @@
 
     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.
+        // first then translated to the csv file in raw. Points and colors are not random.
+        ArrayList<String> meshData = new ArrayList<String>();
+        InputStream inputStream = mRes.openRawResource(R.raw.bgmesh);
+        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
+        try {
+            String line;
+            while ((line = reader.readLine()) != null) {
+                meshData.add(line);
+            }
+        } catch (IOException e) {
+            Log.e(LOG_TAG, "Unable to load background mesh from csv file.");
+        } finally {
+            try {
+                inputStream.close();
+            } catch (IOException e) {
+                Log.e(LOG_TAG, "Unable to close background mesh csv file.");
+            }
+        }
 
-        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);
-
+        int meshDataSize = meshData.size();
+        mVertexColors = new ScriptField_VertexColor_s(mRS, meshDataSize);
+        for (int i=0; i<meshDataSize; i++) {
+            String line = (String) meshData.get(i);
+            String[] values = line.split(",");
+            float xPos = Float.parseFloat(values[0]);
+            float yPos = Float.parseFloat(values[1]);
+            float red = Float.parseFloat(values[2]);
+            float green = Float.parseFloat(values[3]);
+            float blue = Float.parseFloat(values[4]);
+            mVertexColors.set_position(i, new Float3(xPos, yPos, 0.0f), false);
+            mVertexColors.set_color(i, new Float4(red, green, blue, 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);
     }
 
@@ -250,7 +177,6 @@
         ProgramVertex programVertexBackground = backgroundBuilder.create();
         mScript.set_vertBg(programVertexBackground);
 
-
         updateProjectionMatrices();
 
         ProgramVertex.Builder builder = new ProgramVertex.Builder(mRS);
@@ -298,15 +224,33 @@
 
     public void stop() {
         mRS.bindRootScript(null);
-
-    }
-
-    public void setOffset(float xOffset, float yOffset, int xPixels, int yPixels) {
-        mScript.set_xOffset(xOffset - 0.5f);
     }
 
     public void resize(int w, int h) {
 
     }
 
-}
+    public void onTouchEvent(MotionEvent ev) {
+        int act = ev.getActionMasked();
+        if (act == MotionEvent.ACTION_UP || act == MotionEvent.ACTION_POINTER_UP) {
+            if(mTouchDown){
+                mTouchDown = false;
+                mScript.set_touchDown(mTouchDown);
+            }
+            return;
+        } else if(   act == MotionEvent.ACTION_DOWN
+                  || act == MotionEvent.ACTION_MOVE
+                  || act == MotionEvent.ACTION_POINTER_DOWN) {
+            int pcount = ev.getPointerCount();
+
+            if(!mTouchDown){
+                mTouchDown = true;
+                mScript.set_touchDown(mTouchDown);
+            }
+            if(pcount > 0){
+                // just send first pointer position
+                mScript.invoke_touch(ev.getX(0), ev.getY(0));
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/com/android/noisefield/NoiseFieldView.java b/src/com/android/noisefield/NoiseFieldView.java
index aa9bf6a..8a5e95f 100644
--- a/src/com/android/noisefield/NoiseFieldView.java
+++ b/src/com/android/noisefield/NoiseFieldView.java
@@ -27,7 +27,6 @@
             mRender = new NoiseFieldRS();
             mRender.init(240, mRS, getResources(), w, h);
         }
-
     }
 
     @Override
@@ -39,4 +38,4 @@
         }
     }
 
-}
+}
\ No newline at end of file
diff --git a/src/com/android/noisefield/NoiseFieldWallpaper.java b/src/com/android/noisefield/NoiseFieldWallpaper.java
index 09661cf..08a6769 100644
--- a/src/com/android/noisefield/NoiseFieldWallpaper.java
+++ b/src/com/android/noisefield/NoiseFieldWallpaper.java
@@ -10,6 +10,8 @@
 import android.util.DisplayMetrics;
 import android.view.SurfaceHolder;
 import android.view.WindowManager;
+import android.util.Log;
+import android.view.MotionEvent;
 
 public class NoiseFieldWallpaper extends WallpaperService {
 
@@ -21,7 +23,7 @@
     private class RenderScriptEngine extends Engine {
         private RenderScriptGL mRenderScript = null;
         private NoiseFieldRS mWallpaperRS = null;
-        private int densityDPI;
+        private int mDensityDPI;
 
         @Override
         public void onCreate(SurfaceHolder surfaceHolder) {
@@ -33,7 +35,7 @@
             DisplayMetrics metrics = new DisplayMetrics();
             ((WindowManager) getApplication().getSystemService(Service.WINDOW_SERVICE))
                     .getDefaultDisplay().getMetrics(metrics);
-            densityDPI = metrics.densityDpi;
+            mDensityDPI = metrics.densityDpi;
         }
 
         @Override
@@ -71,7 +73,10 @@
         }
 
         @Override
-        public void onSurfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) {
+        public void onSurfaceChanged(SurfaceHolder surfaceHolder,
+                                     int format,
+                                     int width,
+                                     int height) {
             super.onSurfaceChanged(surfaceHolder, format, width, height);
 
             if (mRenderScript != null) {
@@ -80,7 +85,7 @@
 
             if (mWallpaperRS == null) {
                 mWallpaperRS = new NoiseFieldRS();
-                mWallpaperRS.init(densityDPI, mRenderScript, getResources(), width, height);
+                mWallpaperRS.init(mDensityDPI, mRenderScript, getResources(), width, height);
                 mWallpaperRS.start();
             }
 
@@ -88,12 +93,9 @@
         }
 
         @Override
-        public Bundle onCommand(String action, int x, int y, int z, Bundle extras,
-                boolean resultRequested) {
-            if (mWallpaperRS != null) {
-                // return mWallpaperRS.onCommand(action, x, y, z, extras, resultRequested);
-            }
-            return null;
+        public void onTouchEvent(MotionEvent ev) {
+            super.onTouchEvent(ev);
+            mWallpaperRS.onTouchEvent(ev);
         }
 
         @Override
@@ -107,11 +109,5 @@
                 }
             }
         }
-
-        @Override
-        public void onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep,
-                float yOffsetStep, int xPixelOffset, int yPixelOffset) {
-            mWallpaperRS.setOffset(xOffset, yOffset, xPixelOffset, yPixelOffset);
-        }
     }
 }
diff --git a/src/com/android/noisefield/noisefield.rs b/src/com/android/noisefield/noisefield.rs
index f6b16d8..751f603 100644
--- a/src/com/android/noisefield/noisefield.rs
+++ b/src/com/android/noisefield/noisefield.rs
@@ -49,7 +49,7 @@
 rs_mesh gBackgroundMesh;
 
 float densityDPI;
-float xOffset = 0.0;
+bool touchDown = false;
 
 #define B 0x100
 #define BM 0xff
@@ -60,30 +60,31 @@
 static float g2[B + B + 2][2];
 static float g1[B + B + 2];
 
-static float noise_sCurve(float t)
-{
+// used for motion easing from touch to non-touch state
+static float touchInfluence = 0;
+
+static float touchX = 0;
+static float touchY = 0;
+
+static float noise_sCurve(float t) {
     return t * t * (3.0f - 2.0f * t);
 }
 
-static void normalizef2(float v[])
-{
+static void normalizef2(float v[]) {
     float s = (float)sqrt(v[0] * v[0] + v[1] * v[1]);
     v[0] = v[0] / s;
     v[1] = v[1] / s;
 }
 
-static void normalizef3(float v[])
-{
+static void normalizef3(float v[]) {
     float s = (float)sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
     v[0] = v[0] / s;
     v[1] = v[1] / s;
     v[2] = v[2] / s;
 }
 
-void init()
-{
+void init() {
     int i, j, k;
-
     for (i = 0; i < B; i++) {
         p[i] = i;
 
@@ -114,8 +115,7 @@
     }
 }
 
-static float noisef2(float x, float y)
-{
+static float noisef2(float x, float y) {
     int bx0, bx1, by0, by1, b00, b10, b01, b11;
     float rx0, rx1, ry0, ry1, sx, sy, a, b, t, u, v;
     float *q;
@@ -155,10 +155,10 @@
     return 1.5f * mix(a, b, sy);
 }
 
-void positionParticles(){
+void positionParticles() {
     Particle_t* particle = dotParticles;
     int size = rsAllocationGetDimX(rsGetAllocation(dotParticles));
-    for(int i=0; i<size; i++){
+    for(int i=0; i<size; i++) {
         particle->position.x = rsRand(-1.0f, 1.0f);
         particle->position.y = rsRand(-1.0f, 1.0f);
         particle->speed = rsRand(0.0002f, 0.02f);
@@ -171,16 +171,26 @@
     }
 }
 
-int root(){
-    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++;
+void touch(float x, float y) {
+    bool landscape = rsgGetWidth() > rsgGetHeight();
+    float wRatio;
+    float hRatio;
+    if(!landscape){
+        wRatio = 1.0;
+        hRatio = rsgGetHeight()/rsgGetWidth();
+    } else {
+        hRatio = 1.0;
+        wRatio = rsgGetWidth()/rsgGetHeight();
     }
 
+    touchInfluence = 1.0;
+    touchX = x/rsgGetWidth() * wRatio * 2 - wRatio;
+    touchY = -(y/rsgGetHeight() * hRatio * 2 - hRatio);
+}
+
+int root() {
+    rsgClearColor(0.0, 0.0, 0.0, 1.0f);
+    int size = rsAllocationGetDimX(rsGetAllocation(vertexColors));
     rsgBindProgramVertex(vertDots);
     rsgBindProgramFragment(fragDots);
     rsgBindTexture(fragDots, 0, textureDot);
@@ -194,11 +204,13 @@
     // dots
     Particle_t* particle = dotParticles;
     size = rsAllocationGetDimX(rsGetAllocation(dotParticles));
-    for(int i=0; i<size; i++){
+    float rads;
+    float speed;
 
+    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.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);
@@ -209,35 +221,52 @@
             particle->alpha = particle->alphaStart;
         }
 
+        float touchDist = sqrt(pow(touchX - particle->position.x, 2) +
+                               pow(touchY - particle->position.y, 2));
+
         float noiseval = noisef2(particle->position.x, particle->position.y);
+        if(touchDown || touchInfluence > 0.0) {
+            if(touchDown){
+                touchInfluence = 1.0;
+            }
+            rads = atan2(touchX - particle->position.x + noiseval,
+                         touchY - particle->position.y + noiseval);
+            if(touchDist != 0){
+                speed = ( (0.25 + (noiseval * particle->speed + 0.01)) / touchDist * 0.3 );
+                speed = speed * touchInfluence;
+            } else {
+                speed = .3;
+            }
+            particle->position.x += cos(rads) * speed * 0.2;
+            particle->position.y += sin(rads) * speed * 0.2;
+        }
 
-        float speed = noiseval * particle->speed + 0.01;
         float angle = 360 * noiseval * particle->wander;
-        float rads = angle * 3.14159265 / 180.0;
+        speed = noiseval * particle->speed + 0.01;
+        rads = angle * 3.14159265 / 180.0;
 
-        particle->position.x += cos(rads) * speed * 0.24;
-        particle->position.y += sin(rads) * speed * 0.24;
+        particle->position.x += cos(rads) * speed * 0.33;
+        particle->position.y += sin(rads) * speed * 0.33;
 
         particle->life--;
         particle->death++;
 
         float dist = sqrt(particle->position.x*particle->position.x +
                           particle->position.y*particle->position.y);
-        if(dist < 0.95){
+        if(dist < 0.95) {
             dist = 0;
             particle->alphaStart *= (1-dist);
-
         } else {
             dist = dist-0.95;
-            if(particle->alphaStart < 1.0f){
+            if(particle->alphaStart < 1.0f) {
                 particle->alphaStart +=0.01;
                 particle->alphaStart *= (1-dist);
             }
         }
 
-        if(particle->death < 101){
+        if(particle->death < 101) {
             particle->alpha = (particle->alphaStart)*(particle->death)/100.0;
-        } else if(particle->life < 101){
+        } else if(particle->life < 101) {
             particle->alpha = particle->alpha*particle->life/100.0;
         } else {
             particle->alpha = particle->alphaStart;
@@ -246,6 +275,8 @@
         particle++;
     }
 
+    if(touchInfluence > 0) {
+        touchInfluence-=0.01;
+    }
     return 35;
-
-}
+}
\ No newline at end of file
