pub mod solid;
#[cfg(feature = "gradient")]
pub mod gradient;
use crate::MeshUniforms;
const INITIAL_INDEX_COUNT: usize = 256;
const INITIAL_VERTEX_COUNT: usize = 256;
fn instance_uniforms_layout(device: &wgpu::Device) -> wgpu::BindGroupLayout {
device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor {
label: Some("rootvg-mesh instance uniforms layout"),
entries: &[InstanceUniforms::entry()],
})
}
fn color_target_state(format: wgpu::TextureFormat) -> [Option<wgpu::ColorTargetState>; 1] {
[Some(wgpu::ColorTargetState {
format,
blend: Some(wgpu::BlendState::ALPHA_BLENDING),
write_mask: wgpu::ColorWrites::ALL,
})]
}
#[derive(Debug, Clone, Copy, bytemuck::Pod, bytemuck::Zeroable)]
#[repr(C)]
struct InstanceUniforms {
inner: MeshUniforms,
_padding1: [f32; 32],
_padding2: [f32; 23],
}
impl InstanceUniforms {
pub fn new(inner: MeshUniforms) -> Self {
#[allow(invalid_value)]
let (_padding1, _padding2): ([f32; 32], [f32; 23]) = unsafe {
(
std::mem::MaybeUninit::uninit().assume_init(),
std::mem::MaybeUninit::uninit().assume_init(),
)
};
Self {
inner,
_padding1,
_padding2,
}
}
fn entry() -> wgpu::BindGroupLayoutEntry {
wgpu::BindGroupLayoutEntry {
binding: 0,
visibility: wgpu::ShaderStages::VERTEX_FRAGMENT,
ty: wgpu::BindingType::Buffer {
ty: wgpu::BufferBindingType::Uniform,
has_dynamic_offset: true,
min_binding_size: wgpu::BufferSize::new(std::mem::size_of::<Self>() as u64),
},
count: None,
}
}
pub fn min_size() -> Option<wgpu::BufferSize> {
wgpu::BufferSize::new(std::mem::size_of::<Self>() as u64)
}
}