forked from cgvr/DeltaVR
		
	
		
			
				
	
	
		
			45 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			HLSL
		
	
	
	
	
	
			
		
		
	
	
			45 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			HLSL
		
	
	
	
	
	
float3 orientCubePointToSegmentWithWidth(float3 localPt, float3 p0, float3 p1, float width0, float width1)
 | 
						|
{
 | 
						|
    float3 localSpaceVert = localPt;
 | 
						|
 | 
						|
    float len = length(p1 - p0);
 | 
						|
    float3 up = float3(0.0f, 1.0f, 0.0f);
 | 
						|
    float3 forward = normalize(p1 - p0);
 | 
						|
 | 
						|
    if(len < 0.0001f) // near zero length line segment
 | 
						|
    {
 | 
						|
        forward = float3(1.0f, 0.0f, 0.0f);
 | 
						|
    }
 | 
						|
 | 
						|
    if(abs(forward.y) > 0.99999f) // vertical line segment
 | 
						|
    {
 | 
						|
        up = float3(1.0f, 0.0f, 0.0f);
 | 
						|
    }
 | 
						|
 | 
						|
    // Build lookAt matrix
 | 
						|
    float3 zaxis = forward;
 | 
						|
    float3 xaxis = normalize(cross(up, zaxis));
 | 
						|
    float3 yaxis = cross(zaxis, xaxis);
 | 
						|
    float4x4 lookAtMatrix = {
 | 
						|
        xaxis.x, yaxis.x, zaxis.x, p0.x,
 | 
						|
        xaxis.y, yaxis.y, zaxis.y, p0.y,
 | 
						|
        xaxis.z, yaxis.z, zaxis.z, p0.z,
 | 
						|
        0,       0,       0,       1
 | 
						|
    };
 | 
						|
 | 
						|
    // Apply widths
 | 
						|
    if(localSpaceVert.z > 0.0f)
 | 
						|
    {
 | 
						|
        localSpaceVert.xy *= width0;
 | 
						|
        localSpaceVert.z = len + width0/2.0f;
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
        localSpaceVert.xy *= width1;
 | 
						|
        localSpaceVert.z = -1.0f * width1/2.0f;
 | 
						|
    }
 | 
						|
 | 
						|
    // Apply lookAt matrix
 | 
						|
    return mul(lookAtMatrix, float4(localSpaceVert, 1.0)).xyz;
 | 
						|
}
 |