fn run_windowed(&mut self) -> Option<TreeAppOutput>{
let update_schedule = &self.update_scedule;
let frame_schedule = self.frame_scedule.as_ref().unwrap();
let world = self.world.as_mut();
let (queue, device, physical_device, surface, event_loop, memory_allocator) = base_graphics_setup("branch render example".to_string());
let (mut swapchain, swapchain_images) = get_swapchain(&physical_device, &surface, &device);
let render_pass = (self.render_pass_fn.unwrap())(&device, &swapchain);
let (mut framebuffers, window_dimensions) = get_framebuffers(&memory_allocator, &swapchain_images, &render_pass);
let mut used_passes = 1;
let (terrain_subpass, terrain_pipeline) = {
if self.do_terrain {
used_passes += 1;
(Some(Subpass::from(render_pass.clone(), used_passes)).unwrap(), Some(get_terrain_pipeline(window_dimensions, &device, &render_pass)))
}
else {(None, None)}
};
let (mut gui, do_gui) = {
if self.do_gui {
let subpass = Subpass::from(render_pass.clone(), used_passes).unwrap();
(Some(create_gui_from_subpass(&event_loop, &surface, &queue, &subpass)), true)
}
else {(None, false)}
};
let mut camera = Camera::new(Some(self.camera_state.0), Some(self.camera_state.1), None, None);
// this determines if the swapchain needs to be rebuilt, happens when the window dimensions change
let mut recreate_swapchain = false;
let mut last_frame_time = Instant::now();
event_loop.run(move |event, _, control_flow| {
match event {
Event::WindowEvent { window_id: _, event } => {
// pass things to gui
if do_gui {
pass_winit_event_to_gui(&mut gui.as_mut().unwrap(), &event);
}
// check for resize or close
match event {
WindowEvent::Resized(_) => {
recreate_swapchain = true
}
WindowEvent::CloseRequested => {
*control_flow = ControlFlow::Exit;
}
WindowEvent::KeyboardInput {
input:winit::event::KeyboardInput {
virtual_keycode: Some(keycode),
state,
..
},
..
} => {
camera.process_key(keycode, state == ElementState::Pressed);
}
_ => (),
}
},
Event::MainEventsCleared => {
// fixed schedules
let delta_time = last_frame_time.elapsed();
update_schedule.run(world, delta_time);
camera.do_move(delta_time);
last_frame_time = Instant::now();
// schedules
if do_gui {
run_gui_commands(world, gui.as_mut().unwrap());
}
frame_schedule.run(world);
}
_ => (),
}
});
}
self.world is a box containing a World struct from Bevy ECS, the compiler says that borrowed data escapes outside the associated fn when the code passing world into functions is added, but world is a mutable reference so surely the data isn't leaving, no data is being moved, only referenced so I'm not sure how to fix the error.