| 72 | 72 |   vec3 signA = sign(A);                      //
 | 
  | 73 | 73 |   vec3 signA_SQ = signA*signA;               // div = PS/A if A!=0, 0 otherwise.
 | 
  | 74 | 74 |   vec3 div = signA_SQ*PS/(A-(ONE-signA_SQ)); //
 | 
  |  | 75 |   vec3 ret = sign(u_objD)-div;
 | 
  | 75 | 76 | 
 | 
  | 76 |  |   float d1= div.x-div.y;
 | 
  | 77 |  |   float d2= div.y-div.z;
 | 
  | 78 |  |   float d3= div.x-div.z;
 | 
  |  | 77 |   float d1= ret.x-ret.y;
 | 
  |  | 78 |   float d2= ret.y-ret.z;
 | 
  |  | 79 |   float d3= ret.x-ret.z;
 | 
  | 79 | 80 | 
 | 
  | 80 |  |   if( d1*d2>0.0 ) return 1.0-div.y;          //
 | 
  | 81 |  |   if( d1*d3>0.0 ) return 1.0-div.z;          // return 1-middle(div.x,div.y,div.z)
 | 
  | 82 |  |   return 1.0-div.x;                          //
 | 
  |  | 81 |   if( d1*d2>0.0 ) return ret.y;             //
 | 
  |  | 82 |   if( d1*d3>0.0 ) return ret.z;             // return 1-middle(div.x,div.y,div.z)
 | 
  |  | 83 |   return ret.x;                             // (unless size of object is 0 then 0-middle)
 | 
  | 83 | 84 |   }
 | 
  | 84 | 85 | 
 | 
  | 85 | 86 | //////////////////////////////////////////////////////////////////////////////////////////////
 | 
  | ... | ... |  | 
  | 93 | 94 | // Then, the degree of a point with respect to a given (spherical!) Region is defined by:
 | 
  | 94 | 95 | //
 | 
  | 95 | 96 | // If P is outside the sphere, return 0.
 | 
  | 96 |  | // Otherwise, let X be the point where the halfline SP meets the sphere - then return |PX|/||SX|,
 | 
  |  | 97 | // Otherwise, let X be the point where the halfline SP meets the sphere - then return |PX|/|SX|,
 | 
  | 97 | 98 | // aka the 'degree' of point P.
 | 
  | 98 | 99 | //
 | 
  | 99 | 100 | // We solve the triangle OPX.
 | 
  | ... | ... |  | 
  | 134 | 135 | 
 | 
  | 135 | 136 |   if( D<=0.0 ) return 0.0;
 | 
  | 136 | 137 | 
 | 
  | 137 |  |   vec3 A = sign(PS)*u_objD.xyz + S;
 | 
  |  | 138 |   vec3 A = sign(PS)*u_objD + S;
 | 
  | 138 | 139 |   vec3 signA = sign(A);
 | 
  | 139 | 140 |   vec3 signA_SQ = signA*signA;
 | 
  | 140 | 141 |   vec3 div = signA_SQ*PS/(A-(vec3(1.0,1.0,1.0)-signA_SQ));
 | 
  |  | 142 |   vec3 ret = sign(u_objD)-div;                // if object is flat, make ret.z 0
 | 
  | 141 | 143 | 
 | 
  | 142 |  |   float d1= div.x-div.y;
 | 
  | 143 |  |   float d2= div.y-div.z;
 | 
  | 144 |  |   float d3= div.x-div.z;
 | 
  | 145 |  |   float E;
 | 
  |  | 144 |   float d1= ret.x-ret.y;
 | 
  |  | 145 |   float d2= ret.y-ret.z;
 | 
  |  | 146 |   float d3= ret.x-ret.z;
 | 
  |  | 147 |   float degree_object;
 | 
  | 146 | 148 | 
 | 
  | 147 |  |        if( d1*d2>0.0 ) E= 1.0-div.y;
 | 
  | 148 |  |   else if( d1*d3>0.0 ) E= 1.0-div.z;
 | 
  | 149 |  |   else                 E= 1.0-div.x;
 | 
  |  | 149 |        if( d1*d2>0.0 ) degree_object= ret.y;  //
 | 
  |  | 150 |   else if( d1*d3>0.0 ) degree_object= ret.z;  // middle of the ret.{x,y,z} triple
 | 
  |  | 151 |   else                 degree_object= ret.x;  //
 | 
  | 150 | 152 | 
 | 
  | 151 | 153 |   float ps_sq = dot(PS,PS);
 | 
  | 152 | 154 |   float one_over_ps_sq = 1.0/(ps_sq-(sign(ps_sq)-1.0));  // return 1.0 if ps_sq = 0.0
 | 
  | 153 | 155 |   float DOT  = dot(PS,PO)*one_over_ps_sq;
 | 
  |  | 156 |   float degree_region = 1.0/(1.0 + 1.0/(sqrt(DOT*DOT+D*one_over_ps_sq)-DOT));
 | 
  | 154 | 157 | 
 | 
  | 155 |  |   return min(1.0/(1.0 + 1.0/(sqrt(DOT*DOT+D*one_over_ps_sq)-DOT)),E);
 | 
  |  | 158 |   return min(degree_region,degree_object);
 | 
  | 156 | 159 |   }
 | 
  | 157 | 160 | 
 | 
  | 158 | 161 | #endif  // NUM_VERTEX>0
 | 
 
Correct Distort.