use iced_native::{ button, checkbox, image, radio, renderer::Debugger, slider, text, Button, Checkbox, Color, Image, Layout, MouseCursor, Node, Point, Radio, Slider, Style, Text, }; use raw_window_handle::HasRawWindowHandle; use wgpu::{ Adapter, CommandEncoderDescriptor, Device, DeviceDescriptor, Extensions, Instance, Limits, PowerPreference, RequestAdapterOptions, Surface, SwapChain, SwapChainDescriptor, TextureFormat, TextureUsage, }; pub struct Renderer { instance: Instance, surface: Surface, adapter: Adapter, device: Device, swap_chain: SwapChain, } impl Renderer { pub fn new( window: &W, width: u32, height: u32, ) -> Self { let instance = Instance::new(); let adapter = instance.request_adapter(&RequestAdapterOptions { power_preference: PowerPreference::LowPower, }); let device = adapter.request_device(&DeviceDescriptor { extensions: Extensions { anisotropic_filtering: false, }, limits: Limits { max_bind_groups: 1 }, }); let surface = instance.create_surface(window.raw_window_handle()); let swap_chain = device.create_swap_chain( &surface, &SwapChainDescriptor { usage: TextureUsage::OUTPUT_ATTACHMENT, format: TextureFormat::Bgra8UnormSrgb, width, height, present_mode: wgpu::PresentMode::Vsync, }, ); Self { instance, surface, adapter, device, swap_chain, } } pub fn draw(&mut self) { let frame = self.swap_chain.get_next_texture(); let mut encoder = self .device .create_command_encoder(&CommandEncoderDescriptor { todo: 0 }); let _ = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { color_attachments: &[wgpu::RenderPassColorAttachmentDescriptor { attachment: &frame.view, resolve_target: None, load_op: wgpu::LoadOp::Clear, store_op: wgpu::StoreOp::Store, clear_color: wgpu::Color { r: 1.0, g: 1.0, b: 1.0, a: 1.0, }, }], depth_stencil_attachment: None, }); self.device.get_queue().submit(&[encoder.finish()]); } } impl text::Renderer for Renderer { fn node(&self, _text: &Text) -> Node { Node::new(Style::default()) } fn draw(&mut self, _text: &Text, _layout: Layout<'_>) {} } impl checkbox::Renderer for Renderer { fn node(&mut self, _checkbox: &Checkbox) -> Node { Node::new(Style::default()) } fn draw( &mut self, _checkbox: &Checkbox, _layout: Layout<'_>, _cursor_position: Point, ) -> MouseCursor { MouseCursor::OutOfBounds } } impl radio::Renderer for Renderer { fn node(&mut self, _checkbox: &Radio) -> Node { Node::new(Style::default()) } fn draw( &mut self, _radio: &Radio, _layout: Layout<'_>, _cursor_position: Point, ) -> MouseCursor { MouseCursor::OutOfBounds } } impl slider::Renderer for Renderer { fn node(&self, _slider: &Slider) -> Node { Node::new(Style::default()) } fn draw( &mut self, _slider: &Slider, _layout: Layout<'_>, _cursor_position: Point, ) -> MouseCursor { MouseCursor::OutOfBounds } } impl image::Renderer<&str> for Renderer { fn node(&mut self, _image: &Image<&str>) -> Node { Node::new(Style::default()) } fn draw(&mut self, _checkbox: &Image<&str>, _layout: Layout<'_>) {} } impl button::Renderer for Renderer { fn node(&self, _button: &Button) -> Node { Node::new(Style::default()) } fn draw( &mut self, _button: &Button, _layout: Layout<'_>, _cursor_position: Point, ) -> MouseCursor { MouseCursor::OutOfBounds } } impl Debugger for Renderer { fn explain(&mut self, _layout: &Layout<'_>, _color: Color) {} }