Loading...
Searching...
No Matches
bsdfmodel.h
Go to the documentation of this file.
1#ifndef _BBM_BSDFMODEL_CONCEPT_H_
2#define _BBM_BSDFMODEL_CONCEPT_H_
3
4#include "concepts/config.h"
5#include "concepts/named.h"
6
8
9#include "bbm/unit.h"
10#include "bbm/config.h"
11
12/************************************************************************/
13/*! \file bsdfmodel.h
14
15 \brief bsdfmodel contract
16*************************************************************************/
17
18namespace bbm {
19 namespace concepts {
20
21 /********************************************************************/
22 /*! \brief bsdfmodel concept
23
24 Each bsdfmodel requires:
25 + concepts::has_config
26 + concepts::named
27 + Spectrum eval(const Vec3d& in, const Vec3d& out, BsdfFlag component=bsdf_flag::All, unit_t unit=unit_t::Radiance, Mask mask=true) const
28 + BsdfSample sample(const Vec3d& out, const Vec2d& xi, BsdfFlag component=bsdf_flag::All, unit_t unit=unit_t::Radiance, Mask mask=true) const
29 + Value pdf(const Vec3d& in, const Vec3d& out, BsdfFlag component=bsdf_flag::All, unit_t unit=unit_t::Radiance, Mask mask=true) const
30 + Spectrum reflectance(const Vec3d& out, BsdfFlag component=bsdf_flag::All, unit_t unit=unit_t::Radiance, Mask mask=true) const
31 *********************************************************************/
32 template<typename BSDFMODEL>
33 concept bsdfmodel = requires(const BSDFMODEL& model)
34 {
37
38 /******************************************************************/
39 /*! \brief Evaluate the BSDF given an in and out direction
40
41 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c}
42 Spectrum eval(const Vec3d& in, const Vec3d& out, BsdfFlag component=bsdf_flag::All, unit_t unit=unit_t::Radiance, Mask mask=true) const
43 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
44
45 \param in = incident direction of transport
46 \param out = outgoing direction of transport
47 \param component = which reflectance component to eval [default = bsdf_flag::All]
48 \param unit = unit of computation [default = unit_t::Radiance]
49 \param mask = mask to enable/disable lanes [default = true]
50 \returns the resulting Spectrum of the evaluation.
51
52 IMPORTANT: The foreshortning (i.e., cosine) is __NOT__ included.
53 *******************************************************************/
54 { model.eval(std::declval<Vec3d_t<BSDFMODEL>>(), std::declval<Vec3d_t<BSDFMODEL>>(), std::declval<BsdfFlag_t<BSDFMODEL>>(), std::declval<unit_t>(), std::declval<Mask_t<BSDFMODEL>>()) } -> std::same_as<Spectrum_t<BSDFMODEL>>;
55
56 //! \brief mask has default value.
57 { model.eval(std::declval<Vec3d_t<BSDFMODEL>>(), std::declval<Vec3d_t<BSDFMODEL>>(), std::declval<BsdfFlag_t<BSDFMODEL>>(), std::declval<unit_t>())} -> std::same_as<Spectrum_t<BSDFMODEL>>;
58
59 //! \brief unit template parameter has default.
60 { model.eval(std::declval<Vec3d_t<BSDFMODEL>>(), std::declval<Vec3d_t<BSDFMODEL>>(), std::declval<BsdfFlag_t<BSDFMODEL>>())} -> std::same_as<Spectrum_t<BSDFMODEL>>;
61
62 //! \brief component has default value.
63 { model.eval(std::declval<Vec3d_t<BSDFMODEL>>(), std::declval<Vec3d_t<BSDFMODEL>>()) } -> std::same_as<Spectrum_t<BSDFMODEL>>;
64
65
66 /******************************************************************/
67 /*! \brief Samples an incoming direction with a pdf proportional to the
68 BSDF given an out direction and 2 random variables.
69
70 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c}
71 BsdfSample sample(const Vec3d& out, const Vec2d& xi, BsdfFlag component=bsdf_flag::All, unit_t unit=unit_t::Radiance, Mask mask=true) const
72 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
73
74 \param out = the outgoing direction
75 \param xi = two random variables stored in a Vec2d used to sample
76 \param component = which reflectance component to sample [default=bsdf_flag::All]
77 \param unit = unit of computation [default=unit_t::Radiance]
78 \param mask = mask to enable/disable lanes [default=true]
79 \returns a BsdfSample that contains the sampled direction
80 and the corresponding pdf.
81 *******************************************************************/
82 { model.sample(std::declval<Vec3d_t<BSDFMODEL>>(), std::declval<Vec2d_t<BSDFMODEL>>(), std::declval<BsdfFlag_t<BSDFMODEL>>(), std::declval<unit_t>(), std::declval<Mask_t<BSDFMODEL>>()) } -> std::same_as<BsdfSample_t<BSDFMODEL>>;
83
84 //! \brief mask has default value
85 { model.sample(std::declval<Vec3d_t<BSDFMODEL>>(), std::declval<Vec2d_t<BSDFMODEL>>(), std::declval<BsdfFlag_t<BSDFMODEL>>(), std::declval<unit_t>()) } -> std::same_as<BsdfSample_t<BSDFMODEL>>;
86
87 //! \brief unit template parameter has default
88 { model.sample(std::declval<Vec3d_t<BSDFMODEL>>(), std::declval<Vec2d_t<BSDFMODEL>>(), std::declval<BsdfFlag_t<BSDFMODEL>>()) } -> std::same_as<BsdfSample_t<BSDFMODEL>>;
89
90 //! \brief component has default value
91 { model.sample(std::declval<Vec3d_t<BSDFMODEL>>(), std::declval<Vec2d_t<BSDFMODEL>>()) } -> std::same_as<BsdfSample_t<BSDFMODEL>>;
92
93
94 /******************************************************************/
95 /*! \brief The pdf of the in-out direction combination.
96
97 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c}
98 Value pdf(const Vec3d& in, const Vec3d& out, BsdfFlag component=bsdf_flag::All, unit_t unit=unit_t::Radiance, Mask mask=true) const
99 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
100
101 \param in = the incoming direction (i.e., sampled direction)
102 \param out = the exitant direction (i.e., the given direction)
103 \param component = which reflectance component was sampled [default=bsdf_flag::All]
104 \param unit = unit of computation [default=unit_t::Radiance]
105 \param mask = mask to enable/disable lanes [default=true]
106 \returns the pdf (Value) of sampling the in-out direction conbination.
107 *******************************************************************/
108 { model.pdf(std::declval<Vec3d_t<BSDFMODEL>>(), std::declval<Vec3d_t<BSDFMODEL>>(), std::declval<BsdfFlag_t<BSDFMODEL>>(), std::declval<unit_t>(), std::declval<Mask_t<BSDFMODEL>>()) } -> std::same_as<Value_t<BSDFMODEL>>;
109
110 //! \brief mask has default value
111 { model.pdf(std::declval<Vec3d_t<BSDFMODEL>>(), std::declval<Vec3d_t<BSDFMODEL>>(), std::declval<BsdfFlag_t<BSDFMODEL>>(), std::declval<unit_t>()) } -> std::same_as<Value_t<BSDFMODEL>>;
112
113 //! \brief unit has default template value
114 { model.pdf(std::declval<Vec3d_t<BSDFMODEL>>(), std::declval<Vec3d_t<BSDFMODEL>>(), std::declval<BsdfFlag_t<BSDFMODEL>>()) } -> std::same_as<Value_t<BSDFMODEL>>;
115
116 //! \brief component has default value
117 { model.pdf(std::declval<Vec3d_t<BSDFMODEL>>(), std::declval<Vec3d_t<BSDFMODEL>>()) } -> std::same_as<Value_t<BSDFMODEL>>;
118
119
120 /******************************************************************/
121 /*! \brief the (approximate) hemispherical reflectance of the BSDF. This
122 roughly corresponds to the expected value ratio between bsdf and pdf.
123
124 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c}
125 Spectrum reflectance(const Vec3d& out, BsdfFlag component=bsdf_flag::All, unit_t unit=unit_t::Radiance, Mask mask=true) const
126 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
127
128 \tparam UNIT = Radiance/Importance [default=unit_t::Radiance]
129 \param out = the incident direction
130 \param component = which reflectance component to eval [default=bsdf_flag::All]
131 \param unit = unit of computation [default=unit_t::Radiance]
132 \param mask = mask to enable/disable lanes [default=true]
133 \returns the approximate hemispherical reflectance (Spectrum) of the BSDF
134 *******************************************************************/
135 { model.reflectance(std::declval<Vec3d_t<BSDFMODEL>>(), std::declval<BsdfFlag_t<BSDFMODEL>>(), std::declval<unit_t>(), std::declval<Mask_t<BSDFMODEL>>()) } -> std::same_as<Spectrum_t<BSDFMODEL>>;
136
137 //! \brief UNIT has default template parameter
138 { model.reflectance(std::declval<Vec3d_t<BSDFMODEL>>(), std::declval<BsdfFlag_t<BSDFMODEL>>(), std::declval<unit_t>()) } -> std::same_as<Spectrum_t<BSDFMODEL>>;
139
140 //! \brief mask has default value
141 { model.reflectance(std::declval<Vec3d_t<BSDFMODEL>>(), std::declval<BsdfFlag_t<BSDFMODEL>>()) } -> std::same_as<Spectrum_t<BSDFMODEL>>;
142
143 //! \brief component has default value
144 { model.reflectance(std::declval<Vec3d_t<BSDFMODEL>>()) } -> std::same_as<Spectrum_t<BSDFMODEL>>;
145
146 };
147
148
149 /********************************************************************/
150 /*! \brief bsdfmodel archetype for concept checking
151
152 \tparam CONF = config to check for. Default = archetype::config
153 ********************************************************************/
154 namespace archetype {
155 template<typename CONF=config> requires concepts::config<CONF>
157 {
158 using Config = CONF;
159 static constexpr string_literal name = "archetype::bsdfmodel";
160 Spectrum_t<Config> eval(Vec3d_t<Config>, Vec3d_t<Config>, BsdfFlag_t<Config> = bsdf_flag::All, unit_t = unit_t::Radiance, Mask_t<Config> = true) const;
161 BsdfSample_t<Config> sample(Vec3d_t<Config>, Vec2d_t<Config>, BsdfFlag_t<Config> = bsdf_flag::All, unit_t = unit_t::Radiance, Mask_t<Config> = true) const;
162 Value_t<Config> pdf(Vec3d_t<Config>, Vec3d_t<Config>, BsdfFlag_t<Config> = bsdf_flag::All, unit_t = unit_t::Radiance, Mask_t<Config> = true) const;
163 Spectrum_t<Config> reflectance(Vec3d_t<Config>, BsdfFlag_t<Config> = bsdf_flag::All, unit_t = unit_t::Radiance, Mask_t<Config> = true) const;
164 };
165 } // end archetype namespace
166
168
169 } // end concepts namespace
170} // end bbm namespace
171
172#endif /* _BBM_BSDFMODEL_CONCEPT_H_ */
173
All BBM methods are defined to operate on a variety of value types and spectrum types....
bsdfmodel concept
Definition: bsdfmodel.h:33
config concept
Definition: config.h:31
has_config
Definition: config.h:53
A named class is a class that contains a static constexpr string_literal name.
Definition: named.h:19
config contract
named (class) concept.
#define BBM_CHECK_CONCEPT(CONCEPTNAME, CLASSNAME,...)
Check a class for a concept with bbm::concepts::archetypes in the namespace.
Definition: macro.h:35
Definition: aggregatebsdf.h:29
typename get_config< T >::Value Value_t
Definition: config.h:67
typename get_config< T >::Spectrum Spectrum_t
Definition: config.h:68
unit_t
Light Unit.
Definition: unit.h:21
Definition: bsdfmodel.h:157
Value_t< Config > pdf(Vec3d_t< Config >, Vec3d_t< Config >, BsdfFlag_t< Config >=bsdf_flag::All, unit_t=unit_t::Radiance, Mask_t< Config >=true) const
Spectrum_t< Config > eval(Vec3d_t< Config >, Vec3d_t< Config >, BsdfFlag_t< Config >=bsdf_flag::All, unit_t=unit_t::Radiance, Mask_t< Config >=true) const
BsdfSample_t< Config > sample(Vec3d_t< Config >, Vec2d_t< Config >, BsdfFlag_t< Config >=bsdf_flag::All, unit_t=unit_t::Radiance, Mask_t< Config >=true) const
static constexpr string_literal name
Definition: bsdfmodel.h:159
CONF Config
Definition: bsdfmodel.h:158
Spectrum_t< Config > reflectance(Vec3d_t< Config >, BsdfFlag_t< Config >=bsdf_flag::All, unit_t=unit_t::Radiance, Mask_t< Config >=true) const
Definition: string_literal.h:16
Light unit: Radiance or Importance.