Get rendering somewhat working

This commit is contained in:
hodasemi 2025-03-01 06:01:46 +01:00
parent 0daf0a858a
commit e22381b8e9
3 changed files with 95 additions and 36 deletions

View file

@ -176,33 +176,18 @@ impl Engine {
gui_handler: GuiHandler::new(create_info.gui_info, &context)?, gui_handler: GuiHandler::new(create_info.gui_info, &context)?,
}; };
context
.render_core_mut()
.add_render_routine::<GuiHandlerRenderer>(10_000_000);
world.resources.insert(gui_handler);
// default keyboard navigation
let mut direction_mapping = HashMap::new();
// direction_mapping.insert(Keycode::A, GuiDirection::Left);
// direction_mapping.insert(Keycode::D, GuiDirection::Right);
// direction_mapping.insert(Keycode::W, GuiDirection::Up);
// direction_mapping.insert(Keycode::S, GuiDirection::Down);
direction_mapping.insert(Keycode::Left, GuiDirection::Left);
direction_mapping.insert(Keycode::Right, GuiDirection::Right);
direction_mapping.insert(Keycode::Up, GuiDirection::Up);
direction_mapping.insert(Keycode::Down, GuiDirection::Down);
let engine = Engine { let engine = Engine {
asset_manager, asset_manager,
resource_base_path: create_info.resource_base_path, resource_base_path: create_info.resource_base_path,
}; };
world.resources.insert(InputMap { direction_mapping }); context
.render_core_mut()
.add_render_routine::<GuiHandlerRenderer>(10_000_000);
context.render_core_mut().add_render_routine::<Scene>(100);
world.resources.insert(context); world.resources.insert(context);
world.resources.insert(engine);
world.resources.insert(engine_settings);
let scene = Scene::new( let scene = Scene::new(
create_info.rasterizer_info, create_info.rasterizer_info,
@ -211,6 +196,18 @@ impl Engine {
world, world,
)?; )?;
// default keyboard navigation
let mut direction_mapping = HashMap::new();
direction_mapping.insert(Keycode::Left, GuiDirection::Left);
direction_mapping.insert(Keycode::Right, GuiDirection::Right);
direction_mapping.insert(Keycode::Up, GuiDirection::Up);
direction_mapping.insert(Keycode::Down, GuiDirection::Down);
world.resources.insert(gui_handler);
world.resources.insert(InputMap { direction_mapping });
world.resources.insert(engine);
world.resources.insert(engine_settings);
world.resources.insert(scene); world.resources.insert(scene);
world.add_system(Self::main_system::<T>); world.add_system(Self::main_system::<T>);

View file

@ -49,6 +49,52 @@ impl Default for VRTransformations {
} }
} }
struct SceneHandle {
type_id: TypeId,
priority: u32,
render: Box<
dyn FnMut(
&mut CommandBufferRecorder<'_>,
&TargetMode<Vec<Arc<Image>>>,
&TargetMode<usize>,
&mut World,
) -> Result<()>
+ Send
+ Sync
+ 'static,
>,
resize: Box<
dyn FnMut(f32, f32, &TargetMode<Vec<Arc<Image>>>, &mut World) -> Result<()>
+ Send
+ Sync
+ 'static,
>,
}
impl SceneHandle {
fn new<T: TScene>(priority: u32) -> Self {
Self {
type_id: TypeId::of::<T>(),
priority,
render: Box::new(|recorder, images, indices, world| {
world
.resources
.get_mut_unchecked::<T>()
.process(recorder, images, indices, world)
}),
resize: Box::new(|width, height, images, world| {
world
.resources
.get_mut_unchecked::<T>()
.resize(width, height, images)
}),
}
}
}
pub struct RenderBackend { pub struct RenderBackend {
device: Arc<Device>, device: Arc<Device>,
queue: Arc<Mutex<Queue>>, queue: Arc<Mutex<Queue>>,
@ -61,7 +107,7 @@ pub struct RenderBackend {
command_buffer: Arc<CommandBuffer>, command_buffer: Arc<CommandBuffer>,
render_routines: Vec<(u32, TypeId)>, render_routines: Vec<SceneHandle>,
} }
impl RenderBackend { impl RenderBackend {
@ -169,17 +215,13 @@ impl RenderBackend {
// make a call to the connected scenes // make a call to the connected scenes
self.render_routines self.render_routines
.iter_mut() .iter_mut()
.try_for_each(|(_, type_id)| -> Result<()> { .try_for_each(|scene_handle| {
let scene: &mut dyn TScene = world.resources.get_mut_by_type_id_untyped(*type_id); (scene_handle.render)(
scene.process(
&mut buffer_recorder, &mut buffer_recorder,
&*self.swapchain_images.lock().unwrap(), &*self.swapchain_images.lock().unwrap(),
&image_indices, &image_indices,
world, world,
)?; )
Ok(())
})?; })?;
Ok(&self.command_buffer) Ok(&self.command_buffer)
@ -205,10 +247,8 @@ impl RenderBackend {
self.render_routines self.render_routines
.iter_mut() .iter_mut()
.try_for_each(|(_, type_id)| -> Result<()> { .try_for_each(|scene_handle| {
let scene: &mut dyn TScene = world.resources.get_mut_by_type_id_untyped(*type_id); (scene_handle.resize)(width as f32, height as f32, &images, world)
scene.resize(width as f32, height as f32, &images)
})?; })?;
Ok(()) Ok(())
@ -216,15 +256,16 @@ impl RenderBackend {
/// lower priority means it is more important /// lower priority means it is more important
pub fn add_render_routine<T: TScene>(&mut self, priority: u32) { pub fn add_render_routine<T: TScene>(&mut self, priority: u32) {
self.render_routines.push((priority, TypeId::of::<T>())); self.render_routines.push(SceneHandle::new::<T>(priority));
self.render_routines.sort_by_key(|(p, _)| *p); self.render_routines
.sort_by_key(|scene_handle| scene_handle.priority);
} }
pub fn remove_render_routine<T: TScene>(&mut self) { pub fn remove_render_routine<T: TScene>(&mut self) {
if let Some(&(index, _)) = self if let Some(index) = self
.render_routines .render_routines
.iter() .iter()
.find(|(_, type_id)| *type_id == TypeId::of::<T>()) .position(|scene_handle| scene_handle.type_id == TypeId::of::<T>())
{ {
self.render_routines.remove(index as usize); self.render_routines.remove(index as usize);
} }

View file

@ -52,3 +52,24 @@ impl SkyBox {
Ok(Self { cube_map }) Ok(Self { cube_map })
} }
} }
impl TScene for SkyBox {
fn process(
&mut self,
buffer_recorder: &mut CommandBufferRecorder<'_>,
images: &TargetMode<Vec<Arc<Image>>>,
indices: &TargetMode<usize>,
world: &World,
) -> Result<()> {
todo!()
}
fn resize(
&mut self,
window_width: f32,
window_height: f32,
images: &TargetMode<Vec<Arc<Image>>>,
) -> Result<()> {
todo!()
}
}