mew/
winitutils.rs

1use std::sync::Arc;
2use winit::{
3    dpi::PhysicalSize,
4    window::Window,
5    event_loop::ActiveEventLoop,
6};
7
8
9pub struct SurfaceWindow {
10    pub surface: wgpu::Surface<'static>,
11    pub config: wgpu::SurfaceConfiguration,
12    pub window: Arc<Window>,
13}
14
15impl SurfaceWindow {
16    pub fn new(context: &impl crate::MewRenderContext, event_loop: &ActiveEventLoop) -> Self {
17        let window = Arc::new(event_loop.create_window(Window::default_attributes()).unwrap());
18        let win_size = window.inner_size();
19
20        let surface = context.instance().create_surface(window.clone()).unwrap();
21        let config = surface.get_default_config(&context.adapter(), win_size.width, win_size.height).unwrap();
22        surface.configure(&context.device(), &config);
23
24        Self {
25            surface,
26            config,
27            window,
28        }
29    }
30
31    pub fn reconfigure(&mut self, context: &impl crate::MewRenderContext, size: PhysicalSize<u32>) {
32        self.config.width = size.width;
33        self.config.height = size.height;
34        self.surface.configure(context.device(), &self.config);
35    }
36
37    pub fn get_texture_view(&self) -> (wgpu::SurfaceTexture, wgpu::TextureView) {
38        let texture = self.surface.get_current_texture().unwrap();
39        let view = texture.texture.create_view(&wgpu::TextureViewDescriptor::default());
40        (texture, view)
41    }
42
43    pub fn get_size(&self) -> PhysicalSize<u32> {
44        self.window.inner_size()
45    }
46}