pbrt/src/core/medium.rs

58 lines
1.4 KiB
Rust

use std::sync::Arc;
#[derive(Debug, Clone)]
pub struct HomogeneousMedium;
#[derive(Debug, Clone)]
pub struct GridMedium;
#[derive(Debug, Clone)]
pub struct RGBGridMedium;
#[derive(Debug, Clone)]
pub struct CloudMedium;
#[derive(Debug, Clone)]
pub struct NanoVDBMedium;
#[derive(Debug, Clone)]
pub enum Medium {
Homogeneous(HomogeneousMedium),
Grid(GridMedium),
RGBGrid(RGBGridMedium),
Cloud(CloudMedium),
NanoVDB(NanoVDBMedium),
}
#[derive(Default, Clone)]
pub struct MediumInterface {
pub inside: Option<Arc<Medium>>,
pub outside: Option<Arc<Medium>>,
}
impl MediumInterface {
pub fn new(inside: Option<Arc<Medium>>, outside: Option<Arc<Medium>>) -> Self {
Self { inside, outside }
}
pub fn is_medium_transition(&self) -> bool {
if let Some(ref inside) = self.inside {
// self.inside == Some
if let Some(ref outside) = self.outside {
// self.outside == Some
let pi = inside as *const _ as *const usize;
let po = outside as *const _ as *const usize;
pi != po
} else {
// self.outside == None
true
}
} else {
// self.inside == None
if let Some(ref _outside) = self.outside {
// self.outside == Some
true
} else {
// self.outside == None
false
}
}
}
}