pub type RgbD = glam::f64::DVec3;
pub type RgbF = glam::f32::Vec3;
pub type Vec3d = glam::f64::DVec3;
pub type Vec2d = glam::f64::DVec2;
pub struct SampleIncomingResponse {
pub omega_i: Vec3d,
pub bsdf: RgbD,
pub emission: RgbD,
pub pdf: f64,
}
pub struct SampleOutgoingResponse {
pub omega_o: Vec3d,
pub bsdf: RgbD,
pub adjoint_bsdf: RgbD,
pub pdf: f64,
}
pub struct SampleEmissionResponse {
pub omega_o: Vec3d,
pub emission: RgbD,
pub pdf: f64,
}
pub trait BSDF {
fn sample_incoming(&self, omega_o: Vec3d, rdf: Vec3d) -> SampleIncomingResponse;
fn sample_outgoing(&self, omega_i: Vec3d, rdf: Vec3d) -> SampleOutgoingResponse {
assert!(omega_i.is_normalized());
let response = self.sample_incoming(omega_i, rdf);
SampleOutgoingResponse {
omega_o: response.omega_i,
bsdf: response.bsdf,
adjoint_bsdf: response.bsdf,
pdf: response.pdf,
}
}
fn evaluate(&self, omega_o: Vec3d, omega_i: Vec3d) -> RgbD;
fn sample_incoming_pdf(&self, omega_o: Vec3d, omega_i: Vec3d) -> f64;
fn sample_outgoing_pdf(&self, omega_o: Vec3d, omega_i: Vec3d) -> f64 {
assert!(omega_o.is_normalized());
assert!(omega_i.is_normalized());
self.sample_incoming_pdf(omega_i, omega_o)
}
fn emission(&self, omega_o: Vec3d) -> RgbD {
assert!(omega_o.is_normalized());
RgbD::ZERO
}
fn sample_emission_pdf(&self, omega_o: Vec3d) -> f64 {
assert!(omega_o.is_normalized());
0.0
}
fn sample_emission(&self, _rdf: Vec2d) -> SampleEmissionResponse {
SampleEmissionResponse {
omega_o: Vec3d::ZERO,
emission: RgbD::ZERO,
pdf: 0.0,
}
}
fn base_color(&self, omega_o: Vec3d) -> RgbD;
}
#[cfg(test)]
pub trait TransmissiveBsdf: BSDF {
fn ior(&self) -> f64;
}