1#ifndef _BBM_BSDF_ENUMERATE_H_
2#define _BBM_BSDF_ENUMERATE_H_
29 template<
typename MODEL,
typename CALLBACK,
typename SELECT>
requires concepts::bsdfmodel<MODEL>
30 inline void enumerate_parameter_helper(
bsdf_attr flag, MODEL&& model, CALLBACK&& callback, SELECT&& select)
33 using Value = std::conditional_t< bbm::is_const_v<MODEL>,
34 const typename std::decay_t<MODEL>::Value&,
35 typename std::decay_t<MODEL>::Value&
39 CONSTFOR(idx, reflection::attributes_size<MODEL>,
42 using val_t =
decltype(val);
44 if constexpr (concepts::bsdf_attribute<val_t> && is_enumerable_v<Value, val_t>)
45 if(
is_set(flag, std::decay_t<val_t>::prop::flag) )
46 enumerate<Value>( select(std::forward<val_t>(val)), callback );
58 template<
typename MODEL,
typename CALLBACK>
requires concepts::bsdfmodel<MODEL>
61 bbm::detail::enumerate_parameter_helper(flag, std::forward<MODEL>(model), callback, [](
auto&& val) ->
decltype(
value(val)) {
return value(val); } );
68 template<
typename MODEL,
typename CALLBACK>
requires concepts::bsdfmodel<MODEL>
71 bbm::detail::enumerate_parameter_helper(flag, std::forward<MODEL>(model), callback, [](
auto&& val) {
return default_value(val); } );
78 template<
typename MODEL,
typename CALLBACK>
requires concepts::bsdfmodel<MODEL>
81 bbm::detail::enumerate_parameter_helper(flag, std::forward<MODEL>(model), callback, [](
auto&& val) {
return lower_bound(val); } );
88 template<
typename MODEL,
typename CALLBACK>
requires concepts::bsdfmodel<MODEL>
91 bbm::detail::enumerate_parameter_helper(flag, std::forward<MODEL>(model), callback, [](
auto&& val) {
return upper_bound(val); } );
102 template<
typename MODEL>
requires (concepts::bsdfmodel<MODEL> && !concepts::bsdf<MODEL>)
106 using Value = std::conditional_t< bbm::is_const_v<MODEL>,
107 const typename std::decay_t<MODEL>::Value&,
108 typename std::decay_t<MODEL>::Value&
113 enumerate_parameters(flag, std::forward<MODEL>(model), [&result](
auto&& val) { result.push_back(std::forward<Value>(val)); });
127 template<
typename BSDF>
requires concepts::bsdf<BSDF>
141 template<
typename MODEL>
requires (concepts::bsdfmodel<MODEL> && !concepts::bsdf<MODEL>)
145 using Value =
typename std::decay_t<MODEL>::Value;
149 enumerate_default_parameters(flag, std::forward<MODEL>(model), [&result](
auto&& val) { result.push_back(std::forward<
decltype(val)>(val)); });
163 template<
typename BSDF>
requires concepts::bsdf<BSDF>
177 template<
typename MODEL>
requires (concepts::bsdfmodel<MODEL> && !concepts::bsdf<MODEL>)
181 using Value =
typename std::decay_t<MODEL>::Value;
185 enumerate_lower_bound(flag, std::forward<MODEL>(model), [&result](
auto&& val) { result.push_back(std::forward<
decltype(val)>(val)); });
198 template<
typename BSDF>
requires concepts::bsdf<BSDF>
212 template<
typename MODEL>
requires (concepts::bsdfmodel<MODEL> && !concepts::bsdf<MODEL>)
216 using Value =
typename std::decay_t<MODEL>::Value;
220 enumerate_upper_bound(flag, model, [&result](
auto&& val) { result.push_back(std::forward<
decltype(val)>(val)); });
233 template<
typename BSDF>
requires concepts::bsdf<BSDF>
All includes and helpers needed for declaring new bsdfmodels.
Abstract base definition of a BSDF (with virtual functions)
BSDF implementation of a BSDF model.
Definition: bsdf.h:30
virtual bbm::vector< Value > parameter_upper_bound(bsdf_attr flags=bsdf_attr::All) const override final
Definition: bsdf.h:149
virtual bbm::vector< Value > parameter_lower_bound(bsdf_attr flags=bsdf_attr::All) const override final
Definition: bsdf.h:144
virtual bbm::vector< Value > parameter_default_values(bsdf_attr flags=bsdf_attr::All) const override final
Definition: bsdf.h:139
virtual bbm::vector< Value & > parameter_values(bsdf_attr flags=bsdf_attr::All) override final
Definition: bsdf.h:129
Definition: vector_util.h:27
#define CONSTFOR(IDX, NUMITR,...)
HELPER MACRO.
Definition: constfor.h:63
A warpper class to attach a properties to a class via a property struct. The propert expects by defau...
Enumerate all elements in iterators recursively.
Scoped enum operators and methods.
constexpr decltype(auto) attributes(T &&t)
Definition: reflection.h:200
Definition: aggregatebsdf.h:29
auto parameter_default_values(MODEL &&model, bsdf_attr flag=bsdf_attr::All)
Enumerate the default parameters of a BSDF model in a vector.
Definition: bsdf_enumerate.h:142
void enumerate_default_parameters(bsdf_attr flag, MODEL &&model, CALLBACK &&callback)
Enumerate the default values of the attributes from a bsdf model.
Definition: bsdf_enumerate.h:69
constexpr auto default_value(T)
Definition: bsdf_attribute.h:37
void enumerate_lower_bound(bsdf_attr flag, MODEL &&model, CALLBACK &&callback)
Enumerate the lower bounds of the attributes from a bsdf model.
Definition: bsdf_enumerate.h:79
void enumerate_parameters(bsdf_attr flag, MODEL &&model, CALLBACK &&callback)
Enumerate the values of the attributes from a bsdf model.
Definition: bsdf_enumerate.h:59
auto parameter_upper_bound(MODEL &&model, bsdf_attr flag=bsdf_attr::All)
Enumerate the upper bound of the parameters of a BSDF model in a vector.
Definition: bsdf_enumerate.h:213
constexpr auto lower_bound(T)
Definition: bsdf_attribute.h:40
constexpr auto upper_bound(T)
Definition: bsdf_attribute.h:43
auto parameter_lower_bound(MODEL &&model, bsdf_attr flag=bsdf_attr::All)
Enumerate the lower bound of the parameters of a BSDF model in a vector.
Definition: bsdf_enumerate.h:178
constexpr auto is_set(const FLAGNAME &a, const FLAG &flag)
Check if all in 'flag' are also set in 'a'; compatible with packet types.
Definition: flags.h:100
decltype(auto) value(T &&t)
return the value of an attribute, or if not an attribute the object
Definition: attribute_value.h:20
auto parameter_values(MODEL &&model, bsdf_attr flag=bsdf_attr::All)
Enumerate the parameters of a BSDF model in a vector.
Definition: bsdf_enumerate.h:103
bsdf_attr
Attribute Property Flags.
Definition: bsdf_attr_flag.h:17
void enumerate_upper_bound(bsdf_attr flag, MODEL &&model, CALLBACK &&callback)
Enumerate the upper bounds of the attributes from a bsdf model.
Definition: bsdf_enumerate.h:89
Compile-time reflection of:
Extensions for the STL vector class.