use crate::SamplerBindingType::Filtering;
use crate::*;
impl Default for Material {
#[inline(always)]
fn default() -> Material {
Material {
albedo: Vector4::new(1.0, 1.0, 1.0, 1.0),
roughness: 0.5,
reflectance: 0.25,
ambient_ratio: 0.02,
background_ratio: 0.0,
alpha_blend: false,
}
}
}
impl Material {
#[inline(always)]
pub fn buffer(&self, device: &Device) -> BufferHandler {
let material_data: [f32; 8] = [
self.albedo[0] as f32,
self.albedo[1] as f32,
self.albedo[2] as f32,
self.albedo[3] as f32,
self.roughness as f32,
self.reflectance as f32,
self.ambient_ratio as f32,
self.background_ratio as f32,
];
BufferHandler::from_slice(&material_data, device, BufferUsages::UNIFORM)
}
#[doc(hidden)]
#[inline(always)]
pub fn bgl_entry() -> PreBindGroupLayoutEntry {
PreBindGroupLayoutEntry {
visibility: ShaderStages::FRAGMENT,
ty: BindingType::Buffer {
ty: BufferBindingType::Uniform,
has_dynamic_offset: false,
min_binding_size: None,
},
count: None,
}
}
}
impl Default for PolygonState {
#[inline(always)]
fn default() -> PolygonState {
PolygonState {
matrix: Matrix4::identity(),
material: Default::default(),
texture: None,
backface_culling: true,
}
}
}
impl PolygonState {
#[inline(always)]
pub fn matrix_buffer(&self, device: &Device) -> BufferHandler {
let matrix_data: [[f32; 4]; 4] = self.matrix.cast::<f32>().unwrap().into();
BufferHandler::from_slice(&matrix_data, device, BufferUsages::UNIFORM)
}
#[doc(hidden)]
#[inline(always)]
pub fn matrix_bgl_entry() -> PreBindGroupLayoutEntry {
PreBindGroupLayoutEntry {
visibility: ShaderStages::VERTEX | ShaderStages::FRAGMENT,
ty: BindingType::Buffer {
ty: BufferBindingType::Uniform,
has_dynamic_offset: false,
min_binding_size: None,
},
count: None,
}
}
#[inline(always)]
pub fn material_buffer(&self, device: &Device) -> BufferHandler { self.material.buffer(device) }
#[doc(hidden)]
#[inline(always)]
pub fn material_bgl_entry() -> PreBindGroupLayoutEntry { Material::bgl_entry() }
pub fn textureview_and_sampler(&self, device: &Device) -> (TextureView, Sampler) {
let texture = self.texture.as_ref().unwrap();
let view = texture.create_view(&Default::default());
let sampler = device.create_sampler(&SamplerDescriptor {
mag_filter: FilterMode::Linear,
min_filter: FilterMode::Nearest,
mipmap_filter: MipmapFilterMode::Nearest,
lod_min_clamp: 0.0,
lod_max_clamp: 100.0,
..Default::default()
});
(view, sampler)
}
#[doc(hidden)]
#[inline(always)]
pub fn textureview_bgl_entry() -> PreBindGroupLayoutEntry {
PreBindGroupLayoutEntry {
visibility: ShaderStages::FRAGMENT,
ty: BindingType::Texture {
view_dimension: TextureViewDimension::D2,
sample_type: TextureSampleType::Float { filterable: true },
multisampled: false,
},
count: None,
}
}
#[doc(hidden)]
#[inline(always)]
pub fn sampler_bgl_entry() -> PreBindGroupLayoutEntry {
PreBindGroupLayoutEntry {
visibility: ShaderStages::FRAGMENT,
ty: BindingType::Sampler(Filtering),
count: None,
}
}
}