diff options
Diffstat (limited to 'intern/cycles/util/util_math_float4.h')
-rw-r--r-- | intern/cycles/util/util_math_float4.h | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/intern/cycles/util/util_math_float4.h b/intern/cycles/util/util_math_float4.h index 1fb886572e3..bc5322a22bb 100644 --- a/intern/cycles/util/util_math_float4.h +++ b/intern/cycles/util/util_math_float4.h @@ -34,7 +34,9 @@ ccl_device_inline float4 operator*(const float4 &a, float f); ccl_device_inline float4 operator*(float f, const float4 &a); ccl_device_inline float4 operator/(const float4 &a, float f); ccl_device_inline float4 operator/(const float4 &a, const float4 &b); +ccl_device_inline float4 operator+(const float4 &a, const float f); ccl_device_inline float4 operator+(const float4 &a, const float4 &b); +ccl_device_inline float4 operator-(const float4 &a, const float f); ccl_device_inline float4 operator-(const float4 &a, const float4 &b); ccl_device_inline float4 operator+=(float4 &a, const float4 &b); ccl_device_inline float4 operator*=(float4 &a, const float4 &b); @@ -46,6 +48,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); @@ -61,8 +64,12 @@ 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 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); +ccl_device_inline float4 mix(const float4 &a, const float4 &b, float t); #endif /* !__KERNEL_OPENCL__*/ +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); @@ -139,6 +146,11 @@ ccl_device_inline float4 operator/(const float4 &a, const float4 &b) # endif } +ccl_device_inline float4 operator+(const float4 &a, const float f) +{ + return a + make_float4(f, f, f, f); +} + ccl_device_inline float4 operator+(const float4 &a, const float4 &b) { # ifdef __KERNEL_SSE__ @@ -148,6 +160,11 @@ ccl_device_inline float4 operator+(const float4 &a, const float4 &b) # endif } +ccl_device_inline float4 operator-(const float4 &a, const float f) +{ + return a - make_float4(f, f, f, f); +} + ccl_device_inline float4 operator-(const float4 &a, const float4 &b) { # ifdef __KERNEL_SSE__ @@ -213,6 +230,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__) @@ -338,6 +360,21 @@ 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 +} + +ccl_device_inline float4 mix(const float4 &a, const float4 &b, float t) +{ + return a + t * (b - a); +} + #endif /* !__KERNEL_OPENCL__*/ #ifdef __KERNEL_SSE__ @@ -430,6 +467,11 @@ ccl_device_inline float4 load_float4(const float *v) #endif /* !__KERNEL_GPU__ */ +ccl_device_inline float4 safe_divide_float4_float(const float4 a, const float b) +{ + return (b != 0.0f) ? a / b : make_float4(0.0f, 0.0f, 0.0f, 0.0f); +} + CCL_NAMESPACE_END #endif /* __UTIL_MATH_FLOAT4_H__ */ |