@@ -252,6 +252,22 @@ struct cross_helper<T NBL_PARTIAL_REQ_BOT(concepts::FloatingPointVector<T> && (v
252252
253253#else // C++ only specializations
254254
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+
255271#define DECL_ARG (r,data,i,_T) BOOST_PP_COMMA_IF (BOOST_PP_NOT_EQUAL (i,0 )) const _T arg##i
256272#define WRAP (r,data,i,_T) BOOST_PP_COMMA_IF (BOOST_PP_NOT_EQUAL (i,0 )) _T
257273#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>
542558 }
543559};
544560
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-
554561template<typename T>
555562requires concepts::FloatingPoint<T>
556563struct nMin_helper<T>
@@ -841,9 +848,28 @@ struct smoothStep_helper<T NBL_PARTIAL_REQ_BOT(VECTOR_SPECIALIZATION_CONCEPT) >
841848 }
842849};
843850
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+
844870template<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) >
847873{
848874 using return_t = T;
849875 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