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