10#ifndef MI_MATH_FUNCTION_H
11#define MI_MATH_FUNCTION_H
16#ifdef MI_PLATFORM_WINDOWS
18#pragma intrinsic(_BitScanReverse)
20#pragma intrinsic(_BitScanReverse64)
78 template <
typename T1,
typename T2>
79 inline bool operator()(
const T1& t1,
const T2& t2)
const {
return t1 == t2; }
85 template <
typename T1,
typename T2>
86 inline bool operator()(
const T1& t1,
const T2& t2)
const {
return t1 != t2; }
92 template <
typename T1,
typename T2>
93 inline bool operator()(
const T1& t1,
const T2& t2)
const {
return t1 < t2; }
99 template <
typename T1,
typename T2>
100 inline bool operator()(
const T1& t1,
const T2& t2)
const {
return t1 <= t2; }
106 template <
typename T1,
typename T2>
107 inline bool operator()(
const T1& t1,
const T2& t2)
const {
return t1 > t2; }
113 template <
typename T1,
typename T2>
114 inline bool operator()(
const T1& t1,
const T2& t2)
const {
return t1 >= t2; }
120 template <
typename T>
121 inline T
operator()(
const T& t1,
const T& t2)
const {
return t1 + t2; }
127 template <
typename T>
130 template <
typename T>
131 inline T
operator()(
const T& t1,
const T& t2)
const {
return t1 - t2; }
137 template <
typename T>
138 inline T
operator()(
const T& t1,
const T& t2)
const {
return t1 * t2; }
144 template <
typename T>
145 inline T
operator()(
const T& t1,
const T& t2)
const {
return t1 / t2; }
151 template <
typename T>
152 inline bool operator()(
const T& t1,
const T& t2)
const {
return t1 && t2; }
158 template <
typename T>
159 inline bool operator()(
const T& t1,
const T& t2)
const {
return t1 || t2; }
165 template <
typename T>
166 inline bool operator()(
const T& t1,
const T& t2)
const {
return t1 ^ t2; }
172 template <
typename T>
179 template <
typename T>
186 template <
typename T>
193 template <
typename T>
200 template <
typename T>
233template <
class Vector,
class ResultVector,
class UnaryFunctor>
238 result.set( i, f( vec.
get(i)));
249template <
class Vector1,
class Vector2,
class ResultVector,
class BinaryFunctor>
251 const Vector1& vec1,
const Vector2& vec2, ResultVector& result, BinaryFunctor f)
255 for(
Size i = 0; i != Vector1::SIZE; ++i)
256 result.set( i, f( vec1.get(i), vec2.get(i)));
268template <
class Scalar,
class Vector,
class ResultVector,
class BinaryFunctor>
270 const Scalar& s,
const Vector& vec, ResultVector& result, BinaryFunctor f)
274 result.set( i, f( s, vec.
get(i)));
286template <
class Scalar,
class Vector,
class ResultVector,
class BinaryFunctor>
288 const Vector& vec,
const Scalar& s, ResultVector& result, BinaryFunctor f)
292 result.set( i, f( vec.
get(i), s));
301template <
class Vector,
class UnaryFunctor>
315template <
class Vector1,
class Vector2,
class BinaryFunctor>
316inline void for_each( Vector1& vec1,
const Vector2& vec2, BinaryFunctor f)
319 for(
Size i = 0; i != Vector1::SIZE; ++i)
320 f( vec1.begin()[i], vec2.begin()[i]);
359 int tmp = base::binary_cast<int>( i);
365 return base::binary_cast<Float32>( tmp);
371 const Float32 EXP_C = 8388608.0f;
372 const Float32 LOG_2_E = 1.4426950408889634073599246810019f;
376 y = (y - y*y) * 0.33971f;
378 return base::binary_cast<Float32>(
static_cast<int>( z));
384 const Float32 EXP_C = 8388608.0f;
387 y = (y - y*y) * 0.33971f;
389 return base::binary_cast<Float32>(
static_cast<int>( z));
395 const Float32 LOG_C = 0.00000011920928955078125f;
397 const Float32 x =
static_cast<Float32>( base::binary_cast<int>( i)) *
LOG_C - 127.f;
399 return x + (y - y*y) * 0.346607f;
410 const Float32 LOG_C = 0.00000011920928955078125f;
411 const Float32 EXP_C = 8388608.0f;
413 const Float32 x =
static_cast<Float32>( base::binary_cast<int>( b)) *
LOG_C - 127.f;
415 const Float32 fl = e * (x + (y - y*y) * 0.346607f);
418 fl
*EXP_C +
static_cast<Float32>( 127.0
*EXP_C)
419 - (y2 - y2*y2) *
static_cast<Float32>( 0.33971
*EXP_C), 0.f);
421 return base::binary_cast<Float32>(
static_cast<int>( z));
502 return min(high, max(low, s));
508 return min(high, max(low, s));
514 return min(high, max(low, s));
520 return min(high, max(low, s));
526 return min(high, max(low, s));
532 return min(high, max(low, s));
538 return min(high, max(low, s));
544 return min(high, max(low, s));
550 return min(high, max(low, s));
556 return min(high, max(low, s));
574 return std::exp(s * 0.69314718055994530941723212145818 );
609 return abs( left - right ) <= e;
618 return abs( left - right ) <= e;
625#if defined(MI_COMPILER_MSC)
627 const unsigned char valid = _BitScanReverse(&index, v);
628 return (valid != 0) ? 31 - index : 32;
629#elif defined(MI_COMPILER_ICC) || defined(MI_COMPILER_GCC)
630 return (v != 0) ? __builtin_clz(v) : 32;
633 if (v == 0)
return 32;
635 if ((v >> 16) == 0) { n += 16; v <<= 16; };
636 if ((v >> 24) == 0) { n += 8; v <<= 8; };
637 if ((v >> 28) == 0) { n += 4; v <<= 4; };
638 if ((v >> 30) == 0) { n += 2; v <<= 2; };
648#if defined(MI_COMPILER_MSC)
649#if defined(MI_ARCH_64BIT)
651 const unsigned char valid = _BitScanReverse64(&index, v);
652 return (valid != 0) ? 63 - index : 64;
654 unsigned long index_h, index_l;
655 const unsigned char valid_h = _BitScanReverse(&index_h,(
Uint32)(v >> 32));
656 const unsigned char valid_l = _BitScanReverse(&index_l,(
Uint32)(v & 0xFFFFFFFF));
658 return (valid_l != 0) ? 63 - index_l : 64;
659 return 63 - index_h + 32;
661#elif defined(MI_COMPILER_ICC) || defined(MI_COMPILER_GCC)
662 return (v != 0) ? __builtin_clzll(v) : 64;
665 if (v == 0)
return 64;
667 if ((v >> 32) == 0) { n += 32; v <<= 32; };
668 if ((v >> 48) == 0) { n += 16; v <<= 16; };
669 if ((v >> 56) == 0) { n += 8; v <<= 8; };
670 if ((v >> 60) == 0) { n += 4; v <<= 4; };
671 if ((v >> 62) == 0) { n += 2; v <<= 2; };
684 return s1 * (
Float32(1)-t) + s2 * t;
694 return s1 * (
Float64(1)-t) + s2 * t;
699{
return std::log(s) * 1.4426950408889634073599246810019f ; }
702{
return std::log(s) * 1.4426950408889634073599246810019 ; }
712 return (mi::base::binary_cast<Uint32>(v) >> 23) - 127;
717 return static_cast<Sint32>(mi::base::binary_cast<Uint64>(v) >> 52) - 1023;
721template<
typename Integer>
724 return (v > 1) ?
log2_int(v - 1) + 1 : 0;
776{
int r = (s < 0 ) ? -1 : (s > 0) ? 1 : 0;
return static_cast<Sint8>( r); }
779{
int r = (s < 0 ) ? -1 : (s > 0) ? 1 : 0;
return static_cast<Sint16>( r); }
804 return (base::binary_cast<Uint32>(s) & (1U << 31)) != 0U;
813 return (base::binary_cast<Uint64>(s) & (1ULL << 63)) != 0ULL;
816#if (__cplusplus < 201103L)
823 const Uint32 f = base::binary_cast<Uint32>(x);
826 return (f << 1) > 0xFF000000U;
835 const Uint64 f = base::binary_cast<Uint64>(x);
837 return (f << 1) > 0xFFE0000000000000ULL;
845inline float __uint_as_float(
const unsigned v)
846{
return base::binary_cast<float>(v);}
848inline unsigned __float_as_uint(
const float v)
849{
return base::binary_cast<unsigned>(v);}
858 const Uint32 exponent_mask = 0x7F800000;
859 const Uint32 fraction_mask = 0x7FFFFF;
862 const Uint32 f = base::binary_cast<Uint32>(x);
865 return ((f & exponent_mask) == exponent_mask) &&
866 ((f & fraction_mask) == 0);
874 const Uint64 exponent_mask = 0x7FF0000000000000ULL;
875 const Uint64 fraction_mask = 0xFFFFFFFFFFFFFULL;
878 const Uint64 f = base::binary_cast<Uint64>(x);
881 return ((f & exponent_mask) == exponent_mask) &&
882 ((f & fraction_mask) == 0);
886#if (__cplusplus < 201103L)
894 const Uint32 exponent_mask = 0x7F800000;
897 const Uint32 f = base::binary_cast<Uint32>(x);
900 return ((f & exponent_mask) != exponent_mask);
910 const Uint64 exponent_mask = 0x7FF0000000000000ULL;
913 const Uint64 f = base::binary_cast<Uint64>(x);
916 return ((f & exponent_mask) != exponent_mask);
956 return t * t * (3.0f - 2.0f * t);
969 return t * t * (3.0 - 2.0 * t);
992 c[0] = max( color[0], 0.0f);
993 c[1] = max( color[1], 0.0f);
994 c[2] = max( color[2], 0.0f);
996 const Float32 m = max( max( c[0], c[1]), c[2]);
999 if( m <= 7.5231631727e-37f)
1001 else if( m >= 1.7014118346046923173168730371588e+38f)
1004 const Uint32 e = __float_as_uint( m) & 0x7F800000u;
1005 const Float32 v = __uint_as_float( 0x82800000u - e);
1008 | (
Uint32( c[1] * v) << 8)
1009 | (
Uint32( c[2] * v) << 16)
1010 | (e * 2 + (2 << 24));
1018 c[0] = max( color[0], 0.0f);
1019 c[1] = max( color[1], 0.0f);
1020 c[2] = max( color[2], 0.0f);
1022 const Float32 m = max( max( c[0], c[1]), c[2]);
1025 if( m <= 7.5231631727e-37f)
1026 rgbe[0] = rgbe[1] = rgbe[2] = rgbe[3] = 0;
1027 else if( m >= 1.7014118346046923173168730371588e+38f)
1028 rgbe[0] = rgbe[1] = rgbe[2] = rgbe[3] = 255;
1030 const Uint32 e = __float_as_uint( m) & 0x7F800000u;
1031 const Float32 v = __uint_as_float( 0x82800000u - e);
1033 rgbe[0] =
Uint8( c[0] * v);
1034 rgbe[1] =
Uint8( c[1] * v);
1035 rgbe[2] =
Uint8( c[2] * v);
1036 rgbe[3] =
Uint8( (e >> 23) + 2);
1044 color[0] = color[1] = color[2] = 0.0f;
1048 const Uint32 e = (
static_cast<Uint32>( rgbe[3]) << 23) - 0x800000u;
1049 const Float32 v = __uint_as_float( e);
1052 color[0] = __uint_as_float( e | (
static_cast<Uint32>( rgbe[0]) << 15)) - c;
1053 color[1] = __uint_as_float( e | (
static_cast<Uint32>( rgbe[1]) << 15)) - c;
1054 color[2] = __uint_as_float( e | (
static_cast<Uint32>( rgbe[2]) << 15)) - c;
1060 const Uint32 rgbe3 = rgbe & 0xFF000000u;
1062 color[0] = color[1] = color[2] = 0.0f;
1066 const Uint32 e = (rgbe3 >> 1) - 0x800000u;
1067 const Float32 v = __uint_as_float( e);
1070 color[0] = __uint_as_float( e | ((rgbe << 15) & 0x7F8000u)) - c;
1071 color[1] = __uint_as_float( e | ((rgbe << 7) & 0x7F8000u)) - c;
1072 color[2] = __uint_as_float( e | ((rgbe >> 1) & 0x7F8000u)) - c;
1089inline typename V::value_type
dot(
const V& lhs,
const V& rhs)
1091 typename V::value_type v(0);
1092 for(
Size i(0u); i < V::SIZE; ++i)
1093 v += lhs.get(i) * rhs.get(i);
1116inline typename V::value_type
length(
const V& v)
1133 const V& lhs,
const V& rhs)
1135 return length( lhs - rhs);
1142 for(
Size i(0u); i < V::SIZE; ++i)
1152 for(
Size i(0u); i < V::SIZE; ++i)
1153 if( ! (lhs.get(i) == rhs.get(i)))
1163 for(
Size i(0u); i < V::SIZE; ++i)
1164 if( lhs.get(i) != rhs.get(i))
1176 for(
Size i(0u); i < V::SIZE-1; ++i) {
1177 if( lhs.get(i) < rhs.get(i))
1179 if( lhs.get(i) > rhs.get(i))
1182 return lhs.get(V::SIZE-1) < rhs.get(V::SIZE-1);
1192 for(
Size i(0u); i < V::SIZE-1; ++i) {
1193 if( lhs.get(i) < rhs.get(i))
1195 if( lhs.get(i) > rhs.get(i))
1198 return lhs.get(V::SIZE-1) <= rhs.get(V::SIZE-1);
1208 for(
Size i(0u); i < V::SIZE-1; ++i) {
1209 if( lhs.get(i) > rhs.get(i))
1211 if( lhs.get(i) < rhs.get(i))
1214 return lhs.get(V::SIZE-1) > rhs.get(V::SIZE-1);
1224 for(
Size i(0u); i < V::SIZE-1; ++i) {
1225 if( lhs.get(i) > rhs.get(i))
1227 if( lhs.get(i) < rhs.get(i))
1230 return lhs.get(V::SIZE-1) >= rhs.get(V::SIZE-1);
1245 for(
Size i(0u); i < V::SIZE; ++i) {
1247 if( result !=
EQUAL)
Assertions and compile-time assertions.
Fixed-size math vector class template with generic operations.
Definition: vector.h:286
#define mi_static_assert(expr)
Compile time assertion that raises a compilation error if the constant expression expr evaluates to f...
Definition: assert.h:58
#define MI_PREVENT_MACRO_EXPAND
Empty macro that can be used after function names to prevent macro expansion that happen to have the ...
Definition: config.h:97
long long Sint64
64-bit signed integer.
Definition: types.h:61
unsigned long long Uint64
64-bit unsigned integer.
Definition: types.h:62
signed short Sint16
16-bit signed integer.
Definition: types.h:45
unsigned int Uint32
32-bit unsigned integer.
Definition: types.h:49
unsigned char Uint8
8-bit unsigned integer.
Definition: types.h:47
Uint64 Size
Unsigned integral type that is large enough to hold the size of all types.
Definition: types.h:112
signed char Sint8
8-bit signed integer.
Definition: types.h:44
Comparison_result
An enum for a three-valued comparison result.
Definition: types.h:203
double Float64
64-bit float.
Definition: types.h:52
float Float32
32-bit float.
Definition: types.h:51
#define MI_PI
Value of Pi.
Definition: types.h:192
unsigned short Uint16
16-bit unsigned integer.
Definition: types.h:48
Comparison_result three_valued_compare(T lhs, T rhs)
Returns the three valued comparison result between two values of a numerical type T.
Definition: types.h:238
signed int Sint32
32-bit signed integer.
Definition: types.h:46
@ EQUAL
= 0. First value is equal to second value.
Definition: types.h:209
Float64 ceil(Float64 s)
Returns the smallest integral value that is not less than s.
Definition: function.h:496
bool lexicographically_less(const V &lhs, const V &rhs)
Returns true if vector lhs is lexicographically less than vector rhs, and false otherwise.
Definition: function.h:1174
Float32 fast_log2(Float32 i)
A fast implementation of log2(x) for floats.
Definition: function.h:393
Float64 log10(Float64 s)
Returns the base 10 logarithm of s.
Definition: function.h:730
Float64 tan(Float64 a)
Returns the tangent of a. The angle a is specified in radians.
Definition: function.h:985
Float64 modf(Float64 s, Float64 &i)
Returns the fractional part of s and stores the integral part of s in i.
Definition: function.h:739
bool lexicographically_less_or_equal(const V &lhs, const V &rhs)
Returns true if vector lhs is lexicographically less than or equal to vector rhs, and false otherwise...
Definition: function.h:1190
Float32 fast_pow(Float32 b, Float32 e)
A fast implementation of pow(x,y) for floats.
Definition: function.h:403
Float64 asin(Float64 s)
Returns the arc sine of s in radians.
Definition: function.h:477
V::value_type square_length(const V &v)
Returns the squared Euclidean norm of the vector v.
Definition: function.h:1099
V::value_type square_euclidean_distance(const V &lhs, const V &rhs)
Returns the squared Euclidean distance from the vector lhs to the vector rhs.
Definition: function.h:1123
Float64 acos(Float64 s)
Returns the arc cosine of s in radians.
Definition: function.h:430
Sint32 dot(Sint32 a, Sint32 b)
Returns the inner product (a.k.a. dot or scalar product) of two integers.
Definition: function.h:1081
Float64 sin(Float64 a)
Returns the sine of a. The angle a is specified in radians.
Definition: function.h:926
Sint32 log2_int(const Uint32 v)
Returns the integer log2 of v.
Definition: function.h:705
Sint32 log2_int_ceil(const Integer v)
Returns the integer log2 of v, i.e., rounded up to the next integer.
Definition: function.h:722
Uint32 leading_zeros(Uint32 v)
Returns the number of leading zeros of v, 32-bit version.
Definition: function.h:622
Float64 atan2(Float64 s, Float64 t)
Returns the arc tangent of s / t.
Definition: function.h:491
Float64 atan(Float64 s)
Returns the arc tangent of s.
Definition: function.h:482
V::value_type euclidean_distance(const V &lhs, const V &rhs)
Returns the Euclidean distance from the vector lhs to the vector rhs.
Definition: function.h:1132
bool lexicographically_greater_or_equal(const V &lhs, const V &rhs)
Returns true if vector lhs is lexicographically greater than or equal to vector rhs,...
Definition: function.h:1222
void set_bounds(V &v, const V &low, const V &high)
Bounds the value of vector v elementwise to the given low and high vector values.
Definition: function.h:1140
Float64 pow(Float64 a, Float64 b)
Returns a to the power of b.
Definition: function.h:752
bool is_not_equal(const V &lhs, const V &rhs)
Returns true if vector lhs is elementwise not equal to vector rhs, and false otherwise.
Definition: function.h:1161
Float32 length(Float32 a)
Returns the Euclidean norm of the scalar a (its absolute value).
Definition: function.h:1107
bool sign_bit(Sint8 s)
Returns true if s<0 and false if s>= 0.
Definition: function.h:790
bool lexicographically_greater(const V &lhs, const V &rhs)
Returns true if vector lhs is lexicographically greater than vector rhs, and false otherwise.
Definition: function.h:1206
Float64 fmod(Float64 a, Float64 b)
Returns a modulo b, in other words, the remainder of a/b.
Definition: function.h:589
Float32 fast_pow2(Float32 x)
A fast implementation of pow(2,x) for floats.
Definition: function.h:382
Float64 cos(Float64 a)
Returns the cosine of a. The angle a is specified in radians.
Definition: function.h:562
bool is_equal(const V &lhs, const V &rhs)
Returns true if vector lhs is elementwise equal to vector rhs, and false otherwise.
Definition: function.h:1150
Float32 fast_sqrt(Float32 i)
A fast implementation of sqrt(x) for floats.
Definition: function.h:357
Float32 fast_exp(Float32 x)
A fast implementation of exp for floats.
Definition: function.h:369
Comparison_result lexicographically_compare(const V &lhs, const V &rhs)
Compares two vectors lexicographically.
Definition: function.h:1243
Float64 floor(Float64 s)
Returns the largest integral value that is not greater than s.
Definition: function.h:580
Float64 sqrt(Float64 s)
Returns the square root of s.
Definition: function.h:975
Bbox<T, DIM> lerp(const Bbox<T, DIM> &bbox1, const Bbox<T, DIM> &bbox2, T t)
Returns the linear interpolation between bbox1 and bbox2, i.e., it returns (1-t) * bbox1 + t * bbox2.
Definition: bbox.h:672
Color frac(const Color &c)
Returns a color with the elementwise positive fractional part of the color c.
Definition: color.h:625
Color sqrt(const Color &c)
Returns the square root of each element of c.
Definition: color.h:804
bool isinfinite(const Color &c)
Indicates whether any component of the color is infinite.
Definition: color.h:831
Color acos(const Color &c)
Returns a color with the elementwise arc cosine of the color c.
Definition: color.h:477
Color ceil(const Color &c)
Returns a color with the elementwise smallest integral value that is not less than the element in col...
Definition: color.h:516
Color clamp(const Color &c, const Color &low, const Color &high)
Returns the color c elementwise clamped to the range [low, high].
Definition: color.h:522
Color abs(const Color &c)
Returns a color with the elementwise absolute values of the color c.
Definition: color.h:471
Color round(const Color &c)
Returns a color with the elements of color c rounded to nearest integers.
Definition: color.h:737
Color modf(const Color &c, Color &i)
Returns the elementwise fractional part of c and stores the elementwise integral part of c in i.
Definition: color.h:713
MI_HOST_DEVICE_INLINE void from_rgbe(const Uint8 rgbe[4], Color &color)
Decodes a color from RGBE representation.
Definition: color.h:867
Color atan(const Color &c)
Returns a color with the elementwise arc tangent of the color c.
Definition: color.h:501
bool isfinite(const Color &c)
Indicates whether all components of the color are finite.
Definition: color.h:822
Color step(const Color &a, const Color &c)
Returns elementwise 0 if c is less than a and 1 otherwise.
Definition: color.h:810
Color tan(const Color &c)
Returns a color with the elementwise tangent of the color c.
Definition: color.h:816
Color atan2(const Color &c, const Color &d)
Returns a color with the elementwise arc tangent of the color c / d.
Definition: color.h:509
Color sin(const Color &c)
Returns a color with the elementwise sine of the color c.
Definition: color.h:761
Color degrees(const Color &c)
Converts elementwise radians in c to degrees.
Definition: color.h:564
Color saturate(const Color &c)
Returns the color c clamped elementwise to the range [0,1].
Definition: color.h:749
Color rsqrt(const Color &c)
Returns the reciprocal of the square root of each element of c.
Definition: color.h:743
bool any(const Color &c)
Returns true if any element of c is not equal to zero.
Definition: color.h:489
Color radians(const Color &c)
Converts elementwise degrees in c to radians.
Definition: color.h:731
Color exp2(const Color &c)
Returns a color with elementwise 2 to the power of the element in the color c.
Definition: color.h:596
Color log(const Color &c)
Returns a color with elementwise natural logarithm of the color c.
Definition: color.h:689
Color floor(const Color &c)
Returns a color with the elementwise largest integral value that is not greater than the element in c...
Definition: color.h:603
Color smoothstep(const Color &a, const Color &b, const Color &c)
Returns 0 if c is less than a and 1 if c is greater than b in an elementwise fashion.
Definition: color.h:782
Color sign(const Color &c)
Returns the elementwise sign of color c.
Definition: color.h:755
Color fmod(const Color &a, const Color &b)
Returns elementwise a modulo b, in other words, the remainder of a/b.
Definition: color.h:611
Color cos(const Color &c)
Returns a color with the elementwise cosine of the color c.
Definition: color.h:558
MI_HOST_DEVICE_INLINE void to_rgbe(const Color &color, Uint32 &rgbe)
Encodes a color into RGBE representation.
Definition: color.h:851
Color pow(const Color &a, const Color &b)
Returns the color a elementwise to the power of b.
Definition: color.h:719
bool all(const Color &c)
Returns true if all elements of c are not equal to zero.
Definition: color.h:483
bool isnan(const Color &c)
Indicates whether any component of the color is "not a number".
Definition: color.h:840
Color log10(const Color &c)
Returns a color with elementwise base 10 logarithm of the color c.
Definition: color.h:704
Color log2(const Color &c)
Returns a color with elementwise base 2 logarithm of the color c.
Definition: color.h:695
Color exp(const Color &c)
Returns a color with elementwise e to the power of the element in the color c.
Definition: color.h:590
bool is_approx_equal(const Color &lhs, const Color &rhs, Float32 e)
Compares the two given values elementwise for equality within the given epsilon.
Definition: color.h:650
void sincos(const Color &a, Color &s, Color &c)
Computes elementwise the sine s and cosine c of angles a simultaneously.
Definition: color.h:769
Color asin(const Color &c)
Returns a color with the elementwise arc sine of the color c.
Definition: color.h:495
Float64 log(Float64 s)
Returns the natural logarithm of s.
Definition: function.h:335
Float64 exp(Float64 s)
Returns the constant e to the power of s (exponential function).
Definition: function.h:330
bool operator()(const T1 &t1, const T2 &t2) const
Functor call.
Definition: function.h:100
bool operator()(const T1 &t1, const T2 &t2) const
Functor call.
Definition: function.h:114
bool operator()(const T1 &t1, const T2 &t2) const
Functor call.
Definition: function.h:86
bool operator()(const T1 &t1, const T2 &t2) const
Functor call.
Definition: function.h:93
T operator()(const T &t1, const T &t2) const
Functor call.
Definition: function.h:121
T operator()(T &t) const
Functor call.
Definition: function.h:180
T operator()(T &t) const
Functor call.
Definition: function.h:201
bool operator()(const T &t1, const T &t2) const
Functor call.
Definition: function.h:152
bool operator()(const T &t) const
Functor call.
Definition: function.h:173
T operator()(const T &t1, const T &t2) const
Functor call.
Definition: function.h:145
bool operator()(const T &t1, const T &t2) const
Functor call.
Definition: function.h:159
T operator()(T &t) const
Functor call.
Definition: function.h:187
bool operator()(const T &t1, const T &t2) const
Functor call.
Definition: function.h:166
T operator()(const T &t1, const T &t2) const
Functor call.
Definition: function.h:138
T operator()(const T &t) const
Unary functor call.
Definition: function.h:128
T operator()(T &t) const
Functor call.
Definition: function.h:194
bool operator()(const T1 &t1, const T2 &t2) const
Functor call.
Definition: function.h:107
T operator()(const T &t1, const T &t2) const
Binary functor call.
Definition: function.h:131
bool operator()(const T1 &t1, const T2 &t2) const
Functor call.
Definition: function.h:79
void transform(const Vector &vec, ResultVector &result, UnaryFunctor f)
Generic transform function that applies a unary functor (return value).
Definition: function.h:234
void for_each(Vector &vec, UnaryFunctor f)
Generic transform function that applies a unary functor (in-place).
Definition: function.h:302
void transform_right_scalar(const Vector &vec, const Scalar &s, ResultVector &result, BinaryFunctor f)
Generic transform function that applies a binary functor (return value, RHS scalar).
Definition: function.h:287
void transform_left_scalar(const Scalar &s, const Vector &vec, ResultVector &result, BinaryFunctor f)
Generic transform function that applies a binary functor (return value, LHS scalar).
Definition: function.h:269
const T & get(Size i) const
Returns the i-th vector element.
Definition: vector.h:620
static const Size SIZE
Constant size of the vector.
Definition: vector.h:300
T * begin()
Returns the pointer to the first vector element.
Definition: vector.h:309
Common namespace for APIs of NVIDIA Advanced Rendering Center GmbH.
Definition: example_derivatives.dox:5
Functor for the logical and operator, &&.
Definition: function.h:149
Functor for the division operator, /.
Definition: function.h:142
Functor for the equality comparison operator, ==.
Definition: function.h:76
Functor for the greater-than-or-equal comparison operator, >=.
Definition: function.h:111
Functor for the greater-than comparison operator, >.
Definition: function.h:104
Functor for the less-than-or-equal comparison operator, <=.
Definition: function.h:97
Functor for the less-than comparison operator, <.
Definition: function.h:90
Functor for the minus operator, -, unary and binary.
Definition: function.h:125
Functor for the multiplication operator, *.
Definition: function.h:135
Functor for the inequality comparison operator, !=.
Definition: function.h:83
Functor for the logical not operator, !.
Definition: function.h:170
Functor for the logical or operator, ||.
Definition: function.h:156
Functor for the plus operator, +.
Definition: function.h:118
Functor for the post-decrement operator, --.
Definition: function.h:198
Functor for the post-increment operator, ++.
Definition: function.h:184
Functor for the pre-decrement operator, --.
Definition: function.h:191
Functor for the pre-increment operator, ++.
Definition: function.h:177
Functor for the xor operator, ^.
Definition: function.h:163