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 );
616 return abs( left - right ) <= e;
625 return abs( left - right ) <= e;
632#if defined(MI_COMPILER_MSC)
634 const unsigned char valid = _BitScanReverse(&index, v);
635 return (valid != 0) ? 31 - index : 32;
636#elif defined(MI_COMPILER_ICC) || defined(MI_COMPILER_GCC)
637 return (v != 0) ? __builtin_clz(v) : 32;
640 if (v == 0)
return 32;
642 if ((v >> 16) == 0) { n += 16; v <<= 16; };
643 if ((v >> 24) == 0) { n += 8; v <<= 8; };
644 if ((v >> 28) == 0) { n += 4; v <<= 4; };
645 if ((v >> 30) == 0) { n += 2; v <<= 2; };
655#if defined(MI_COMPILER_MSC)
656#if defined(MI_ARCH_64BIT)
658 const unsigned char valid = _BitScanReverse64(&index, v);
659 return (valid != 0) ? 63 - index : 64;
661 unsigned long index_h, index_l;
662 const unsigned char valid_h = _BitScanReverse(&index_h,(
Uint32)(v >> 32));
663 const unsigned char valid_l = _BitScanReverse(&index_l,(
Uint32)(v & 0xFFFFFFFF));
665 return (valid_l != 0) ? 63 - index_l : 64;
666 return 63 - index_h + 32;
668#elif defined(MI_COMPILER_ICC) || defined(MI_COMPILER_GCC)
669 return (v != 0) ? __builtin_clzll(v) : 64;
672 if (v == 0)
return 64;
674 if ((v >> 32) == 0) { n += 32; v <<= 32; };
675 if ((v >> 48) == 0) { n += 16; v <<= 16; };
676 if ((v >> 56) == 0) { n += 8; v <<= 8; };
677 if ((v >> 60) == 0) { n += 4; v <<= 4; };
678 if ((v >> 62) == 0) { n += 2; v <<= 2; };
691 return s1 * (
Float32(1)-t) + s2 * t;
701 return s1 * (
Float64(1)-t) + s2 * t;
706{
return std::log(s) * 1.4426950408889634073599246810019f ; }
709{
return std::log(s) * 1.4426950408889634073599246810019 ; }
719 return (mi::base::binary_cast<Uint32>(v) >> 23) - 127;
724 return static_cast<Sint32>(mi::base::binary_cast<Uint64>(v) >> 52) - 1023;
728template<
typename Integer>
731 return (v > 1) ?
log2_int(v - 1) + 1 : 0;
783{
int r = (s < 0 ) ? -1 : (s > 0) ? 1 : 0;
return static_cast<Sint8>( r); }
786{
int r = (s < 0 ) ? -1 : (s > 0) ? 1 : 0;
return static_cast<Sint16>( r); }
811 return (base::binary_cast<Uint32>(s) & (1U << 31)) != 0U;
820 return (base::binary_cast<Uint64>(s) & (1ULL << 63)) != 0ULL;
823#if (__cplusplus < 201103L)
830 const Uint32 f = base::binary_cast<Uint32>(x);
833 return (f << 1) > 0xFF000000U;
842 const Uint64 f = base::binary_cast<Uint64>(x);
844 return (f << 1) > 0xFFE0000000000000ULL;
852inline float __uint_as_float(
const unsigned v)
853{
return base::binary_cast<float>(v);}
855inline unsigned __float_as_uint(
const float v)
856{
return base::binary_cast<unsigned>(v);}
865 const Uint32 exponent_mask = 0x7F800000;
866 const Uint32 fraction_mask = 0x7FFFFF;
869 const Uint32 f = base::binary_cast<Uint32>(x);
872 return ((f & exponent_mask) == exponent_mask) &&
873 ((f & fraction_mask) == 0);
881 const Uint64 exponent_mask = 0x7FF0000000000000ULL;
882 const Uint64 fraction_mask = 0xFFFFFFFFFFFFFULL;
885 const Uint64 f = base::binary_cast<Uint64>(x);
888 return ((f & exponent_mask) == exponent_mask) &&
889 ((f & fraction_mask) == 0);
893#if (__cplusplus < 201103L)
901 const Uint32 exponent_mask = 0x7F800000;
904 const Uint32 f = base::binary_cast<Uint32>(x);
907 return ((f & exponent_mask) != exponent_mask);
917 const Uint64 exponent_mask = 0x7FF0000000000000ULL;
920 const Uint64 f = base::binary_cast<Uint64>(x);
923 return ((f & exponent_mask) != exponent_mask);
963 return t * t * (3.0f - 2.0f * t);
976 return t * t * (3.0 - 2.0 * t);
999 c[0] = max( color[0], 0.0f);
1000 c[1] = max( color[1], 0.0f);
1001 c[2] = max( color[2], 0.0f);
1003 const Float32 m = max( max( c[0], c[1]), c[2]);
1006 if( m <= 7.5231631727e-37f)
1008 else if( m >= 1.7014118346046923173168730371588e+38f)
1011 const Uint32 e = __float_as_uint( m) & 0x7F800000u;
1012 const Float32 v = __uint_as_float( 0x82800000u - e);
1015 | (
Uint32( c[1] * v) << 8)
1016 | (
Uint32( c[2] * v) << 16)
1017 | (e * 2 + (2 << 24));
1025 c[0] = max( color[0], 0.0f);
1026 c[1] = max( color[1], 0.0f);
1027 c[2] = max( color[2], 0.0f);
1029 const Float32 m = max( max( c[0], c[1]), c[2]);
1032 if( m <= 7.5231631727e-37f)
1033 rgbe[0] = rgbe[1] = rgbe[2] = rgbe[3] = 0;
1034 else if( m >= 1.7014118346046923173168730371588e+38f)
1035 rgbe[0] = rgbe[1] = rgbe[2] = rgbe[3] = 255;
1037 const Uint32 e = __float_as_uint( m) & 0x7F800000u;
1038 const Float32 v = __uint_as_float( 0x82800000u - e);
1040 rgbe[0] =
Uint8( c[0] * v);
1041 rgbe[1] =
Uint8( c[1] * v);
1042 rgbe[2] =
Uint8( c[2] * v);
1043 rgbe[3] =
Uint8( (e >> 23) + 2);
1051 color[0] = color[1] = color[2] = 0.0f;
1055 const Uint32 e = (
static_cast<Uint32>( rgbe[3]) << 23) - 0x800000u;
1056 const Float32 v = __uint_as_float( e);
1059 color[0] = __uint_as_float( e | (
static_cast<Uint32>( rgbe[0]) << 15)) - c;
1060 color[1] = __uint_as_float( e | (
static_cast<Uint32>( rgbe[1]) << 15)) - c;
1061 color[2] = __uint_as_float( e | (
static_cast<Uint32>( rgbe[2]) << 15)) - c;
1067 const Uint32 rgbe3 = rgbe & 0xFF000000u;
1069 color[0] = color[1] = color[2] = 0.0f;
1073 const Uint32 e = (rgbe3 >> 1) - 0x800000u;
1074 const Float32 v = __uint_as_float( e);
1077 color[0] = __uint_as_float( e | ((rgbe << 15) & 0x7F8000u)) - c;
1078 color[1] = __uint_as_float( e | ((rgbe << 7) & 0x7F8000u)) - c;
1079 color[2] = __uint_as_float( e | ((rgbe >> 1) & 0x7F8000u)) - c;
1096inline typename V::value_type
dot(
const V& lhs,
const V& rhs)
1098 typename V::value_type v(0);
1099 for(
Size i(0u); i < V::SIZE; ++i)
1100 v += lhs.get(i) * rhs.get(i);
1123inline typename V::value_type
length(
const V& v)
1140 const V& lhs,
const V& rhs)
1142 return length( lhs - rhs);
1149 for(
Size i(0u); i < V::SIZE; ++i)
1159 for(
Size i(0u); i < V::SIZE; ++i)
1160 if( ! (lhs.get(i) == rhs.get(i)))
1170 for(
Size i(0u); i < V::SIZE; ++i)
1171 if( lhs.get(i) != rhs.get(i))
1183 for(
Size i(0u); i < V::SIZE-1; ++i) {
1184 if( lhs.get(i) < rhs.get(i))
1186 if( lhs.get(i) > rhs.get(i))
1189 return lhs.get(V::SIZE-1) < rhs.get(V::SIZE-1);
1199 for(
Size i(0u); i < V::SIZE-1; ++i) {
1200 if( lhs.get(i) < rhs.get(i))
1202 if( lhs.get(i) > rhs.get(i))
1205 return lhs.get(V::SIZE-1) <= rhs.get(V::SIZE-1);
1215 for(
Size i(0u); i < V::SIZE-1; ++i) {
1216 if( lhs.get(i) > rhs.get(i))
1218 if( lhs.get(i) < rhs.get(i))
1221 return lhs.get(V::SIZE-1) > rhs.get(V::SIZE-1);
1231 for(
Size i(0u); i < V::SIZE-1; ++i) {
1232 if( lhs.get(i) > rhs.get(i))
1234 if( lhs.get(i) < rhs.get(i))
1237 return lhs.get(V::SIZE-1) >= rhs.get(V::SIZE-1);
1252 for(
Size i(0u); i < V::SIZE; ++i) {
1254 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:65
#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:1181
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:737
Float64 tan(Float64 a)
Returns the tangent of a. The angle a is specified in radians.
Definition: function.h:992
Float64 modf(Float64 s, Float64 &i)
Returns the fractional part of s and stores the integral part of s in i.
Definition: function.h:746
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:1197
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:1106
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:1130
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:1088
Float64 sin(Float64 a)
Returns the sine of a. The angle a is specified in radians.
Definition: function.h:933
Sint32 log2_int(const Uint32 v)
Returns the integer log2 of v.
Definition: function.h:712
Sint32 log2_int_ceil(const Integer v)
Returns the integer log2 of v, i.e., rounded up to the next integer.
Definition: function.h:729
Uint32 leading_zeros(Uint32 v)
Returns the number of leading zeros of v, 32-bit version.
Definition: function.h:629
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:1139
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:1229
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:1147
Float64 pow(Float64 a, Float64 b)
Returns a to the power of b.
Definition: function.h:759
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:1168
Float32 length(Float32 a)
Returns the Euclidean norm of the scalar a (its absolute value).
Definition: function.h:1114
bool sign_bit(Sint8 s)
Returns true if s<0 and false if s>= 0.
Definition: function.h:797
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:1213
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:1157
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:1250
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:982
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:628
Color sqrt(const Color &c)
Returns the square root of each element of c.
Definition: color.h:807
bool isinfinite(const Color &c)
Indicates whether any component of the color is infinite.
Definition: color.h:834
Color acos(const Color &c)
Returns a color with the elementwise arc cosine of the color c.
Definition: color.h:480
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:519
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:525
Color abs(const Color &c)
Returns a color with the elementwise absolute values of the color c.
Definition: color.h:474
Color round(const Color &c)
Returns a color with the elements of color c rounded to nearest integers.
Definition: color.h:740
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:716
MI_HOST_DEVICE_INLINE void from_rgbe(const Uint8 rgbe[4], Color &color)
Decodes a color from RGBE representation.
Definition: color.h:870
Color atan(const Color &c)
Returns a color with the elementwise arc tangent of the color c.
Definition: color.h:504
bool isfinite(const Color &c)
Indicates whether all components of the color are finite.
Definition: color.h:825
Color step(const Color &a, const Color &c)
Returns elementwise 0 if c is less than a and 1 otherwise.
Definition: color.h:813
Color tan(const Color &c)
Returns a color with the elementwise tangent of the color c.
Definition: color.h:819
Color atan2(const Color &c, const Color &d)
Returns a color with the elementwise arc tangent of the color c / d.
Definition: color.h:512
Color sin(const Color &c)
Returns a color with the elementwise sine of the color c.
Definition: color.h:764
Color degrees(const Color &c)
Converts elementwise radians in c to degrees.
Definition: color.h:567
Color saturate(const Color &c)
Returns the color c clamped elementwise to the range [0,1].
Definition: color.h:752
Color rsqrt(const Color &c)
Returns the reciprocal of the square root of each element of c.
Definition: color.h:746
bool any(const Color &c)
Returns true if any element of c is not equal to zero.
Definition: color.h:492
Color radians(const Color &c)
Converts elementwise degrees in c to radians.
Definition: color.h:734
Color exp2(const Color &c)
Returns a color with elementwise 2 to the power of the element in the color c.
Definition: color.h:599
Color log(const Color &c)
Returns a color with elementwise natural logarithm of the color c.
Definition: color.h:692
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:606
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:785
Color sign(const Color &c)
Returns the elementwise sign of color c.
Definition: color.h:758
Color fmod(const Color &a, const Color &b)
Returns elementwise a modulo b, in other words, the remainder of a/b.
Definition: color.h:614
Color cos(const Color &c)
Returns a color with the elementwise cosine of the color c.
Definition: color.h:561
MI_HOST_DEVICE_INLINE void to_rgbe(const Color &color, Uint32 &rgbe)
Encodes a color into RGBE representation.
Definition: color.h:854
Color pow(const Color &a, const Color &b)
Returns the color a elementwise to the power of b.
Definition: color.h:722
bool all(const Color &c)
Returns true if all elements of c are not equal to zero.
Definition: color.h:486
bool isnan(const Color &c)
Indicates whether any component of the color is "not a number".
Definition: color.h:843
Color log10(const Color &c)
Returns a color with elementwise base 10 logarithm of the color c.
Definition: color.h:707
Color log2(const Color &c)
Returns a color with elementwise base 2 logarithm of the color c.
Definition: color.h:698
Color exp(const Color &c)
Returns a color with elementwise e to the power of the element in the color c.
Definition: color.h:593
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:653
void sincos(const Color &a, Color &s, Color &c)
Computes elementwise the sine s and cosine c of angles a simultaneously.
Definition: color.h:772
Color asin(const Color &c)
Returns a color with the elementwise arc sine of the color c.
Definition: color.h:498
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:623
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: math.h:22
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