diff --git a/src/commands.rs b/src/commands.rs index affb60b..8113db8 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -74,7 +74,7 @@ pub struct CommandSet { } impl CommandSet { - pub fn build(instances: &Vec) -> Self { + pub fn build(instances: &[MeshInstance]) -> Self { let mut sorted_meshes = HashMap::<(usize, usize), Vec>::new(); for instance in instances.iter() { let group_id = instance.mesh.group_id; diff --git a/src/main.rs b/src/main.rs index 814ec85..799994f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -151,8 +151,8 @@ fn main() { let mut camera = Flycam::new(10.0, 0.002); let mut is_grabbed = false; let mut ren = pollster::block_on(make_window_renderer(&window)); - let mut state: Box = Box::new(Planets::new(&mut ren)); - // let mut state: Box = Box::new(Grid::new(&mut ren)); + // let mut state: Box = Box::new(Planets::new(&mut ren)); + let mut state: Box = Box::new(Grid::new(&mut ren)); let lights = vec![ PointLight { @@ -174,11 +174,14 @@ fn main() { ]; event_loop.run(move |event, _, control_flow| match event { - Event::RedrawRequested(_) => match ren.render(&camera, &state.render(), &lights) { - Ok(_) => {} - Err(wgpu::SurfaceError::Lost) => ren.resize(ren.size), - Err(wgpu::SurfaceError::OutOfMemory) => *control_flow = ControlFlow::Exit, - Err(e) => println!("error: {:?}", e), + Event::RedrawRequested(_) => { + let scene = Scene { meshes: &state.render(), point_lights: &lights }; + match ren.render(&camera, &scene) { + Ok(_) => {} + Err(wgpu::SurfaceError::Lost) => ren.resize(ren.size), + Err(wgpu::SurfaceError::OutOfMemory) => *control_flow = ControlFlow::Exit, + Err(e) => println!("error: {:?}", e), + }; }, Event::MainEventsCleared => { camera.update(); diff --git a/src/renderer.rs b/src/renderer.rs index d6bbab3..b6665a4 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -2,7 +2,7 @@ use super::camera::Camera; use super::commands::{Command, CommandSet}; use super::mesh::Vertex; use super::pool::{MaterialPool, MeshGroup, MeshPool, TexturePool}; -use super::scene::{MeshInstance, PointLight}; +use super::scene::{Scene, PointLight}; use wgpu::util::DeviceExt; pub struct Renderer { @@ -246,8 +246,7 @@ impl Renderer { pub fn render( &mut self, camera: &impl Camera, - meshes: &Vec, - point_lights: &Vec, + scene: &Scene, ) -> Result<(), wgpu::SurfaceError> { self.camera_uniform.update(camera); self.queue.write_buffer( @@ -256,6 +255,7 @@ impl Renderer { bytemuck::cast_slice(&[self.camera_uniform]), ); + let Scene { meshes, point_lights } = scene; let mesh_commands = CommandSet::build(meshes); // TODO persistent staging buffer (write_buffer creates a new one per call) diff --git a/src/scene.rs b/src/scene.rs index 02256f6..b9b485a 100644 --- a/src/scene.rs +++ b/src/scene.rs @@ -12,3 +12,9 @@ pub struct PointLight { pub center: glam::Vec3A, pub intensity: glam::Vec3A, } + +#[derive(Copy, Clone, PartialEq)] +pub struct Scene<'a> { + pub meshes: &'a [MeshInstance], + pub point_lights: &'a [PointLight], +}