#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum FilterMode {
Nearest,
#[default]
Linear,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum AddressMode {
Repeat,
MirrorRepeat,
#[default]
ClampToEdge,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum CompareFunction {
Less,
LessEqual,
Greater,
GreaterEqual,
Equal,
NotEqual,
Always,
Never,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Sampler {
pub mag_filter: FilterMode,
pub min_filter: FilterMode,
pub mip_filter: FilterMode,
pub address_u: AddressMode,
pub address_v: AddressMode,
pub address_w: AddressMode,
pub anisotropy: u8,
pub compare: Option<CompareFunction>,
}
impl Sampler {
#[inline]
pub const fn new() -> Self {
Self {
mag_filter: FilterMode::Linear,
min_filter: FilterMode::Linear,
mip_filter: FilterMode::Linear,
address_u: AddressMode::ClampToEdge,
address_v: AddressMode::ClampToEdge,
address_w: AddressMode::ClampToEdge,
anisotropy: 1,
compare: None,
}
}
#[inline]
pub const fn filters(
mut self,
mag_filter: FilterMode,
min_filter: FilterMode,
mip_filter: FilterMode,
) -> Self {
self.mag_filter = mag_filter;
self.min_filter = min_filter;
self.mip_filter = mip_filter;
self
}
#[inline]
pub const fn address_modes(
mut self,
address_u: AddressMode,
address_v: AddressMode,
address_w: AddressMode,
) -> Self {
self.address_u = address_u;
self.address_v = address_v;
self.address_w = address_w;
self
}
#[inline]
pub const fn anisotropy(mut self, anisotropy: u8) -> Self {
self.anisotropy = if anisotropy < 1 {
1
} else if anisotropy > 16 {
16
} else {
anisotropy
};
self
}
#[inline]
pub const fn compare(mut self, compare: Option<CompareFunction>) -> Self {
self.compare = compare;
self
}
}
impl Default for Sampler {
#[inline]
fn default() -> Self {
Self::new()
}
}