commit 7c227ed220ac5d059146d275396d2185490fcd8d
Author: Leszek Koltunski <leszek@distoretedandroid.org>
Date:   Mon Jun 27 13:35:13 2016 +0100

    Bugfix in vertex shader  (vertices were shot into outer space if P==S, i.e. if center point was exactly equal to the vertex being computed)

diff --git a/src/main/res/raw/main_vertex_shader.glsl b/src/main/res/raw/main_vertex_shader.glsl
index 6c8654f..c602396 100644
--- a/src/main/res/raw/main_vertex_shader.glsl
+++ b/src/main/res/raw/main_vertex_shader.glsl
@@ -97,9 +97,10 @@ float degree_region(in vec3 region, in vec2 PS)
   vec2 PO  = PS + region.xy;
   float D = region.z*region.z-dot(PO,PO);      // D = |OX|^2 - |PO|^2
   float ps_sq = dot(PS,PS);
-  float DOT  = dot(PS,PO)/ps_sq;
+  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;
 
-  return max(sign(D),0.0) / (1.0 + 1.0/(sqrt(DOT*DOT+D/ps_sq)-DOT));  // if D<=0 (i.e p is outside the Region) return 0.
+  return max(sign(D),0.0) / (1.0 + 1.0/(sqrt(DOT*DOT+D*one_over_ps_sq)-DOT));  // if D<=0 (i.e p is outside the Region) return 0.
   }
 
 //////////////////////////////////////////////////////////////////////////////////////////////
@@ -113,9 +114,10 @@ float degree(in vec3 region, in vec2 S, in vec2 PS)
   float B = sign(A.x*A.y);
   float E = B*B*(1.0 + min(-PS.x/A.x,-PS.y/A.y));
   float ps_sq = dot(PS,PS);
-  float DOT  = dot(PS,PO)/ps_sq;
+  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;
 
-  return max(sign(D),0.0) * min(1.0/(1.0 + 1.0/(sqrt(DOT*DOT+D/ps_sq)-DOT)),E);  // if D<=0 (i.e p is outside the Region) return 0.
+  return max(sign(D),0.0) * min(1.0/(1.0 + 1.0/(sqrt(DOT*DOT+D*one_over_ps_sq)-DOT)),E);  // if D<=0 (i.e p is outside the Region) return 0.
   }
 
 //////////////////////////////////////////////////////////////////////////////////////////////
