@@ -252,6 +252,22 @@ struct cross_helper<T NBL_PARTIAL_REQ_BOT(concepts::FloatingPointVector<T> && (v
252
252
253
253
#else // C++ only specializations
254
254
255
+ template<typename UnsignedInteger NBL_FUNC_REQUIRES (hlsl::is_integral_v<UnsignedInteger>&& hlsl::is_unsigned_v<UnsignedInteger>)
256
+ inline bool isnan_uint_impl (UnsignedInteger val)
257
+ {
258
+ using AsFloat = typename float_of_size<sizeof (UnsignedInteger)>::type;
259
+ constexpr UnsignedInteger Mask = (static_cast<UnsignedInteger>(0 ) - 1 ) >> 1 ;
260
+ UnsignedInteger absVal = val & Mask;
261
+ return absVal > (ieee754::traits<AsFloat>::specialValueExp << ieee754::traits<AsFloat>::mantissaBitCnt);
262
+ }
263
+
264
+ template<typename UnsignedInteger NBL_FUNC_REQUIRES (hlsl::is_integral_v<UnsignedInteger>&& hlsl::is_unsigned_v<UnsignedInteger>)
265
+ inline bool isinf_uint_impl (UnsignedInteger val)
266
+ {
267
+ using AsFloat = typename float_of_size<sizeof (UnsignedInteger)>::type;
268
+ return (val & (~ieee754::traits<AsFloat>::signMask)) == ieee754::traits<AsFloat>::inf;
269
+ }
270
+
255
271
#define DECL_ARG (r,data,i,_T) BOOST_PP_COMMA_IF (BOOST_PP_NOT_EQUAL (i,0 )) const _T arg##i
256
272
#define WRAP (r,data,i,_T) BOOST_PP_COMMA_IF (BOOST_PP_NOT_EQUAL (i,0 )) _T
257
273
#define ARG (r,data,i,_T) BOOST_PP_COMMA_IF (BOOST_PP_NOT_EQUAL (i,0 )) arg##i
@@ -542,15 +558,6 @@ struct refract_helper<T, U>
542
558
}
543
559
};
544
560
545
- template<typename UnsignedInteger NBL_FUNC_REQUIRES (hlsl::is_integral_v<UnsignedInteger>&& hlsl::is_unsigned_v<UnsignedInteger>)
546
- inline bool isnan_uint_impl (UnsignedInteger val)
547
- {
548
- using AsFloat = typename float_of_size<sizeof (UnsignedInteger)>::type;
549
- constexpr UnsignedInteger Mask = ~static_cast<UnsignedInteger>(0 );
550
- UnsignedInteger absVal = val & Mask;
551
- return absVal > (ieee754::traits<AsFloat>::specialValueExp << ieee754::traits<AsFloat>::mantissaBitCnt);
552
- }
553
-
554
561
template<typename T>
555
562
requires concepts::FloatingPoint<T>
556
563
struct nMin_helper<T>
@@ -841,9 +848,28 @@ struct smoothStep_helper<T NBL_PARTIAL_REQ_BOT(VECTOR_SPECIALIZATION_CONCEPT) >
841
848
}
842
849
};
843
850
851
+ template<typename T>
852
+ NBL_PARTIAL_REQ_TOP (VECTOR_SPECIALIZATION_CONCEPT)
853
+ struct mix_helper<T, T NBL_PARTIAL_REQ_BOT (VECTOR_SPECIALIZATION_CONCEPT) >
854
+ {
855
+ using return_t = T;
856
+ static return_t __call (NBL_CONST_REF_ARG (T) x, NBL_CONST_REF_ARG (T) y, NBL_CONST_REF_ARG (T) a)
857
+ {
858
+ using traits = hlsl::vector_traits<T>;
859
+ array_get<T, typename traits::scalar_type> getter;
860
+ array_set<return_t, typename traits::scalar_type> setter;
861
+
862
+ return_t output;
863
+ for (uint32_t i = 0 ; i < traits::Dimension; ++i)
864
+ setter (output, i, mix_helper<typename traits::scalar_type, typename traits::scalar_type>::__call (getter (x, i), getter (y, i), getter (a, i)));
865
+
866
+ return output;
867
+ }
868
+ };
869
+
844
870
template<typename T, typename U>
845
- NBL_PARTIAL_REQ_TOP (VECTOR_SPECIALIZATION_CONCEPT && vector_traits<T>::Dimension == vector_traits<U>::Dimension)
846
- struct mix_helper<T, U NBL_PARTIAL_REQ_BOT (VECTOR_SPECIALIZATION_CONCEPT && vector_traits<T>::Dimension == vector_traits<U>::Dimension) >
871
+ NBL_PARTIAL_REQ_TOP (concepts::Vectorial<T> && concepts::Boolean<U> && vector_traits<T>::Dimension == vector_traits<U>::Dimension)
872
+ struct mix_helper<T, U NBL_PARTIAL_REQ_BOT (concepts::Vectorial<T> && concepts::Boolean<U> && vector_traits<T>::Dimension == vector_traits<U>::Dimension) >
847
873
{
848
874
using return_t = T;
849
875
static return_t __call (NBL_CONST_REF_ARG (T) x, NBL_CONST_REF_ARG (T) y, NBL_CONST_REF_ARG (U) a)
0 commit comments