Skip to content

Commit 73b0f6d

Browse files
committed
split out angle adding stuff into new file
1 parent 9760d71 commit 73b0f6d

File tree

4 files changed

+129
-100
lines changed

4 files changed

+129
-100
lines changed

examples_tests

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
// Copyright (C) 2018-2023 - DevSH Graphics Programming Sp. z O.O.
2+
// This file is part of the "Nabla Engine".
3+
// For conditions of distribution and use, see copyright notice in nabla.h
4+
#ifndef _NBL_BUILTIN_HLSL_MATH_ANGLE_ADDING_INCLUDED_
5+
#define _NBL_BUILTIN_HLSL_MATH_ANGLE_ADDING_INCLUDED_
6+
7+
#include "nbl/builtin/hlsl/cpp_compat.hlsl"
8+
#include "nbl/builtin/hlsl/numbers.hlsl"
9+
#include "nbl/builtin/hlsl/vector_utils/vector_traits.hlsl"
10+
#include "nbl/builtin/hlsl/concepts/vector.hlsl"
11+
#include "nbl/builtin/hlsl/spirv_intrinsics/core.hlsl"
12+
#include "nbl/builtin/hlsl/ieee754.hlsl"
13+
14+
namespace nbl
15+
{
16+
namespace hlsl
17+
{
18+
namespace math
19+
{
20+
21+
namespace impl
22+
{
23+
struct sincos_accumulator
24+
{
25+
using this_t = sincos_accumulator;
26+
27+
static this_t create()
28+
{
29+
this_t retval;
30+
retval.tmp0 = 0;
31+
retval.tmp1 = 0;
32+
retval.tmp2 = 0;
33+
retval.tmp3 = 0;
34+
retval.tmp4 = 0;
35+
retval.tmp5 = 0;
36+
return retval;
37+
}
38+
39+
static this_t create(float cosA, float cosB, float cosC, float sinA, float sinB, float sinC)
40+
{
41+
this_t retval;
42+
retval.tmp0 = cosA;
43+
retval.tmp1 = cosB;
44+
retval.tmp2 = cosC;
45+
retval.tmp3 = sinA;
46+
retval.tmp4 = sinB;
47+
retval.tmp5 = sinC;
48+
return retval;
49+
}
50+
51+
float getArccosSumofABC_minus_PI()
52+
{
53+
const bool AltminusB = tmp0 < (-tmp1);
54+
const float cosSumAB = tmp0 * tmp1 - tmp3 * tmp4;
55+
const bool ABltminusC = cosSumAB < (-tmp2);
56+
const bool ABltC = cosSumAB < tmp2;
57+
// apply triple angle formula
58+
const float absArccosSumABC = acos<float>(clamp<float>(cosSumAB * tmp2 - (tmp0 * tmp4 + tmp3 * tmp1) * tmp5, -1.f, 1.f));
59+
return ((AltminusB ? ABltC : ABltminusC) ? (-absArccosSumABC) : absArccosSumABC) + ((AltminusB || ABltminusC) ? numbers::pi<float> : (-numbers::pi<float>));
60+
}
61+
62+
static void combineCosForSumOfAcos(float cosA, float cosB, float biasA, float biasB, NBL_REF_ARG(float) out0, NBL_REF_ARG(float) out1)
63+
{
64+
const float bias = biasA + biasB;
65+
const float a = cosA;
66+
const float b = cosB;
67+
const bool reverse = abs<float>(min<float>(a, b)) > max<float>(a, b);
68+
const float c = a * b - sqrt<float>((1.0f - a * a) * (1.0f - b * b));
69+
70+
if (reverse)
71+
{
72+
out0 = -c;
73+
out1 = bias + numbers::pi<float>;
74+
}
75+
else
76+
{
77+
out0 = c;
78+
out1 = bias;
79+
}
80+
}
81+
82+
float tmp0;
83+
float tmp1;
84+
float tmp2;
85+
float tmp3;
86+
float tmp4;
87+
float tmp5;
88+
};
89+
}
90+
91+
float getArccosSumofABC_minus_PI(float cosA, float cosB, float cosC, float sinA, float sinB, float sinC)
92+
{
93+
impl::sincos_accumulator acc = impl::sincos_accumulator::create(cosA, cosB, cosC, sinA, sinB, sinC);
94+
return acc.getArccosSumofABC_minus_PI();
95+
}
96+
97+
void combineCosForSumOfAcos(float cosA, float cosB, float biasA, float biasB, NBL_REF_ARG(float) out0, NBL_REF_ARG(float) out1)
98+
{
99+
impl::sincos_accumulator acc = impl::sincos_accumulator::create();
100+
impl::sincos_accumulator::combineCosForSumOfAcos(cosA, cosB, biasA, biasB, acc.tmp0, acc.tmp1);
101+
out0 = acc.tmp0;
102+
out1 = acc.tmp1;
103+
}
104+
105+
// returns acos(a) + acos(b)
106+
float getSumofArccosAB(float cosA, float cosB)
107+
{
108+
impl::sincos_accumulator acc = impl::sincos_accumulator::create();
109+
impl::sincos_accumulator::combineCosForSumOfAcos(cosA, cosB, 0.0f, 0.0f, acc.tmp0, acc.tmp1);
110+
return acos<float>(acc.tmp0) + acc.tmp1;
111+
}
112+
113+
// returns acos(a) + acos(b) + acos(c) + acos(d)
114+
float getSumofArccosABCD(float cosA, float cosB, float cosC, float cosD)
115+
{
116+
impl::sincos_accumulator acc = impl::sincos_accumulator::create();
117+
impl::sincos_accumulator::combineCosForSumOfAcos(cosA, cosB, 0.0f, 0.0f, acc.tmp0, acc.tmp1);
118+
impl::sincos_accumulator::combineCosForSumOfAcos(cosC, cosD, 0.0f, 0.0f, acc.tmp2, acc.tmp3);
119+
impl::sincos_accumulator::combineCosForSumOfAcos(acc.tmp0, acc.tmp2, acc.tmp1, acc.tmp3, acc.tmp4, acc.tmp5);
120+
return acos<float>(acc.tmp4) + acc.tmp5;
121+
}
122+
123+
}
124+
}
125+
}
126+
127+
#endif

