use crate::MaterialId;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum MaterialKind {
DotGrid,
Grid,
Checkerboard,
Stripe,
Noise,
Beam,
Sparkle,
ConicSweep,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum MaterialCatalogTextureKind {
BlueNoise64x64R8,
Bayer8x8R8,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum MaterialBindingShape {
#[default]
ParamsOnly,
ParamsPlusCatalogTexture { texture: MaterialCatalogTextureKind },
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct MaterialDescriptor {
pub kind: MaterialKind,
#[serde(default)]
pub binding: MaterialBindingShape,
}
impl MaterialDescriptor {
pub const fn new(kind: MaterialKind) -> Self {
Self {
kind,
binding: MaterialBindingShape::ParamsOnly,
}
}
pub const fn sampled_with_catalog_texture(
kind: MaterialKind,
texture: MaterialCatalogTextureKind,
) -> Self {
Self {
kind,
binding: MaterialBindingShape::ParamsPlusCatalogTexture { texture },
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MaterialRegistrationError {
Unsupported,
}
pub trait MaterialService {
fn register_material(
&mut self,
desc: MaterialDescriptor,
) -> Result<MaterialId, MaterialRegistrationError>;
fn unregister_material(&mut self, id: MaterialId) -> bool;
}