DeltaVR/Assets/Oculus/Interaction/Runtime/Shaders/CubePointToSegment.cginc
2023-05-08 15:56:10 +03:00

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