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 );
							 | 
						||
| 
								 | 
							
								}
							 |