diff options
Diffstat (limited to 'intern/cycles/util/util_math_float4.h')
-rw-r--r-- | intern/cycles/util/util_math_float4.h | 45 |
1 files changed, 39 insertions, 6 deletions
diff --git a/intern/cycles/util/util_math_float4.h b/intern/cycles/util/util_math_float4.h index 1fb886572e3..0624dadf5ad 100644 --- a/intern/cycles/util/util_math_float4.h +++ b/intern/cycles/util/util_math_float4.h @@ -46,6 +46,7 @@ ccl_device_inline int4 operator>=(const float4 &a, const float4 &b); ccl_device_inline int4 operator<=(const float4 &a, const float4 &b); ccl_device_inline bool operator==(const float4 &a, const float4 &b); +ccl_device_inline float distance(const float4 &a, const float4 &b); ccl_device_inline float dot(const float4 &a, const float4 &b); ccl_device_inline float len_squared(const float4 &a); ccl_device_inline float4 rcp(const float4 &a); @@ -53,16 +54,20 @@ ccl_device_inline float4 sqrt(const float4 &a); ccl_device_inline float4 sqr(const float4 &a); ccl_device_inline float4 cross(const float4 &a, const float4 &b); ccl_device_inline bool is_zero(const float4 &a); -ccl_device_inline float average(const float4 &a); ccl_device_inline float len(const float4 &a); ccl_device_inline float4 normalize(const float4 &a); ccl_device_inline float4 safe_normalize(const float4 &a); ccl_device_inline float4 min(const float4 &a, const float4 &b); ccl_device_inline float4 max(const float4 &a, const float4 &b); +ccl_device_inline float4 mix(const float4 &a, const float4 &b, float t); ccl_device_inline float4 clamp(const float4 &a, const float4 &mn, const float4 &mx); ccl_device_inline float4 fabs(const float4 &a); +ccl_device_inline float4 floor(const float4 &a); #endif /* !__KERNEL_OPENCL__*/ +ccl_device_inline float average_float4(const float4 a); +ccl_device_inline float4 safe_divide_float4_float(const float4 a, const float b); + #ifdef __KERNEL_SSE__ template<size_t index_0, size_t index_1, size_t index_2, size_t index_3> __forceinline const float4 shuffle(const float4 &b); @@ -213,6 +218,11 @@ ccl_device_inline bool operator==(const float4 &a, const float4 &b) # endif } +ccl_device_inline float distance(const float4 &a, const float4 &b) +{ + return len(a - b); +} + ccl_device_inline float dot(const float4 &a, const float4 &b) { # if defined(__KERNEL_SSE41__) && defined(__KERNEL_SSE__) @@ -286,11 +296,6 @@ ccl_device_inline float4 reduce_add(const float4 &a) # endif } -ccl_device_inline float average(const float4 &a) -{ - return reduce_add(a).x * 0.25f; -} - ccl_device_inline float len(const float4 &a) { return sqrtf(dot(a, a)); @@ -325,6 +330,11 @@ ccl_device_inline float4 max(const float4 &a, const float4 &b) # endif } +ccl_device_inline float4 mix(const float4 &a, const float4 &b, float t) +{ + return a + t * (b - a); +} + ccl_device_inline float4 clamp(const float4 &a, const float4 &mn, const float4 &mx) { return min(max(a, mn), mx); @@ -338,8 +348,31 @@ ccl_device_inline float4 fabs(const float4 &a) return make_float4(fabsf(a.x), fabsf(a.y), fabsf(a.z), fabsf(a.w)); # endif } + +ccl_device_inline float4 floor(const float4 &a) +{ +# ifdef __KERNEL_SSE__ + return float4(_mm_floor_ps(a)); +# else + return make_float4(floorf(a.x), floorf(a.y), floorf(a.z), floorf(a.w)); +# endif +} + #endif /* !__KERNEL_OPENCL__*/ +ccl_device_inline float average_float4(const float4 a) +{ + return (a.x + a.y + a.z + a.w) * 0.25f; +} + +ccl_device_inline float4 safe_divide_float4_float(const float4 a, const float b) +{ + return make_float4((b != 0.0f) ? a.x / b : 0.0f, + (b != 0.0f) ? a.y / b : 0.0f, + (b != 0.0f) ? a.z / b : 0.0f, + (b != 0.0f) ? a.w / b : 0.0f); +} + #ifdef __KERNEL_SSE__ template<size_t index_0, size_t index_1, size_t index_2, size_t index_3> __forceinline const float4 shuffle(const float4 &b) |