pub type MaterialId = u16;
#[derive(Debug, Clone)]
pub struct OpticalProps {
pub base_color: [f32; 4],
pub metallic: f32,
pub roughness: f32,
pub opacity: f32,
pub refractive_index: f32,
pub dispersion: f32,
pub absorption_color: [f32; 3],
pub absorption_density: f32,
pub emissivity: f32,
pub emission_color: [f32; 3],
pub emission_intensity: f32,
pub scatter_distance: f32,
pub scatter_color: [f32; 3],
}
impl Default for OpticalProps {
fn default() -> Self {
Self {
base_color: [0.5, 0.5, 0.5, 1.0],
metallic: 0.0,
roughness: 0.8,
opacity: 1.0,
refractive_index: 1.5,
dispersion: 0.0,
absorption_color: [1.0, 1.0, 1.0],
absorption_density: 0.0,
emissivity: 0.9,
emission_color: [0.0, 0.0, 0.0],
emission_intensity: 0.0,
scatter_distance: 0.0,
scatter_color: [1.0, 1.0, 1.0],
}
}
}
#[derive(Debug, Clone)]
pub struct StructuralProps {
pub density: f32,
pub yield_strength: f32,
pub impact_toughness: f32,
pub plasticity: f32,
pub abrasion_resistance: f32,
pub compaction: Option<CompactionDef>,
}
impl Default for StructuralProps {
fn default() -> Self {
Self {
density: 1000.0,
yield_strength: 0.0,
impact_toughness: 0.5,
plasticity: 0.0,
abrasion_resistance: 0.5,
compaction: None,
}
}
}
#[derive(Debug, Clone)]
pub struct CompactionDef {
pub pressure_threshold: f32,
pub compaction_rate: f32,
pub product: Option<MaterialId>,
}
#[derive(Debug, Clone)]
pub struct ThermalProps {
pub specific_heat: f32,
pub thermal_conductivity: f32,
pub ignition_point: Option<f32>,
pub melting_point: Option<f32>,
pub vaporisation_point: Option<f32>,
pub freezing_point: Option<f32>,
pub melt_product: Option<MaterialId>,
pub freeze_product: Option<MaterialId>,
pub burn_product: Option<MaterialId>,
pub combustion_energy: f32,
pub emission_onset_temperature: Option<f32>,
}
impl Default for ThermalProps {
fn default() -> Self {
Self {
specific_heat: 1000.0,
thermal_conductivity: 1.0,
ignition_point: None,
melting_point: None,
vaporisation_point: None,
freezing_point: None,
melt_product: None,
freeze_product: None,
burn_product: None,
combustion_energy: 0.0,
emission_onset_temperature: None,
}
}
}
#[derive(Debug, Clone)]
pub struct ChemicalProps {
pub ph: f32,
pub acid_solubility: f32,
pub base_solubility: f32,
pub oxidation_resistance: f32,
pub corrosion_product: Option<MaterialId>,
}
impl Default for ChemicalProps {
fn default() -> Self {
Self {
ph: 7.0,
acid_solubility: 0.0,
base_solubility: 0.0,
oxidation_resistance: 1.0,
corrosion_product: None,
}
}
}
#[derive(Debug, Clone)]
pub struct HydraulicProps {
pub porosity: f32,
pub permeability: f32,
pub saturation_ignition_modifier: f32,
pub saturation_conductivity_modifier: f32,
}
impl Default for HydraulicProps {
fn default() -> Self {
Self {
porosity: 0.0,
permeability: 0.0,
saturation_ignition_modifier: 0.0,
saturation_conductivity_modifier: 0.0,
}
}
}
#[derive(Debug, Clone)]
pub struct PhaseProps {
pub state: PhaseState,
pub repose_angle: f32,
pub viscosity: f32,
pub buoyancy: f32,
pub relaxation_time: f32,
pub surface_tension: f32,
}
impl Default for PhaseProps {
fn default() -> Self {
Self {
state: PhaseState::Solid,
repose_angle: 90.0,
viscosity: 0.0,
buoyancy: 1.0,
relaxation_time: 1.0,
surface_tension: 0.0,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum PhaseState {
Solid,
Granular,
Liquid,
Gas,
}
#[derive(Debug, Clone)]
pub struct AcousticProps {
pub propagation_speed: f32,
pub damping: f32,
pub reflectance: f32,
}
impl Default for AcousticProps {
fn default() -> Self {
Self {
propagation_speed: 343.0,
damping: 0.1,
reflectance: 0.5,
}
}
}
#[derive(Debug, Clone)]
pub struct MaterialDef {
pub name: String,
pub structural: StructuralProps,
pub thermal: ThermalProps,
pub chemical: ChemicalProps,
pub hydraulic: HydraulicProps,
pub phase: PhaseProps,
pub acoustic: AcousticProps,
pub optical: OpticalProps,
}
impl Default for MaterialDef {
fn default() -> Self {
Self {
name: "unnamed".to_string(),
structural: StructuralProps::default(),
thermal: ThermalProps::default(),
chemical: ChemicalProps::default(),
hydraulic: HydraulicProps::default(),
phase: PhaseProps::default(),
acoustic: AcousticProps::default(),
optical: OpticalProps::default(),
}
}
}