Switch to non-branching approach for GetMajorAxes
This commit is contained in:
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bb92af38d2a022242b4dddcb954f789e
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,54 @@
|
||||
#define EPSILON 0.0004f
|
||||
|
||||
float CrossProduct(float2 A, float2 B)
|
||||
{
|
||||
return A.x * B.y - A.y * B.x;
|
||||
}
|
||||
|
||||
float SweepArea(float2 A, float2 B)
|
||||
{
|
||||
return abs(CrossProduct(A, B));
|
||||
}
|
||||
|
||||
float4x4 GetMajorAxes(float4x4 Axes, float4x4 AxesProjections)
|
||||
{
|
||||
float4x4 result = (float4x4)0;
|
||||
|
||||
float2 x_proj = AxesProjections[0].xy;
|
||||
float2 y_proj = AxesProjections[1].xy;
|
||||
float2 z_proj = AxesProjections[2].xy;
|
||||
|
||||
float3 x_axes = Axes[0].xyz;
|
||||
float3 y_axes = Axes[1].xyz;
|
||||
float3 z_axes = Axes[2].xyz;
|
||||
|
||||
float xy_area = SweepArea(x_proj, y_proj);
|
||||
float xz_area = SweepArea(x_proj, z_proj);
|
||||
float yz_area = SweepArea(y_proj, z_proj);
|
||||
|
||||
// Compute selection weights using step
|
||||
float xy_is_max = step(xz_area, xy_area) * step(yz_area, xy_area);
|
||||
float xz_is_max = step(yz_area, xz_area) * (1.0 - xy_is_max);
|
||||
float yz_is_max = 1.0 - xy_is_max - xz_is_max;
|
||||
|
||||
// Select axis0
|
||||
float3 axis0 =
|
||||
xy_is_max * x_axes +
|
||||
xz_is_max * x_axes +
|
||||
yz_is_max * y_axes;
|
||||
|
||||
// Select axis1
|
||||
float3 axis1 =
|
||||
xy_is_max * y_axes +
|
||||
xz_is_max * z_axes +
|
||||
yz_is_max * z_axes;
|
||||
|
||||
// Normalize and scale if length is below threshold
|
||||
float len0 = length(axis0);
|
||||
float len1 = length(axis1);
|
||||
|
||||
result[0].xyz = normalize(axis0) * max(len0, EPSILON);
|
||||
result[1].xyz = normalize(axis1) * max(len1, EPSILON);
|
||||
|
||||
return result;
|
||||
}
|
||||
@@ -1,58 +0,0 @@
|
||||
#define EPSILON 0.0004f
|
||||
|
||||
/// Hidden
|
||||
float CrossProduct(float2 A, float2 B)
|
||||
{
|
||||
return A.x * B.y - A.y * B.x;
|
||||
}
|
||||
|
||||
/// Hidden
|
||||
float SweepArea(float2 A, float2 B)
|
||||
{
|
||||
return abs(CrossProduct(A, B));
|
||||
}
|
||||
|
||||
float4x4 GetMajorAxes(float4x4 Axes, float4x4 AxesProjections)
|
||||
{
|
||||
float4x4 result = (float4x4)0;
|
||||
|
||||
float2 x_proj = AxesProjections[0].xy;
|
||||
float2 y_proj = AxesProjections[1].xy;
|
||||
float2 z_proj = AxesProjections[2].xy;
|
||||
|
||||
float3 x_axes = Axes[0].xyz;
|
||||
float3 y_axes = Axes[1].xyz;
|
||||
float3 z_axes = Axes[2].xyz;
|
||||
|
||||
float xy_area = SweepArea(x_proj, y_proj);
|
||||
float xz_area = SweepArea(x_proj, z_proj);
|
||||
float yz_area = SweepArea(y_proj, z_proj);
|
||||
|
||||
if (xy_area > xz_area && xy_area > yz_area)
|
||||
{
|
||||
result[0].xyz = x_axes;
|
||||
result[1].xyz = y_axes;
|
||||
}
|
||||
else if (xz_area > yz_area)
|
||||
{
|
||||
result[0].xyz = x_axes;
|
||||
result[1].xyz = z_axes;
|
||||
}
|
||||
else
|
||||
{
|
||||
result[0].xyz = y_axes;
|
||||
result[1].xyz = z_axes;
|
||||
}
|
||||
|
||||
if (length(result[0].xyz) < 0.0004)
|
||||
{
|
||||
result[0].xyz = normalize(result[0].xyz) * EPSILON;
|
||||
}
|
||||
|
||||
if (length(result[1].xyz) < 0.0004)
|
||||
{
|
||||
result[1].xyz = normalize(result[1].xyz) * EPSILON;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
Reference in New Issue
Block a user