include/nbl/builtin/hlsl/math/functions.hlsl

Lines changed: 0 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -177,73 +177,6 @@ struct conditionalAbsOrMax_helper<T NBL_PARTIAL_REQ_BOT(concepts::FloatingPointL
177177
return max<T>(condAbs, limit);
178178
}
179179
};
180-
181-
struct trigonometry
182-
{
183-
using this_t = trigonometry;
184-
185-
static this_t create()
186-
{
187-
this_t retval;
188-
retval.tmp0 = 0;
189-
retval.tmp1 = 0;
190-
retval.tmp2 = 0;
191-
retval.tmp3 = 0;
192-
retval.tmp4 = 0;
193-
retval.tmp5 = 0;
194-
return retval;
195-
}
196-
197-
static this_t create(float cosA, float cosB, float cosC, float sinA, float sinB, float sinC)
198-
{
199-
this_t retval;
200-
retval.tmp0 = cosA;
201-
retval.tmp1 = cosB;
202-
retval.tmp2 = cosC;
203-
retval.tmp3 = sinA;
204-
retval.tmp4 = sinB;
205-
retval.tmp5 = sinC;
206-
return retval;
207-
}
208-
209-
float getArccosSumofABC_minus_PI()
210-
{
211-
const bool AltminusB = tmp0 < (-tmp1);
212-
const float cosSumAB = tmp0 * tmp1 - tmp3 * tmp4;
213-
const bool ABltminusC = cosSumAB < (-tmp2);
214-
const bool ABltC = cosSumAB < tmp2;
215-
// apply triple angle formula
216-
const float absArccosSumABC = acos<float>(clamp<float>(cosSumAB * tmp2 - (tmp0 * tmp4 + tmp3 * tmp1) * tmp5, -1.f, 1.f));
217-
return ((AltminusB ? ABltC : ABltminusC) ? (-absArccosSumABC) : absArccosSumABC) + ((AltminusB || ABltminusC) ? numbers::pi<float> : (-numbers::pi<float>));
218-
}
219-
220-
static void combineCosForSumOfAcos(float cosA, float cosB, float biasA, float biasB, NBL_REF_ARG(float) out0, NBL_REF_ARG(float) out1)
221-
{
222-
const float bias = biasA + biasB;
223-
const float a = cosA;
224-
const float b = cosB;
225-
const bool reverse = abs<float>(min<float>(a, b)) > max<float>(a, b);
226-
const float c = a * b - sqrt<float>((1.0f - a * a) * (1.0f - b * b));
227-
228-
if (reverse)
229-
{
230-
out0 = -c;
231-
out1 = bias + numbers::pi<float>;
232-
}
233-
else
234-
{
235-
out0 = c;
236-
out1 = bias;
237-
}
238-
}
239-
240-
float tmp0;
241-
float tmp1;
242-
float tmp2;
243-
float tmp3;
244-
float tmp4;
245-
float tmp5;
246-
};
247180
}
248181

