mod animation;
mod collision;
mod culling;
mod material;
mod model;
mod monolib;
mod pipeline;
mod renderer;
mod sampler;
mod shader;
mod shadergen;
mod skeleton;
mod texture;
pub use collision::{load_collisions, Collision};
pub use model::{load_map, load_model, Mesh, Model, ModelBuffers, ModelGroup, Models};
pub use monolib::MonolibShaderTextures;
pub use renderer::{CameraData, RenderMode, Renderer};
use encase::{internal::WriteInto, ShaderSize, ShaderType, StorageBuffer, UniformBuffer};
use wgpu::util::DeviceExt;
const COLOR_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Rgba8Unorm;
const GBUFFER_COLOR_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Rgba8Unorm;
const GBUFFER_NORMAL_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Rgb10a2Unorm;
const DEPTH_STENCIL_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Depth24PlusStencil8;
pub const FEATURES: wgpu::Features =
wgpu::Features::TEXTURE_COMPRESSION_BC.union(wgpu::Features::POLYGON_MODE_LINE);
pub const LIMITS: wgpu::Limits = wgpu::Limits {
max_texture_dimension_1d: 8192,
max_texture_dimension_2d: 8192,
max_texture_dimension_3d: 2048,
max_color_attachment_bytes_per_sample: 48,
max_uniform_buffer_binding_size: 64 << 10, max_color_attachments: 8,
..wgpu::Limits::downlevel_defaults()
};
trait DeviceBufferExt {
fn create_uniform_buffer<T: ShaderType + WriteInto + ShaderSize>(
&self,
label: &str,
contents: &T,
) -> wgpu::Buffer;
fn create_storage_buffer<T: ShaderType + WriteInto + ShaderSize>(
&self,
label: &str,
contents: &[T],
) -> wgpu::Buffer;
}
impl DeviceBufferExt for wgpu::Device {
fn create_uniform_buffer<T: ShaderType + WriteInto + ShaderSize>(
&self,
label: &str,
data: &T,
) -> wgpu::Buffer {
let mut buffer = UniformBuffer::new(Vec::new());
buffer.write(&data).unwrap();
self.create_buffer_init(&wgpu::util::BufferInitDescriptor {
label: Some(label),
contents: &buffer.into_inner(),
usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST,
})
}
fn create_storage_buffer<T: ShaderType + WriteInto + ShaderSize>(
&self,
label: &str,
data: &[T],
) -> wgpu::Buffer {
let mut buffer = StorageBuffer::new(Vec::new());
buffer.write(&data).unwrap();
self.create_buffer_init(&wgpu::util::BufferInitDescriptor {
label: Some(label),
contents: &buffer.into_inner(),
usage: wgpu::BufferUsages::STORAGE | wgpu::BufferUsages::COPY_DST,
})
}
}
trait QueueBufferExt {
fn write_uniform_data<T: ShaderType + WriteInto + ShaderSize>(
&self,
buffer: &wgpu::Buffer,
data: &T,
);
fn write_storage_data<T: ShaderType + WriteInto + ShaderSize>(
&self,
buffer: &wgpu::Buffer,
data: &[T],
);
}
impl QueueBufferExt for wgpu::Queue {
fn write_uniform_data<T: ShaderType + WriteInto + ShaderSize>(
&self,
buffer: &wgpu::Buffer,
data: &T,
) {
let mut bytes = UniformBuffer::new(Vec::new());
bytes.write(&data).unwrap();
self.write_buffer(buffer, 0, &bytes.into_inner());
}
fn write_storage_data<T: ShaderType + WriteInto + ShaderSize>(
&self,
buffer: &wgpu::Buffer,
data: &[T],
) {
let mut bytes = StorageBuffer::new(Vec::new());
bytes.write(&data).unwrap();
self.write_buffer(buffer, 0, &bytes.into_inner());
}
}