use async_trait::async_trait; #[async_trait(?Send)] pub trait App { #[cfg(feature = "backend-wgpu")] async fn request_wgpu_device(window: &winit::window::Window) -> Option where Self: Sized, { use mugl::{ wgpu::{WGPUSurfaceDescriptor, WGPU}, Extent2D, }; let size = window.inner_size(); let size = Extent2D(size.width, size.height); WGPU::request_device( window, Default::default(), WGPUSurfaceDescriptor { depth_stencil_format: None, sample_count: 1, size, }, ) .await } #[cfg(feature = "backend-webgl")] fn request_webgl_device(canvas: &mugl::webgl::Canvas) -> Option where Self: Sized, { use mugl::webgl::{WebGL, WebGL2Features, WebGLContextAttribute}; WebGL::request_device( &canvas, WebGLContextAttribute::default() | WebGLContextAttribute::STENCIL, WebGL2Features::all(), ) } fn new(device: mugl::Device, size: mugl::Extent2D) -> Self where Self: Sized; fn device(&self) -> &mugl::Device; fn render(&mut self, _t: f64) -> bool { false } fn resize(&mut self, new_size: mugl::Extent2D) { use mugl::GPUDevice; self.device().resize_surface(new_size); } }