commit b86265d65b81c44a585756355ed1a3084bd4c578
Author: Leszek Koltunski <leszek@distoretedandroid.org>
Date:   Thu Nov 24 14:38:37 2016 +0000

    Add 3rd dimension to the Deform effect.

diff --git a/src/main/res/raw/main_vertex_shader.glsl b/src/main/res/raw/main_vertex_shader.glsl
index fcaef9f..f528226 100644
--- a/src/main/res/raw/main_vertex_shader.glsl
+++ b/src/main/res/raw/main_vertex_shader.glsl
@@ -212,7 +212,7 @@ void restrictZ(inout float v)
 //        along the force line is.
 //        0<=C<1 looks completely ridiculous and C<0 destroys the system.
 
-void deform(in int effect, inout vec4 v)
+void deform(in int effect, inout vec4 v, inout vec4 n)
   {
   const vec2 ONE = vec2(1.0,1.0);
 
@@ -224,9 +224,11 @@ void deform(in int effect, inout vec4 v)
   vec2 ps     = center-v.xy;
   vec2 aPS    = abs(ps);
   vec2 maxps  = u_objD.xy + abs(center);
-  vec2 force  = vUniforms[effect].xy * degree_region(vUniforms[effect+2],ps);
-  vec2 aForce = abs(force);
-
+  float d     = degree_region(vUniforms[effect+2],ps);
+  vec3 force  = vUniforms[effect].xyz * d;
+  vec2 aForce = abs(force.xy);
+  float denom = dot(ps+(1.0-d)*force.xy,ps);
+  float one_over_denom = 1.0/(denom-0.001*(sign(denom)-1.0));
   vec2 Aw = A*maxps;
   vec2 quot = ps / maxps;
   quot = quot*quot;                          // ( (x/W)^2 , (y/H)^2 ) where x,y are distances from V to center
@@ -243,6 +245,11 @@ void deform(in int effect, inout vec4 v)
 
   v.x -= (mvXvert+mvXhorz);
   v.y -= (mvYvert+mvYhorz);
+
+  v.z += force.z*d*d*(3.0*d*d -8.0*d +6.0);                          // thick bubble
+  float b = -(12.0*force.z*d*(1.0-d)*(1.0-d)*(1.0-d))*one_over_denom;//
+
+  n.xy += n.z*b*ps;
   }
 
 //////////////////////////////////////////////////////////////////////////////////////////////
@@ -527,7 +534,7 @@ void main()
   for(int i=0; i<vNumEffects; i++)
     {
          if( vType[i]==DISTORT) distort(3*i,v,n);
-    else if( vType[i]==DEFORM ) deform (3*i,v);
+    else if( vType[i]==DEFORM ) deform (3*i,v,n);
     else if( vType[i]==SINK   ) sink   (3*i,v);
     else if( vType[i]==PINCH  ) pinch  (3*i,v);
     else if( vType[i]==SWIRL  ) swirl  (3*i,v);
