Files
snow_trail/src/systems/render.rs
2026-02-08 14:06:35 +01:00

63 lines
2.1 KiB
Rust

use crate::mesh::InstanceRaw;
use crate::render::DrawCall;
use crate::world::World;
use bytemuck::cast_slice;
pub fn render_system(world: &World) -> Vec<DrawCall>
{
let all_entities = world.entities.all_entities();
all_entities
.iter()
.filter_map(|&entity| {
let transform = world.transforms.get(entity)?;
let mesh_component = world.meshes.get(entity)?;
let model_matrix = transform.to_matrix();
let (instance_buffer, num_instances) = if let Some(ref buffer) =
mesh_component.instance_buffer
{
(Some(buffer.clone()), mesh_component.num_instances)
}
else
{
let dissolve_amount = world.dissolves.get(entity).map(|d| d.amount).unwrap_or(0.0);
let instance_data = InstanceRaw {
model: model_matrix.to_cols_array_2d(),
dissolve_amount,
_padding: [0.0; 3],
};
let buffer = crate::render::with_device(|device| {
let buffer = device.create_buffer(&wgpu::BufferDescriptor {
label: Some("Instance Buffer"),
size: std::mem::size_of::<InstanceRaw>() as u64,
usage: wgpu::BufferUsages::VERTEX | wgpu::BufferUsages::COPY_DST,
mapped_at_creation: false,
});
crate::render::with_queue(|queue| {
queue.write_buffer(&buffer, 0, cast_slice(&[instance_data]));
});
buffer
});
(Some(buffer), 1)
};
Some(DrawCall {
vertex_buffer: mesh_component.mesh.vertex_buffer.clone(),
index_buffer: mesh_component.mesh.index_buffer.clone(),
num_indices: mesh_component.mesh.num_indices,
model: model_matrix,
pipeline: mesh_component.pipeline,
instance_buffer,
num_instances,
})
})
.collect()
}