UTD Edge Free-Space Diffractions BSDF

A UTD-based edge diffractions BSDF [Steinberg and Pharr, 2025]. Implements sampling and evaluation.


class free_space_diffraction_t

Free-space diffraction angular scattering function.

Public Types

using eval_ret_t = std::vector<diffracting_edge_t>

Public Functions

free_space_diffraction_t(const ads::ads_t *ads, const pqvec3_t &interaction_wp, const frame_t &interaction_region_frame, const pqvec3_t &interaction_region_size, const dir3_t &wi, wavenumber_t k, const ads::intersection_record_t::edges_container_t &edges) noexcept

Construct a new free space diffraction object.

Parameters:
  • k – wavenumber

  • edges – edges accessor

free_space_diffraction_t(free_space_diffraction_t&&) noexcept = default
inline bool empty() const noexcept

Returns TRUE if the aperture is empty.

sample_ret_t sample(const ads::ads_t *ads, const pqvec3_t &src, sampler::sampler_t &sampler) const noexcept

Samples the free-space diffraction BSDF. Returned position and direction are in world coordinates.

Parameters:

src – source point in world coordinates

eval_ret_t f(const pqvec3_t &src, const pqvec3_t &dst) const noexcept

Evaluates the free-space diffraction BSDF.

Parameters:
  • src – source point in world coordinates

  • dst – target point in world coordinates

angle_sampling_pd_t pdf(const pqvec3_t &src, const dir3_t &wo) const noexcept

Queries the sampling density of the free-space diffraction BSDF.

Parameters:
  • src – source point in world coordinates

  • wo – world direction from interation point

struct diffracting_edge_t

Public Members

utd::UTD_ret_t utd
ads::tuid_t edge_idx
pqvec3_t p
dir3_t wi
dir3_t wo
length_t ri
length_t ro
struct sample_ret_t

Public Members

pqvec3_t diffraction_wp
dir3_t wo = {0, 0, 1}
std::optional<intersection_edge_t> intersection
bool is_direct
angle_sampling_pd_t dpd = angle_sampling_pd_t::discrete(0)
f_t weight