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}