Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'intern/cycles/util/util_math_float4.h')
-rw-r--r--intern/cycles/util/util_math_float4.h45
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)