pub(crate) mod texture2d;
pub use texture2d::*;
pub(crate) mod texture3d;
pub use texture3d::*;
pub use crate::prelude::f16;
use crate::Srgba;
#[allow(missing_docs)]
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Interpolation {
Nearest,
#[default]
Linear,
CubicSpline,
}
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Mipmap {
pub filter: Interpolation,
pub max_levels: u32,
pub max_ratio: u32,
}
impl Default for Mipmap {
fn default() -> Self {
Self {
filter: Interpolation::Linear,
max_levels: u32::MAX,
max_ratio: 1,
}
}
}
#[allow(missing_docs)]
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Wrapping {
Repeat,
MirroredRepeat,
ClampToEdge,
}
#[derive(Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum TextureData {
RU8(Vec<u8>),
RgU8(Vec<[u8; 2]>),
RgbU8(Vec<[u8; 3]>),
RgbaU8(Vec<[u8; 4]>),
RF16(Vec<f16>),
RgF16(Vec<[f16; 2]>),
RgbF16(Vec<[f16; 3]>),
RgbaF16(Vec<[f16; 4]>),
RF32(Vec<f32>),
RgF32(Vec<[f32; 2]>),
RgbF32(Vec<[f32; 3]>),
RgbaF32(Vec<[f32; 4]>),
}
impl std::fmt::Debug for TextureData {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::RU8(values) => write!(f, "R u8 ({:?})", values.len()),
Self::RgU8(values) => write!(f, "RG u8 ({:?})", values.len()),
Self::RgbU8(values) => write!(f, "RGB u8 ({:?})", values.len()),
Self::RgbaU8(values) => write!(f, "RGBA u8 ({:?})", values.len()),
Self::RF16(values) => write!(f, "R f16 ({:?})", values.len()),
Self::RgF16(values) => write!(f, "RG f16 ({:?})", values.len()),
Self::RgbF16(values) => write!(f, "RGB f16 ({:?})", values.len()),
Self::RgbaF16(values) => write!(f, "RGBA f16 ({:?})", values.len()),
Self::RF32(values) => write!(f, "R f32 ({:?})", values.len()),
Self::RgF32(values) => write!(f, "RG f32 ({:?})", values.len()),
Self::RgbF32(values) => write!(f, "RGB f32 ({:?})", values.len()),
Self::RgbaF32(values) => write!(f, "RGBA f32 ({:?})", values.len()),
}
}
}
impl TextureData {
pub fn to_linear_srgb(&mut self) {
match self {
TextureData::RgbU8(data) => data.iter_mut().for_each(|color| {
*color = Srgba::from(Srgba::from(*color).to_linear_srgb()).into();
}),
TextureData::RgbaU8(data) => data.iter_mut().for_each(|color| {
*color = Srgba::from(Srgba::from(*color).to_linear_srgb()).into();
}),
_ => {}
};
}
pub fn to_color(&mut self) {
if let TextureData::RU8(data) = self {
*self = TextureData::RgbU8(data.iter().map(|color| [*color, *color, *color]).collect())
};
}
}