commit dbeddd9d4e519e1a06eeef3c3efde1065afcd0a6
Author: Leszek Koltunski <leszek@distoretedandroid.org>
Date:   Wed Nov 23 17:49:02 2016 +0000

    re-write the deform effect

diff --git a/src/main/res/raw/main_vertex_shader.glsl b/src/main/res/raw/main_vertex_shader.glsl
index 8e88ee6..a8e703c 100644
--- a/src/main/res/raw/main_vertex_shader.glsl
+++ b/src/main/res/raw/main_vertex_shader.glsl
@@ -217,25 +217,27 @@ void restrictZ(inout float v)
   
 void deform(in int effect, inout vec4 v)
   {
+  const float A = 0.5;
+  const float B = 0.3;
+
   vec2 center = vUniforms[effect+1].yz;
-  vec2 force = vUniforms[effect].xy;    // force = vec(MM')
-  vec2 vert_vec, horz_vec; 
-  vec2 signXY = sign(center-v.xy);
-  vec2 time = (u_objD.xy+signXY*v.xy)/(u_objD.xy+signXY*center);
-  vec2 factorV = vec2(0.5,0.5) + (center*v.xy)/(4.0*u_objD.xy*u_objD.xy);
-  vec2 factorD = (u_objD.xy-signXY*center)/(2.0*u_objD.xy);
-  vec2 vert_d = factorD.x*force;
-  vec2 horz_d = factorD.y*force;
-  float dot = dot(force,force);
-  vec2 corr = 0.33 * (center+force+signXY*u_objD.xy) * dot / ( dot + (4.0*u_objD.x*u_objD.x) ); // .x = the vector tangent to X(t) at Fl = 0.3*vec(LM')  (or vec(RM') if signXY.x=-1).
-                                                                                                // .y = the vector tangent to X(t) at Fb = 0.3*vec(BM')  (or vec(TM') if signXY.y=-1)
-                                                                                                // the scalar: make the length of the speed vectors at Fl and Fr be 0 when force vector 'force' is zero
-  vert_vec.x = ( force.x-vert_d.x-corr.x )*time.x*time.x + corr.x*time.x + vert_d.x;
-  horz_vec.y = (-force.y+horz_d.y+corr.y )*time.y*time.y - corr.y*time.y - horz_d.y;
-  vert_vec.y = (-3.0*vert_d.y+2.0*force.y )*time.x*time.x*time.x + (-3.0*force.y+5.0*vert_d.y )*time.x*time.x - vert_d.y*time.x - vert_d.y;
-  horz_vec.x = ( 3.0*horz_d.x-2.0*force.x )*time.y*time.y*time.y + ( 3.0*force.x-5.0*horz_d.x )*time.y*time.y + horz_d.x*time.y + horz_d.x;
-  
-  v.xy += (factorV.y*vert_vec + factorV.x*horz_vec);
+  vec2 force  = vUniforms[effect].xy;
+  vec2 dist   = center-v.xy;
+  vec2 aDist  = abs(dist.xy);
+  vec2 maxdist= u_objD.xy + abs(center);
+  vec2 aForce = abs(force);
+
+  vec2 Aw = A*maxdist;
+  vec2 quot = dist / maxdist;
+
+  float mvXvert =-((B*dist.x*aForce.y)/(aForce.y + Aw.x))*(1.0-quot.y*quot.y);
+  float mvYvert = force.y*( 1.0 - quot.x*quot.x*(Aw.x/(aForce.y+Aw.x)) ) * aForce.y/(aForce.y+aDist.y);
+
+  float mvXhorz =-force.x*( 1.0 - quot.y*quot.y*(Aw.y/(aForce.x+Aw.y)) ) * aForce.x/(aForce.x+aDist.x);
+  float mvYhorz =-((B*dist.y*aForce.x)/(aForce.x + Aw.y))*(1.0-quot.x*quot.x);
+
+  v.x -= (mvXvert+mvXhorz);
+  v.y -= (mvYvert+mvYhorz);
   }
 
 //////////////////////////////////////////////////////////////////////////////////////////////
