app: refactor WindowContext name and creation
This commit is contained in:
parent
a293b962f7
commit
45ccf030f6
6 changed files with 42 additions and 52 deletions
|
@ -13,11 +13,7 @@ use vulkano::{
|
||||||
memory::allocator::StandardMemoryAllocator,
|
memory::allocator::StandardMemoryAllocator,
|
||||||
};
|
};
|
||||||
use vulkano_util::{renderer::VulkanoWindowRenderer, window::VulkanoWindows};
|
use vulkano_util::{renderer::VulkanoWindowRenderer, window::VulkanoWindows};
|
||||||
use winit::{
|
use winit::{event_loop::EventLoopProxy, monitor::MonitorHandle, window::WindowId};
|
||||||
event_loop::EventLoopProxy,
|
|
||||||
monitor::MonitorHandle,
|
|
||||||
window::{Window, WindowId},
|
|
||||||
};
|
|
||||||
|
|
||||||
use crate::core::{input::InputManager, render::vulkan_context::VulkanContext, timer::Timer};
|
use crate::core::{input::InputManager, render::vulkan_context::VulkanContext, timer::Timer};
|
||||||
|
|
||||||
|
@ -25,7 +21,7 @@ use super::user_event::UserEvent;
|
||||||
|
|
||||||
/// Contexte d'application unifié avec Arc<Mutex<>> pour la mutabilité partagée
|
/// Contexte d'application unifié avec Arc<Mutex<>> pour la mutabilité partagée
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct ApplicationContext {
|
pub struct WindowContext {
|
||||||
// Données Vulkan (immutables)
|
// Données Vulkan (immutables)
|
||||||
pub vulkan_context: Arc<VulkanContext>,
|
pub vulkan_context: Arc<VulkanContext>,
|
||||||
pub device: Arc<Device>,
|
pub device: Arc<Device>,
|
||||||
|
@ -46,7 +42,7 @@ pub struct ApplicationContext {
|
||||||
pub gui: Rc<RefCell<Gui>>,
|
pub gui: Rc<RefCell<Gui>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ApplicationContext {
|
impl WindowContext {
|
||||||
pub fn new(
|
pub fn new(
|
||||||
vulkan_context: Arc<VulkanContext>,
|
vulkan_context: Arc<VulkanContext>,
|
||||||
vulkano_windows: Rc<RefCell<VulkanoWindows>>,
|
vulkano_windows: Rc<RefCell<VulkanoWindows>>,
|
||||||
|
|
|
@ -20,7 +20,7 @@ use winit::event::WindowEvent;
|
||||||
use winit::event_loop::{ActiveEventLoop, EventLoopProxy};
|
use winit::event_loop::{ActiveEventLoop, EventLoopProxy};
|
||||||
use winit::window::WindowId;
|
use winit::window::WindowId;
|
||||||
|
|
||||||
use self::context::ApplicationContext;
|
use self::context::WindowContext;
|
||||||
|
|
||||||
pub mod context;
|
pub mod context;
|
||||||
pub mod user_event;
|
pub mod user_event;
|
||||||
|
@ -37,7 +37,7 @@ pub struct App {
|
||||||
event_loop_proxy: EventLoopProxy<UserEvent>,
|
event_loop_proxy: EventLoopProxy<UserEvent>,
|
||||||
|
|
||||||
// Context d'application partagé par fenêtre - architecture unifiée
|
// Context d'application partagé par fenêtre - architecture unifiée
|
||||||
app_contexts: HashMap<WindowId, Rc<RefCell<ApplicationContext>>>,
|
app_contexts: HashMap<WindowId, Rc<RefCell<WindowContext>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl App {
|
impl App {
|
||||||
|
@ -103,6 +103,17 @@ impl ApplicationHandler<UserEvent> for App {
|
||||||
scene_manager.load_scene(Box::new(MainScene::default()));
|
scene_manager.load_scene(Box::new(MainScene::default()));
|
||||||
|
|
||||||
self.scene_manager.insert(window_id, scene_manager);
|
self.scene_manager.insert(window_id, scene_manager);
|
||||||
|
|
||||||
|
let app_context = Rc::new(RefCell::new(WindowContext::new(
|
||||||
|
self.vulkan_context.clone(),
|
||||||
|
self.vulkano_windows.clone(),
|
||||||
|
self.input_manager.clone(),
|
||||||
|
self.timer.clone(),
|
||||||
|
self.gui.get(&window_id).unwrap().clone(),
|
||||||
|
self.event_loop_proxy.clone(),
|
||||||
|
window_id,
|
||||||
|
)));
|
||||||
|
self.app_contexts.insert(window_id, app_context);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn device_event(
|
fn device_event(
|
||||||
|
@ -152,28 +163,12 @@ impl ApplicationHandler<UserEvent> for App {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Créer ou mettre à jour le contexte d'application
|
// Créer ou mettre à jour le contexte d'application
|
||||||
let app_context = self
|
let window_context = self.app_contexts.get(&id).unwrap().clone();
|
||||||
.app_contexts
|
|
||||||
.entry(id)
|
|
||||||
.or_insert_with(|| {
|
|
||||||
Rc::new(RefCell::new(ApplicationContext::new(
|
|
||||||
self.vulkan_context.clone(),
|
|
||||||
self.vulkano_windows.clone(),
|
|
||||||
self.input_manager.clone(),
|
|
||||||
self.timer.clone(),
|
|
||||||
self.gui.get(&id).unwrap().clone(),
|
|
||||||
self.event_loop_proxy.clone(),
|
|
||||||
id,
|
|
||||||
)))
|
|
||||||
})
|
|
||||||
.clone();
|
|
||||||
|
|
||||||
let scene_manager = self.scene_manager.get_mut(&id).unwrap();
|
let scene_manager = self.scene_manager.get_mut(&id).unwrap();
|
||||||
|
|
||||||
// Utiliser le contexte partagé pour les scènes
|
// Utiliser le contexte partagé pour les scènes
|
||||||
{
|
{
|
||||||
let _scene_span = tracing::info_span!("scene_processing").entered();
|
let mut context = window_context.borrow_mut();
|
||||||
let mut context = app_context.borrow_mut();
|
|
||||||
|
|
||||||
{
|
{
|
||||||
let _scene_span =
|
let _scene_span =
|
||||||
|
@ -211,17 +206,19 @@ impl ApplicationHandler<UserEvent> for App {
|
||||||
tracing::warn!("No current scene found for update!");
|
tracing::warn!("No current scene found for update!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
let _gui_span = tracing::debug_span!("request_redraw").entered();
|
||||||
|
let mut window_context = window_context.borrow_mut();
|
||||||
|
window_context.with_renderer_mut(|renderer| {
|
||||||
|
renderer.window().request_redraw();
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn about_to_wait(&mut self, _event_loop: &ActiveEventLoop) {
|
|
||||||
let vulkano_windows = self.vulkano_windows.borrow();
|
|
||||||
let window = vulkano_windows.get_primary_window().unwrap();
|
|
||||||
window.request_redraw();
|
|
||||||
}
|
|
||||||
|
|
||||||
fn user_event(&mut self, event_loop: &ActiveEventLoop, event: UserEvent) {
|
fn user_event(&mut self, event_loop: &ActiveEventLoop, event: UserEvent) {
|
||||||
match event {
|
match event {
|
||||||
UserEvent::CursorGrabMode(window_id, grab) => {
|
UserEvent::CursorGrabMode(window_id, grab) => {
|
||||||
|
@ -247,7 +244,7 @@ impl ApplicationHandler<UserEvent> for App {
|
||||||
let _ = window.request_inner_size(winit::dpi::LogicalSize::new(width, height));
|
let _ = window.request_inner_size(winit::dpi::LogicalSize::new(width, height));
|
||||||
let renderer = vulkano_windows.get_renderer_mut(window_id).unwrap();
|
let renderer = vulkano_windows.get_renderer_mut(window_id).unwrap();
|
||||||
renderer.resize();
|
renderer.resize();
|
||||||
tracing::info!(
|
tracing::trace!(
|
||||||
"Resolution changed to {}x{} for window {:?}",
|
"Resolution changed to {}x{} for window {:?}",
|
||||||
width,
|
width,
|
||||||
height,
|
height,
|
||||||
|
@ -255,7 +252,7 @@ impl ApplicationHandler<UserEvent> for App {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
UserEvent::Exit(window_id) => {
|
UserEvent::Exit(window_id) => {
|
||||||
tracing::info!("Exit requested for window {:?}", window_id);
|
tracing::trace!("Exit requested for window {:?}", window_id);
|
||||||
event_loop.exit();
|
event_loop.exit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
|
|
||||||
use crate::core::app::context::ApplicationContext;
|
use crate::core::app::context::WindowContext;
|
||||||
|
|
||||||
use super::Scene;
|
use super::Scene;
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ impl SceneManager {
|
||||||
|
|
||||||
pub fn load_scene_if_not_loaded(
|
pub fn load_scene_if_not_loaded(
|
||||||
&mut self,
|
&mut self,
|
||||||
app_context: &mut ApplicationContext,
|
app_context: &mut WindowContext,
|
||||||
) -> Result<(), Box<dyn Error>> {
|
) -> Result<(), Box<dyn Error>> {
|
||||||
if let Some(scene) = self.current_scene_mut() {
|
if let Some(scene) = self.current_scene_mut() {
|
||||||
if !scene.loaded() {
|
if !scene.loaded() {
|
||||||
|
|
|
@ -2,18 +2,18 @@ use std::error::Error;
|
||||||
|
|
||||||
use vulkano::sync::GpuFuture;
|
use vulkano::sync::GpuFuture;
|
||||||
|
|
||||||
use crate::core::app::context::ApplicationContext;
|
use crate::core::app::context::WindowContext;
|
||||||
|
|
||||||
pub mod manager;
|
pub mod manager;
|
||||||
|
|
||||||
pub trait Scene {
|
pub trait Scene {
|
||||||
fn loaded(&self) -> bool;
|
fn loaded(&self) -> bool;
|
||||||
fn load(&mut self, app_context: &mut ApplicationContext) -> Result<(), Box<dyn Error>>;
|
fn load(&mut self, app_context: &mut WindowContext) -> Result<(), Box<dyn Error>>;
|
||||||
fn update(&mut self, app_context: &mut ApplicationContext) -> Result<(), Box<dyn Error>>;
|
fn update(&mut self, app_context: &mut WindowContext) -> Result<(), Box<dyn Error>>;
|
||||||
fn render(
|
fn render(
|
||||||
&mut self,
|
&mut self,
|
||||||
acquire_future: Box<dyn GpuFuture>,
|
acquire_future: Box<dyn GpuFuture>,
|
||||||
app_context: &mut ApplicationContext,
|
app_context: &mut WindowContext,
|
||||||
) -> Result<Box<dyn GpuFuture>, Box<dyn Error>>;
|
) -> Result<Box<dyn GpuFuture>, Box<dyn Error>>;
|
||||||
fn unload(&mut self);
|
fn unload(&mut self);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@ use std::error::Error;
|
||||||
|
|
||||||
use super::settings_scene::SettingsScene;
|
use super::settings_scene::SettingsScene;
|
||||||
use crate::core::app::DEPTH_IMAGE_ID;
|
use crate::core::app::DEPTH_IMAGE_ID;
|
||||||
use crate::core::app::context::ApplicationContext;
|
use crate::core::app::context::WindowContext;
|
||||||
use crate::core::app::user_event::UserEvent;
|
use crate::core::app::user_event::UserEvent;
|
||||||
use crate::core::render::primitives::camera::Camera3D;
|
use crate::core::render::primitives::camera::Camera3D;
|
||||||
use crate::core::render::primitives::transform::Transform;
|
use crate::core::render::primitives::transform::Transform;
|
||||||
|
@ -38,10 +38,7 @@ impl Scene for MainScene {
|
||||||
self.state.is_some()
|
self.state.is_some()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn load(
|
fn load(&mut self, app_context: &mut WindowContext) -> Result<(), Box<dyn std::error::Error>> {
|
||||||
&mut self,
|
|
||||||
app_context: &mut ApplicationContext,
|
|
||||||
) -> Result<(), Box<dyn std::error::Error>> {
|
|
||||||
let depth_image_view = app_context.with_renderer_mut(|renderer| {
|
let depth_image_view = app_context.with_renderer_mut(|renderer| {
|
||||||
renderer.get_additional_image_view(DEPTH_IMAGE_ID).clone()
|
renderer.get_additional_image_view(DEPTH_IMAGE_ID).clone()
|
||||||
});
|
});
|
||||||
|
@ -118,7 +115,7 @@ impl Scene for MainScene {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update(&mut self, app_context: &mut ApplicationContext) -> Result<(), Box<dyn Error>> {
|
fn update(&mut self, app_context: &mut WindowContext) -> Result<(), Box<dyn Error>> {
|
||||||
let state = self.state.as_mut().unwrap();
|
let state = self.state.as_mut().unwrap();
|
||||||
app_context.with_input_manager(|input_manager| {
|
app_context.with_input_manager(|input_manager| {
|
||||||
app_context.with_timer(|timer| {
|
app_context.with_timer(|timer| {
|
||||||
|
@ -168,7 +165,7 @@ impl Scene for MainScene {
|
||||||
fn render(
|
fn render(
|
||||||
&mut self,
|
&mut self,
|
||||||
before_future: Box<dyn GpuFuture>,
|
before_future: Box<dyn GpuFuture>,
|
||||||
app_context: &mut ApplicationContext,
|
app_context: &mut WindowContext,
|
||||||
) -> Result<Box<dyn GpuFuture>, Box<dyn Error>> {
|
) -> Result<Box<dyn GpuFuture>, Box<dyn Error>> {
|
||||||
let state = self.state.as_ref().ok_or("State not loaded")?;
|
let state = self.state.as_ref().ok_or("State not loaded")?;
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
|
|
||||||
use crate::core::app::DEPTH_IMAGE_ID;
|
use crate::core::app::DEPTH_IMAGE_ID;
|
||||||
use crate::core::app::context::ApplicationContext;
|
use crate::core::app::context::WindowContext;
|
||||||
use crate::core::app::user_event::UserEvent;
|
use crate::core::app::user_event::UserEvent;
|
||||||
use crate::core::render::render_pass_manager::{RenderPassConfig, RenderPassManager};
|
use crate::core::render::render_pass_manager::{RenderPassConfig, RenderPassManager};
|
||||||
use crate::core::scene::Scene;
|
use crate::core::scene::Scene;
|
||||||
|
@ -27,7 +27,7 @@ impl Scene for SettingsScene {
|
||||||
self.state.is_some()
|
self.state.is_some()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn load(&mut self, app_context: &mut ApplicationContext) -> Result<(), Box<dyn Error>> {
|
fn load(&mut self, app_context: &mut WindowContext) -> Result<(), Box<dyn Error>> {
|
||||||
let current_resolution = app_context.get_window_size();
|
let current_resolution = app_context.get_window_size();
|
||||||
let available_resolutions = app_context.get_available_resolutions();
|
let available_resolutions = app_context.get_available_resolutions();
|
||||||
|
|
||||||
|
@ -39,14 +39,14 @@ impl Scene for SettingsScene {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update(&mut self, _app_context: &mut ApplicationContext) -> Result<(), Box<dyn Error>> {
|
fn update(&mut self, _app_context: &mut WindowContext) -> Result<(), Box<dyn Error>> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn render(
|
fn render(
|
||||||
&mut self,
|
&mut self,
|
||||||
before_future: Box<dyn GpuFuture>,
|
before_future: Box<dyn GpuFuture>,
|
||||||
app_context: &mut ApplicationContext,
|
app_context: &mut WindowContext,
|
||||||
) -> Result<Box<dyn GpuFuture>, Box<dyn Error>> {
|
) -> Result<Box<dyn GpuFuture>, Box<dyn Error>> {
|
||||||
let state = self.state.as_ref().ok_or("State not found")?;
|
let state = self.state.as_ref().ok_or("State not found")?;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue