Skip to content

Commit 8d744a9

Browse files
committed
precompute cos_sides, csc_sides in shape spherical_tri
1 parent 3134254 commit 8d744a9

File tree

1 file changed

+13
-13
lines changed

1 file changed

+13
-13
lines changed

include/nbl/builtin/hlsl/shapes/spherical_triangle.hlsl

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,24 +31,22 @@ struct SphericalTriangle
3131
retval.vertex0 = nbl::hlsl::normalize(vertex0 - origin);
3232
retval.vertex1 = nbl::hlsl::normalize(vertex1 - origin);
3333
retval.vertex2 = nbl::hlsl::normalize(vertex2 - origin);
34+
retval.cos_sides = vector3_type(hlsl::dot(vertex1, vertex2), hlsl::dot(vertex2, vertex0), hlsl::dot(vertex0, vertex1));
35+
const vector3_type csc_sides2 = hlsl::promote<vector3_type>(1.0) - retval.cos_sides * retval.cos_sides;
36+
retval.csc_sides.x = hlsl::rsqrt<scalar_type>(csc_sides2.x);
37+
retval.csc_sides.y = hlsl::rsqrt<scalar_type>(csc_sides2.y);
38+
retval.csc_sides.z = hlsl::rsqrt<scalar_type>(csc_sides2.z);
3439
return retval;
3540
}
3641

37-
bool pyramidAngles(NBL_REF_ARG(vector3_type) cos_sides, NBL_REF_ARG(vector3_type) csc_sides)
42+
bool pyramidAngles()
3843
{
39-
cos_sides = vector3_type(hlsl::dot(vertex1, vertex2), hlsl::dot(vertex2, vertex0), hlsl::dot(vertex0, vertex1));
40-
csc_sides = (vector3_type)(1.f) - cos_sides * cos_sides;
41-
csc_sides.x = hlsl::rsqrt<scalar_type>(csc_sides.x);
42-
csc_sides.y = hlsl::rsqrt<scalar_type>(csc_sides.y);
43-
csc_sides.z = hlsl::rsqrt<scalar_type>(csc_sides.z);
44-
4544
return hlsl::any<vector<bool, 3> >(csc_sides >= (vector3_type)(numeric_limits<scalar_type>::max));
4645
}
4746

4847
scalar_type solidAngleOfTriangle(NBL_REF_ARG(vector3_type) cos_vertices, NBL_REF_ARG(vector3_type) sin_vertices, NBL_REF_ARG(scalar_type) cos_a, NBL_REF_ARG(scalar_type) cos_c, NBL_REF_ARG(scalar_type) csc_b, NBL_REF_ARG(scalar_type) csc_c)
4948
{
50-
vector3_type cos_sides,csc_sides;
51-
if (pyramidAngles(cos_sides, csc_sides))
49+
if (pyramidAngles())
5250
return 0.f;
5351

5452
// these variables might eventually get optimized out
@@ -58,8 +56,8 @@ struct SphericalTriangle
5856
csc_c = csc_sides[2];
5957

6058
// Both vertices and angles at the vertices are denoted by the same upper case letters A, B, and C. The angles A, B, C of the triangle are equal to the angles between the planes that intersect the surface of the sphere or, equivalently, the angles between the tangent vectors of the great circle arcs where they meet at the vertices. Angles are in radians. The angles of proper spherical triangles are (by convention) less than PI
61-
cos_vertices = hlsl::clamp((cos_sides - cos_sides.yzx * cos_sides.zxy) * csc_sides.yzx * csc_sides.zxy, (vector3_type)(-1.f), (vector3_type)1.f); // using Spherical Law of Cosines (TODO: do we need to clamp anymore? since the pyramid angles method introduction?)
62-
sin_vertices = hlsl::sqrt((vector3_type)1.f - cos_vertices * cos_vertices);
59+
cos_vertices = hlsl::clamp((cos_sides - cos_sides.yzx * cos_sides.zxy) * csc_sides.yzx * csc_sides.zxy, hlsl::promote<vector3_type>(-1.0), hlsl::promote<vector3_type>(1.0)); // using Spherical Law of Cosines (TODO: do we need to clamp anymore? since the pyramid angles method introduction?)
60+
sin_vertices = hlsl::sqrt(hlsl::promote<vector3_type>(1.0) - cos_vertices * cos_vertices);
6361

6462
math::sincos_accumulator<scalar_type> angle_adder = math::sincos_accumulator<scalar_type>::create(cos_vertices[0], sin_vertices[0]);
6563
angle_adder.addAngle(cos_vertices[1], sin_vertices[1]);
@@ -76,7 +74,7 @@ struct SphericalTriangle
7674

7775
scalar_type projectedSolidAngleOfTriangle(NBL_CONST_REF_ARG(vector3_type) receiverNormal, NBL_REF_ARG(vector3_type) cos_sides, NBL_REF_ARG(vector3_type) csc_sides, NBL_REF_ARG(vector3_type) cos_vertices)
7876
{
79-
if (pyramidAngles(cos_sides, csc_sides))
77+
if (pyramidAngles())
8078
return 0.f;
8179

8280
vector3_type awayFromEdgePlane0 = hlsl::cross<vector3_type>(vertex1, vertex2) * csc_sides[0];
@@ -88,7 +86,7 @@ struct SphericalTriangle
8886
cos_vertices[1] = hlsl::dot<vector3_type>(awayFromEdgePlane2, awayFromEdgePlane0);
8987
cos_vertices[2] = hlsl::dot<vector3_type>(awayFromEdgePlane0, awayFromEdgePlane1);
9088
// TODO: above dot products are in the wrong order, either work out which is which, or try all 6 permutations till it works
91-
cos_vertices = hlsl::clamp<vector3_type>((cos_sides - cos_sides.yzx * cos_sides.zxy) * csc_sides.yzx * csc_sides.zxy, (vector3_type)(-1.f), (vector3_type)1.f);
89+
cos_vertices = hlsl::clamp<vector3_type>((cos_sides - cos_sides.yzx * cos_sides.zxy) * csc_sides.yzx * csc_sides.zxy, hlsl::promote<vector3_type>(-1.0), hlsl::promote<vector3_type>(1.0));
9290

9391
matrix<scalar_type, 3, 3> awayFromEdgePlane = matrix<scalar_type, 3, 3>(awayFromEdgePlane0, awayFromEdgePlane1, awayFromEdgePlane2);
9492
const vector3_type externalProducts = hlsl::abs(hlsl::mul(/* transposed already */awayFromEdgePlane, receiverNormal));
@@ -100,6 +98,8 @@ struct SphericalTriangle
10098
vector3_type vertex0;
10199
vector3_type vertex1;
102100
vector3_type vertex2;
101+
vector3_type cos_sides;
102+
vector3_type csc_sides;
103103
};
104104

105105
namespace util

0 commit comments

Comments
 (0)