commit 369ee56a772ec32524c09975378fd93c1821bf6e
Author: Leszek Koltunski <leszek@distorted.org>
Date:   Mon Jun 27 23:57:03 2016 +0100

    fix in vertex shader

diff --git a/src/main/res/raw/main_vertex_shader.glsl b/src/main/res/raw/main_vertex_shader.glsl
index c602396..9797719 100644
--- a/src/main/res/raw/main_vertex_shader.glsl
+++ b/src/main/res/raw/main_vertex_shader.glsl
@@ -83,9 +83,12 @@ uniform vec3 vUniforms[3*NUM_VERTEX];     // i-th effect is 3 consecutive vec3's
 float degree_bitmap(in vec2 S, in vec2 PS)
   {
   vec2 A = sign(PS)*u_objD.xy + S;
-  float B = sign(A.x*A.y);
 
-  return B*B*(1.0 + min(-PS.x/A.x,-PS.y/A.y));
+  vec2 signA = sign(A);                           //
+  vec2 signA_SQ = signA*signA;                    // div = PS/A if A!=0, 0 otherwise.
+  vec2 div = signA_SQ*PS/(A+signA_SQ-vec2(1,1));  //
+
+  return 1.0-max(div.x,div.y);
   }
 
 //////////////////////////////////////////////////////////////////////////////////////////////
@@ -111,8 +114,11 @@ float degree(in vec3 region, in vec2 S, in vec2 PS)
   vec2 PO  = PS + region.xy;
   float D = region.z*region.z-dot(PO,PO);      // D = |OX|^2 - |PO|^2
   vec2 A = sign(PS)*u_objD.xy + S;
-  float B = sign(A.x*A.y);
-  float E = B*B*(1.0 + min(-PS.x/A.x,-PS.y/A.y));
+  vec2 signA = sign(A);
+  vec2 signA_SQ = signA*signA;
+  vec2 div = signA_SQ*PS/(A+signA_SQ-vec2(1,1));
+  float E = 1.0-max(div.x,div.y);
+
   float ps_sq = dot(PS,PS);
   float one_over_ps_sq = 1.0/(ps_sq+1.0-sign(ps_sq));  // return 1.0 if ps_sq = 0.0
   float DOT  = dot(PS,PO)*one_over_ps_sq;
@@ -279,7 +285,7 @@ void distort(in int effect, inout vec4 v, inout vec4 n)
   v.z += uz*d*d*(3.0*d*d -8.0*d +6.0);                                                          // thick bubble
   float b = -(12.0*uz*d*(1.0-d)*(1.0-d)*(1.0-d)) / (dt + (1.0-d)*dot(w,ps) + (sign(dt)-1.0) );  // the last part - (sign-1) is to avoid b being a NaN when ps=(0,0)
                 
-  v.xy += d*w;  
+  v.xy += d*w;
   n.xy += b*ps;
   }
  
