1#ifndef _BBM_AGGREGATEBSDF_H_
2#define _BBM_AGGREGATEBSDF_H_
50 template<
typename ITR>
requires std::input_or_output_iterator<ITR> && concepts::bsdf< std::iter_reference_t<ITR> > && concepts::matching_config< std::iter_reference_t<ITR> > && concepts::bsdf_ptr< std::iter_value_t<ITR> >
54 for(ITR itr =
begin; itr !=
end; ++itr)
80 return std::accumulate(
_bsdfs.begin(),
_bsdfs.end(), Spectrum(0), [&](
const Spectrum& result,
auto&
bsdf)
82 return result +
bsdf->
eval(in, out, component, unit, mask);
107 std::vector<Value> weights;
111 weights.push_back( bbm::hsum(
bsdf->
reflectance(out, component, unit, mask)) );
112 sum += weights.back();
116 mask &= (sum > Constants::Epsilon());
117 if(bbm::none(mask))
return result;
122 auto residual = xi[0] * sum;
127 Mask temp_mask = mask && ((residual >= 0) && (residual <= weight));
130 Value normalized_residual =
bbm::select(temp_mask && (weight > Constants::Epsilon()), residual / weight, 0);
133 result =
bbm::select(temp_mask,
bsdf->
sample(out, Vec2d( normalized_residual, xi[1] ), component, unit, temp_mask), result);
143 result.pdf += weight *
bsdf->
pdf(result.direction, out, component, unit, mask) / sum;
167 std::vector<Value> weights;
171 weights.push_back( bbm::hsum(
bsdf->
reflectance(out, component, unit, mask)) );
172 sum += weights.back();
176 mask &= (sum > Constants::Epsilon());
177 if(bbm::none(mask))
return Value(0);
183 pdf += weight *
bsdf->
pdf(in, out, component, unit, mask) / sum;
217 virtual std::string
toString(
void)
const override final
233 auto bsdfs = bbm::fromString<bbm::vector<bsdf_ptr<Config>>>(
value);
248 result.insert(result.end(), param.begin(), param.end());
259 result.insert(result.end(), param.begin(), param.end());
270 result.insert(result.end(), param.begin(), param.end());
281 result.insert(result.end(), param.begin(), param.end());
292 result.insert(result.end(), param.begin(), param.end());
331 return bsdf<
aggregatemodel<BSDFMODELs...>>( (
dynamic_cast<const BSDFMODELs&
>(src))... );
334 template<
typename... CONFs>
requires (concepts::config<CONFs> && ...)
337 using cfg =
get_config< std::tuple_element_t<0, std::tuple<CONFs...>> >;
342 template<
typename ITR>
requires (std::input_or_output_iterator<ITR> && concepts::bsdf_ptr<std::iter_reference_t<ITR>>)
The sum of different BSDF models.
Connects a BSDF model and a BSDF.
A shared_ptr wrapper for bsdfs.
A BSDF that is the aggregate of different BSDFs.
Definition: aggregatebsdf.h:39
virtual bbm::vector< Value > parameter_upper_bound(bsdf_attr flags=bsdf_attr::All) const override final
Definition: aggregatebsdf.h:286
virtual bbm::vector< Value > parameter_lower_bound(bsdf_attr flags=bsdf_attr::All) const override final
Definition: aggregatebsdf.h:275
std::vector< bsdf_ptr< Config > > _bsdfs
Definition: aggregatebsdf.h:302
virtual bbm::vector< Value > parameter_default_values(bsdf_attr flags=bsdf_attr::All) const override final
Definition: aggregatebsdf.h:264
virtual Value pdf(const Vec3d &in, const Vec3d &out, BsdfFlag component=bsdf_flag::All, unit_t unit=unit_t::Radiance, Mask mask=true) const override final
Compute the pdf given an in and out direction.
Definition: aggregatebsdf.h:163
static aggregatebsdf fromString(const std::string &str)
Construct the aggregate bsdf from a string.
Definition: aggregatebsdf.h:225
aggregatebsdf(const ITR &begin, const ITR &end)
Construct an aggregate bsdf from iterators to list of 'bsdf_ptrs'.
Definition: aggregatebsdf.h:51
virtual Spectrum eval(const Vec3d &in, const Vec3d &out, BsdfFlag component=bsdf_flag::All, unit_t unit=unit_t::Radiance, Mask mask=true) const override final
Sum the BSDF evaluations for a given in out direction.
Definition: aggregatebsdf.h:77
virtual BsdfSample sample(const Vec3d &out, const Vec2d &xi, BsdfFlag component=bsdf_flag::All, unit_t unit=unit_t::Radiance, Mask mask=true) const override final
Sample the aggregate BSDF given a direction and two random variables.
Definition: aggregatebsdf.h:102
BBM_BSDF_FORWARD
Definition: aggregatebsdf.h:43
aggregatebsdf(const BSDFS &... src)
Construct an aggregate bsdf from a list of bsdf_ptrs.
Definition: aggregatebsdf.h:47
virtual bbm::vector< Value & > parameter_values(bsdf_attr flags=bsdf_attr::All) override final
Definition: aggregatebsdf.h:242
aggregatebsdf(const aggregatebsdf< Config > &src)
Copy Constructor.
Definition: aggregatebsdf.h:59
aggregatebsdf< Config > & operator=(const aggregatebsdf< Config > &src)
Assignment Operator.
Definition: aggregatebsdf.h:62
virtual bbm::vector< const Value & > parameter_values(bsdf_attr flags=bsdf_attr::All) const override final
Definition: aggregatebsdf.h:253
virtual Spectrum reflectance(const Vec3d &out, BsdfFlag component=bsdf_flag::All, unit_t unit=unit_t::Radiance, Mask mask=true) const override final
Return the (approximate) hemispherical reflectance of the BSDF.
Definition: aggregatebsdf.h:202
static constexpr string_literal name
Definition: aggregatebsdf.h:42
virtual std::string toString(void) const override final
Convert the aggregatebsdf to string.
Definition: aggregatebsdf.h:217
BSDF implementation of a BSDF model.
Definition: bsdf.h:30
virtual Value pdf(const Vec3d &in, const Vec3d &out, BsdfFlag component=bsdf_flag::All, unit_t unit=unit_t::Radiance, Mask mask=true) const override final
Virtual passthrough of the pdf function.
Definition: bsdf.h:89
virtual Spectrum eval(const Vec3d &in, const Vec3d &out, BsdfFlag component=bsdf_flag::All, unit_t unit=unit_t::Radiance, Mask mask=true) const override final
Virtual passthrough of eval function.
Definition: bsdf.h:56
virtual BsdfSample sample(const Vec3d &out, const Vec2d &xi, BsdfFlag component=bsdf_flag::All, unit_t unit=unit_t::Radiance, Mask mask=true) const override final
Virtual passthrough of sample function.
Definition: bsdf.h:73
virtual Spectrum reflectance(const Vec3d &out, BsdfFlag component=bsdf_flag::All, unit_t unit=unit_t::Radiance, Mask mask=true) const override final
Virtual passthrough of the hemispherical reflectance function.
Definition: bsdf.h:104
Definition: vector_util.h:27
bsdf_ptr concpt
Definition: bsdf_ptr.h:24
bsdfmodel concept
Definition: bsdfmodel.h:33
config concept
Definition: config.h:31
matching_config concept
Definition: config.h:63
concept to check if a type has a valid string_converter.
ranged for loop over multiple containers at once
std::pair< std::string, std::string > get_keyword(const std::string &str)
Return the keyword substring appearing an open bracket, and the arguments appearing in the brackets: ...
Definition: string_util.h:65
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
constexpr auto select(MASK &&mask, const A &a, const A &b)
Definition: backbone.h:255
void multirange_for(FUNC &&func, Ts &&... containers)
ranged for loop over multiple containers at once
Definition: multirange_for.h:43
typename std::decay_t< T >::Config get_config
get_config type trait
Definition: config.h:49
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
auto end(T &&t)
Definition: iterator_util.h:43
std::string toString(const T &)
toString alias
Definition: stringconvert.h:594
auto aggregate(const bsdf< BSDFMODELs > &... src)
Helper methods for simplifying the creation of a aggregate bsdf.
Definition: aggregatebsdf.h:329
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
auto begin(T &&t)
Definition: iterator_util.h:29
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
unit_t
Light Unit.
Definition: unit.h:21
The sum of different BSDF models.
Definition: aggregatemodel.h:24
Forward declaration.
Definition: bsdf_base.h:55
Definition: bsdf_ptr.h:22
Definition: string_literal.h:16