nuclear@2: #include "brdf.h" nuclear@2: #include "erebus_impl.h" nuclear@2: nuclear@2: // ---- class Reflectance ---- nuclear@2: Reflectance::Reflectance() nuclear@2: { nuclear@2: } nuclear@2: nuclear@2: float Reflectance::sample(const Vector3 &norm, const Vector3 &outdir, Vector3 *indir) const nuclear@2: { nuclear@2: *indir = sample_dir(norm, outdir); nuclear@2: return eval(norm, outdir, *indir); nuclear@2: } nuclear@2: nuclear@2: // --- class LambertRefl --- nuclear@2: Vector3 LambertRefl::sample_dir(const Vector3 &norm, const Vector3 &outdir) const nuclear@2: { nuclear@2: Vector3 dir = Vector3{randf(-1, 1), randf(-1, 1), randf(-1, 1)}.normalized(); nuclear@2: return dot_product(dir, norm) < 0.0 ? -dir : dir; nuclear@2: } nuclear@2: nuclear@2: float LambertRefl::eval(const Vector3 &norm, const Vector3 &outdir, const Vector3 &indir) const nuclear@2: { nuclear@2: return dot_product(norm, outdir); nuclear@2: }