Skip to main content

ursus_core/app/
mod.rs

1mod context;
2mod handler;
3mod plugin;
4mod traits;
5
6pub mod window_config;
7
8pub use context::EngineContext;
9pub use plugin::Plugin;
10pub use traits::App;
11
12use crate::EngineFlags;
13use handler::EngineHandler;
14use winit::event_loop::{ControlFlow, EventLoop};
15
16pub struct Engine;
17
18impl Engine {
19    pub fn run<A: App + 'static>(app: A) -> anyhow::Result<()> {
20        env_logger::builder()
21            .filter_level(log::LevelFilter::Info)
22            .filter_module("cosmic_text::font::fallback", log::LevelFilter::Off)
23            .format(|buf, record| {
24                use std::io::Write;
25
26                let parts: Vec<&str> = record.target().split("::").collect();
27                let start = parts.len().saturating_sub(2);
28                let short_target = parts[start..].join("::");
29
30                let ts = buf.timestamp().to_string();
31                let ts = ts.split('T').nth(1).unwrap_or(&ts).trim_end_matches('Z');
32
33                writeln!(buf, "[{} {:<5} {}] {}", ts, record.level(), short_target, record.args())
34            })
35            .parse_default_env()
36            .init();
37
38        let flags = EngineFlags::from_args();
39
40        let _puffin_server = if flags.profile {
41            let server_addr = format!("127.0.0.1:{}", puffin_http::DEFAULT_PORT);
42            let server = puffin_http::Server::new(&server_addr)?;
43            log::info!("Run this to view profiling data: puffin_viewer --url {server_addr}");
44            puffin::set_scopes_on(true);
45            Some(server)
46        } else {
47            puffin::set_scopes_on(false);
48            None
49        };
50
51        let window_config = A::window_config();
52        let initial_pipeline = A::initial_pipeline();
53
54        let event_loop = EventLoop::new()?;
55        event_loop.set_control_flow(ControlFlow::Poll);
56
57        let mut handler = EngineHandler::new(Box::new(app), initial_pipeline, flags, window_config);
58        event_loop.run_app(&mut handler)?;
59        Ok(())
60    }
61}
62
63pub fn create_temp_pool(vk: &crate::VulkanContext) -> anyhow::Result<ash::vk::CommandPool> {
64    use ash::vk;
65    let pool = unsafe {
66        vk.device.handle.create_command_pool(
67            &vk::CommandPoolCreateInfo::default()
68                .queue_family_index(vk.device.graphics_family)
69                .flags(vk::CommandPoolCreateFlags::TRANSIENT),
70            None,
71        )?
72    };
73    Ok(pool)
74}