use super::{absorption::AbsorptionTensor, dispersion::DispersionModel};
use glam::Vec3;
mod amethyst_through_citrine;
mod ametrine;
mod andalusite_through_glass;
mod aquamarine_through_citrine;
pub mod body_color;
mod custom;
mod diamond_through_emerald;
mod garnets_grossular_and_andradite;
mod garnets_pyrope_through_spessartine;
mod lookup;
mod optics;
mod peridot_through_benitoite;
mod rutile;
mod spinel_through_tourmaline;
mod tanzanite_through_cubic_zirconia;
#[cfg(test)]
mod tests;
mod zircon_through_topaz;
mod zoned;
pub use ametrine::{AMETRINE_AMETHYST_FE_PPMA, AMETRINE_CITRINE_FE_PPMA, ametrine_zoning};
pub use zoned::{ZONE_SWATCH_FALLBACK_MODEL_WIDTH, zone_swatches};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum CrystalSystem {
Cubic,
Tetragonal,
Hexagonal,
Trigonal,
Orthorhombic,
Monoclinic,
Triclinic,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum OpticalCharacter {
Isotropic,
UniaxialPositive,
UniaxialNegative,
BiaxialPositive,
BiaxialNegative,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum AbsorptionUnit {
#[default]
ModelUnit,
PerMm,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct GemMaterial {
pub name: String,
pub crystal_system: CrystalSystem,
pub optical_character: OpticalCharacter,
pub dispersion: DispersionModel,
pub birefringence_delta: f32,
pub absorption: AbsorptionTensor,
pub c_axis: Vec3,
pub biaxial_delta_beta_alpha: Option<f32>,
pub scattering_sigma_s: f32,
pub scattering_g: f32,
pub edge_rounding_radius: f32,
pub absorption_path_scale: f32,
#[cfg_attr(feature = "serde", serde(default))]
pub absorption_unit: AbsorptionUnit,
pub uniaxial_extraordinary_dispersion: Option<DispersionModel>,
#[cfg_attr(feature = "serde", serde(skip))]
pub zoning: Option<crate::optics::zoning::ZonedAbsorption>,
}
impl GemMaterial {
#[must_use]
pub fn all_materials() -> Vec<Self> {
let mut materials = Self::built_in_materials_diamond_through_emerald();
materials.extend(Self::built_in_materials_zircon_through_topaz());
materials.extend(Self::built_in_materials_spinel_through_tourmaline());
materials.extend(Self::built_in_materials_tanzanite_through_cubic_zirconia());
materials.extend(Self::built_in_materials_aquamarine_through_citrine());
materials.extend(Self::built_in_materials_amethyst_through_citrine());
materials.push(Self::built_in_material_ametrine());
materials.extend(Self::built_in_materials_garnets_pyrope_through_spessartine());
materials.extend(Self::built_in_materials_garnet_color_change());
materials.extend(Self::built_in_materials_garnets_grossular_and_andradite());
materials.extend(Self::built_in_materials_peridot_through_benitoite());
materials.extend(Self::built_in_materials_andalusite_through_glass());
materials.push(Self::built_in_material_rutile());
materials
}
}