use super::*;
#[derive(Clone, Debug, Copy, PartialEq, Eq, Hash)]
pub struct TextureId(id::Id);
impl TextureId {
pub fn next() -> Self {
Self(id::next())
}
}
#[derive(Clone, Copy, Debug, PartialEq, Hash, Default)]
pub enum FilterMode {
Linear,
#[default]
Nearest,
}
#[derive(Debug, PartialEq, Eq, Clone, Copy, Default)]
pub enum TextureAccess {
#[default]
Static,
RenderTarget,
}
#[derive(Debug, Copy, Clone, PartialEq, Default)]
pub enum TextureTarget {
#[default]
Texture2D,
}
#[repr(u8)]
#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash, Default)]
pub enum TextureFormat {
#[default]
Rgba8,
Rgb8,
Depth,
Alpha,
}
impl TextureFormat {
pub fn size<T: From<u32> + std::ops::Mul<Output = T>>(self, dimensions: Size<T>) -> T {
let area = dimensions.area();
match self {
TextureFormat::Rgb8 => T::from(3) * area,
TextureFormat::Rgba8 => T::from(4) * area,
TextureFormat::Depth => T::from(4) * area,
TextureFormat::Alpha => T::from(1) * area,
}
}
}
#[derive(Debug, PartialEq, Eq, Clone, Copy, Default)]
pub enum TextureWrap {
#[default]
Clamp,
Repeat,
Mirror,
}
#[derive(Debug, Copy, Clone)]
pub struct Texture<T> {
pub data: T,
pub size: Size<u32>,
pub access: TextureAccess,
pub target: TextureTarget,
pub format: TextureFormat,
pub wrap: TextureWrap,
pub min_filter: FilterMode,
pub mag_filter: FilterMode,
}
impl<T: Default> Default for Texture<T> {
fn default() -> Self {
Texture {
data: T::default(),
access: TextureAccess::default(),
target: TextureTarget::default(),
format: TextureFormat::default(),
wrap: TextureWrap::default(),
min_filter: FilterMode::default(),
mag_filter: FilterMode::default(),
size: Size::default(),
}
}
}