249182
// @ return abs(x) if cond==true, max(x,0.0) otherwise
@@ -253,38 +186,6 @@ T conditionalAbsOrMax(bool cond, T x, T limit)
253186
return impl::conditionalAbsOrMax_helper<T>::__call(cond, x, limit);
254187
}
255188

256-
float getArccosSumofABC_minus_PI(float cosA, float cosB, float cosC, float sinA, float sinB, float sinC)
257-
{
258-
impl::trigonometry trig = impl::trigonometry::create(cosA, cosB, cosC, sinA, sinB, sinC);
259-
return trig.getArccosSumofABC_minus_PI();
260-
}
261-
262-
void combineCosForSumOfAcos(float cosA, float cosB, float biasA, float biasB, NBL_REF_ARG(float) out0, NBL_REF_ARG(float) out1)
263-
{
264-
impl::trigonometry trig = impl::trigonometry::create();
265-
impl::trigonometry::combineCosForSumOfAcos(cosA, cosB, biasA, biasB, trig.tmp0, trig.tmp1);
266-
out0 = trig.tmp0;
267-
out1 = trig.tmp1;
268-
}
269-
270-
// returns acos(a) + acos(b)
271-
float getSumofArccosAB(float cosA, float cosB)
272-
{
273-
impl::trigonometry trig = impl::trigonometry::create();
274-
impl::trigonometry::combineCosForSumOfAcos(cosA, cosB, 0.0f, 0.0f, trig.tmp0, trig.tmp1);
275-
return acos<float>(trig.tmp0) + trig.tmp1;
276-
}
277-
278-
// returns acos(a) + acos(b) + acos(c) + acos(d)
279-
float getSumofArccosABCD(float cosA, float cosB, float cosC, float cosD)
280-
{
281-
impl::trigonometry trig = impl::trigonometry::create();
282-
impl::trigonometry::combineCosForSumOfAcos(cosA, cosB, 0.0f, 0.0f, trig.tmp0, trig.tmp1);
283-
impl::trigonometry::combineCosForSumOfAcos(cosC, cosD, 0.0f, 0.0f, trig.tmp2, trig.tmp3);
284-
impl::trigonometry::combineCosForSumOfAcos(trig.tmp0, trig.tmp2, trig.tmp1, trig.tmp3, trig.tmp4, trig.tmp5);
285-
return acos<float>(trig.tmp4) + trig.tmp5;
286-
}
287-
288189
template<typename Lhs, typename Rhs NBL_FUNC_REQUIRES(concepts::Matricial<Lhs> && concepts::Matricial<Rhs> && (matrix_traits<Lhs>::ColumnCount == matrix_traits<Rhs>::RowCount))
289190
typename cpp_compat_intrinsics_impl::mul_helper<Lhs, Rhs>::return_t applyChainRule(Lhs dFdG, Rhs dGdR)
290191
{

src/nbl/builtin/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,7 @@ LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/math/linalg/fast_affine.hlsl"
294294
LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/math/functions.hlsl")
295295
LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/math/geometry.hlsl")
296296
LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/math/intutil.hlsl")
297+
LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/math/angle_adding.hlsl")
297298
LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/math/equations/quadratic.hlsl")
298299
LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/math/equations/cubic.hlsl")
299300
LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED "hlsl/math/equations/quartic.hlsl")

0 commit comments

Comments
 (0)