1#ifndef _BBM_ENOKI_MATH_H_
2#define _BBM_ENOKI_MATH_H_
4#include "backbone/vec.h"
5#include "backbone/array.h"
6#include "enoki/special.h"
25#define BBM_ENOKI_MATHOP(OpName) \
26 template<typename... Ts> requires requires(const Ts&... t) {{enoki::OpName(bbm::value(t)...)};} \
27 inline constexpr auto OpName(const Ts&... t) \
29 constexpr bool has_floating_scalar = (( std::is_scalar_v< std::decay_t<decltype(bbm::value(t))> > && std::is_floating_point_v< std::decay_t<decltype(bbm::value(t))> > ) || ...); \
31 if constexpr (has_floating_scalar) \
33 using base_type = decltype( (std::declval<std::conditional_t< std::is_scalar_v< std::decay_t<decltype(bbm::value(t))> >, float, decltype(bbm::value(t)) >>() + ...) ); \
34 using type = enoki::scalar_t<base_type>; \
35 return enoki::OpName( std::conditional_t<std::is_scalar_v<std::decay_t<decltype(bbm::value(t))>>, type, decltype(bbm::value(t))>(bbm::value(t))... ); \
37 else return enoki::OpName( bbm::value(t)... ); \
90 #undef BBM_ENOKI_MATHOP
101 auto tmp = enoki::sincos(a);
102 return {tmp.second, tmp.first};
112 template<
typename T,
typename D>
113 using binary_cast_t = std::conditional_t<
114 std::floating_point<enoki::scalar_t<std::decay_t<bbm::attribute_value_t<D>>>> && std::is_scalar_v<std::decay_t<bbm::attribute_value_t<T>>>,
115 const enoki::scalar_t<std::decay_t<bbm::attribute_value_t<D>>>&,
116 const std::decay_t<bbm::attribute_value_t<T>>& >;
125#define BBM_ENOKI_BINARY_OP(OpName) \
126 template<typename T, typename D> \
127 inline constexpr auto OpName(T&& t, D&& d) -> decltype( enoki::OpName< enoki::detail::binary_cast_t<T,D>, enoki::detail::binary_cast_t<D,T> >( t, d ) ) \
129 return enoki::OpName<enoki::detail::binary_cast_t<T,D>, enoki::detail::binary_cast_t<D,T>>(t, d); \
138 #undef BBM_ENOKI_BINARY_OP
#define BBM_ENOKI_MATHOP(OpName)
Helper Macro for mapping math operations to enoki. Takes in account to pass the 'value' of variables ...
Definition: math.h:25
A warpper class to attach a properties to a class via a property struct. The propert expects by defau...
Random number generator; built on top of Drjit.
Definition: backbone.h:53
auto min(T &&t, U &&u)
min between two variables
Definition: math.h:84
vec2d< T > cossin(const T &a)
cossin
Definition: math.h:107
drjit::Array< T, 2 > vec2d
Definition: vec.h:13
auto max(T &&t, U &&u)
max between two variables
Definition: math.h:75