43 lines
		
	
	
		
			905 B
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			43 lines
		
	
	
		
			905 B
		
	
	
	
		
			Plaintext
		
	
	
	
struct Line3
 | 
						|
{
 | 
						|
  vec3 start;
 | 
						|
  vec3 end;
 | 
						|
};
 | 
						|
 | 
						|
vec3 Line3_getAt( inout Line3 line, float t )
 | 
						|
{
 | 
						|
  return line.start + ( line.end - line.start ) * t;
 | 
						|
} 
 | 
						|
 | 
						|
float Line3_closestParameterToPoint( inout Line3 line, vec3 point )
 | 
						|
{
 | 
						|
  vec3 startP = point - line.start;
 | 
						|
  vec3 startEnd = line.end - line.start;
 | 
						|
 | 
						|
  float startEnd2 = dot( startEnd, startEnd );
 | 
						|
  float startEnd_startP = dot( startEnd, startP );
 | 
						|
 | 
						|
  if ( startEnd2 == 0.0 )
 | 
						|
  {
 | 
						|
    return 0.5;
 | 
						|
  }
 | 
						|
 | 
						|
  float t = startEnd_startP / startEnd2;
 | 
						|
 | 
						|
  return t;        
 | 
						|
}
 | 
						|
 | 
						|
vec3 Line3_closestPointToPoint( inout Line3 line, vec3 point )
 | 
						|
{
 | 
						|
  float parameter = Line3_closestParameterToPoint( line, point );
 | 
						|
  return Line3_getAt( line, parameter );
 | 
						|
}
 | 
						|
 | 
						|
float Line3_getDistance( inout Line3 line, vec3 point )
 | 
						|
{
 | 
						|
  float parameter = clamp( Line3_closestParameterToPoint( line, point ), 0, 1 );
 | 
						|
  
 | 
						|
  vec3 p = Line3_getAt( line, parameter );
 | 
						|
 | 
						|
  return length( point - p );
 | 
						|
} |