use derive_builder::Builder;
pub use image::ImageFormat;
pub use vulkano::sampler::BorderColor;
use vulkano::sampler::{
Filter as vkFilter, SamplerAddressMode, SamplerCreateInfo, SamplerMipmapMode,
};
#[derive(Clone, Copy, Debug)]
pub enum Format {
R8,
RGBA8,
RGBA16,
}
#[derive(Clone, Copy, Debug)]
pub enum Filter {
Nearest,
Linear,
}
#[derive(Clone, Copy, Debug)]
pub enum AddressMode {
Repeat,
Mirrored,
ClampToEdge,
ClampToBorder,
}
#[derive(Debug, Builder, Clone)]
#[builder(setter(into))]
pub struct Sampler {
#[builder(setter(into), default = "Filter::Nearest")]
pub mag_filter: Filter,
#[builder(setter(into), default = "Filter::Linear")]
pub min_filter: Filter,
#[builder(setter(into), default = "Filter::Nearest")]
pub mipmap_mode: Filter,
#[builder(setter(into), default = "[AddressMode::ClampToBorder; 3]")]
pub address_mode: [AddressMode; 3],
#[builder(setter(into), default = "BorderColor::FloatTransparentBlack")]
pub border_color: BorderColor,
}
#[derive(Clone, Debug)]
pub struct TextureSettings {
pub srgb: bool,
pub sampler: Sampler,
}
impl Default for Sampler {
fn default() -> Self {
Self {
mag_filter: Filter::Nearest,
min_filter: Filter::Linear,
mipmap_mode: Filter::Nearest,
address_mode: [AddressMode::ClampToBorder; 3],
border_color: BorderColor::FloatTransparentBlack,
}
}
}
impl Sampler {
pub fn to_vulkano(&self) -> SamplerCreateInfo {
SamplerCreateInfo {
mag_filter: match self.mag_filter {
Filter::Nearest => vkFilter::Nearest,
Filter::Linear => vkFilter::Linear,
},
min_filter: match self.mag_filter {
Filter::Nearest => vkFilter::Nearest,
Filter::Linear => vkFilter::Linear,
},
mipmap_mode: match self.mag_filter {
Filter::Nearest => SamplerMipmapMode::Nearest,
Filter::Linear => SamplerMipmapMode::Linear,
},
address_mode: [
match self.address_mode[0] {
AddressMode::Repeat => SamplerAddressMode::Repeat,
AddressMode::Mirrored => SamplerAddressMode::MirroredRepeat,
AddressMode::ClampToEdge => SamplerAddressMode::ClampToEdge,
AddressMode::ClampToBorder => SamplerAddressMode::ClampToBorder,
},
match self.address_mode[1] {
AddressMode::Repeat => SamplerAddressMode::Repeat,
AddressMode::Mirrored => SamplerAddressMode::MirroredRepeat,
AddressMode::ClampToEdge => SamplerAddressMode::ClampToEdge,
AddressMode::ClampToBorder => SamplerAddressMode::ClampToBorder,
},
match self.address_mode[2] {
AddressMode::Repeat => SamplerAddressMode::Repeat,
AddressMode::Mirrored => SamplerAddressMode::MirroredRepeat,
AddressMode::ClampToEdge => SamplerAddressMode::ClampToEdge,
AddressMode::ClampToBorder => SamplerAddressMode::ClampToBorder,
},
],
border_color: self.border_color,
..Default::default()
}
}
}
impl Default for TextureSettings {
fn default() -> Self {
Self {
srgb: true,
sampler: Sampler::default(),
}
}
}
impl TextureSettings {
pub fn srgb(mut self, srgb: bool) -> Self {
self.srgb = srgb;
self
}
pub fn sampler(mut self, sampler: Sampler) -> Self {
self.sampler = sampler;
self
}
}