1#ifndef _BBM_MASKINGSHADOWING_VANGINNEKEN_H_
2#define _BBM_MASKINGSHADOWING_VANGINNEKEN_H_
21 namespace maskingshadowing {
31 template<
typename CONF>
requires concepts::config<CONF>
37 static constexpr auto eval(
const NDF& ndf,
const Vec3d& in,
const Vec3d& out,
const Vec3d& m, Mask mask=
true)
39 using return_t =
decltype(ndf.G1(in, m, mask));
42 mask &= (bbm::dot(in, m) > 0) && (bbm::dot(out, m) > 0);
45 if(bbm::none(mask))
return return_t(0);
51 return_t lambda = 4.41 * phi / (4.41 * phi + 1.0);
54 auto gi = ndf.G1(in, m, mask);
55 auto go = ndf.G1(out, m, mask);
61 auto maxg = bbm::max(gi, go);
62 auto ming = bbm::min(gi, go);
67 auto denom = maxg + lambda*(ming - gio);
70 mask &= (denom > Constants::Epsilon());
All necessary include files for defining new joint masking and shadowing functions.
maskingshadowing concept
Definition: maskingshadowing.h:24
matching_config concept
Definition: config.h:63
ndf concept
Definition: ndf.h:29
#define BBM_CHECK_CONCEPT(CONCEPTNAME, CLASSNAME,...)
Check a class for a concept with bbm::concepts::archetypes in the namespace.
Definition: macro.h:35
T & phi(vec2d< T > &v)
Definition: spherical.h:39
Definition: aggregatebsdf.h:29
constexpr auto select(MASK &&mask, const A &a, const A &b)
Definition: backbone.h:255
Heigh correlated joint masking and shadowing following Vanginneken et al.
Definition: vanginneken.h:33
static constexpr auto eval(const NDF &ndf, const Vec3d &in, const Vec3d &out, const Vec3d &m, Mask mask=true)
Definition: vanginneken.h:37