1use crate::render::compositor::CompositorView;
5use crate::{AbsRect, graphics};
6use std::any::Any;
7use std::rc::Rc;
8
9pub mod atlas;
10pub mod compositor;
11pub mod domain;
12pub mod line;
13pub mod shape;
14pub mod text;
15pub mod textbox;
16
17pub trait Renderable {
18 fn render(
19 &self,
20 area: AbsRect,
21 driver: &crate::graphics::Driver,
22 compositor: &mut CompositorView<'_>,
23 ) -> Result<(), crate::Error>;
24}
25
26pub trait Pipeline: Any + std::fmt::Debug + Send + Sync {
27 type Data: 'static;
28
29 fn append(&mut self, data: &Self::Data, layer: u8);
30
31 #[allow(unused_variables)]
32 fn prepare(
33 &mut self,
34 driver: &graphics::Driver,
35 encoder: &mut wgpu::CommandEncoder,
36 config: &wgpu::SurfaceConfiguration,
37 ) {
38 }
39 fn draw(&mut self, driver: &graphics::Driver, pass: &mut wgpu::RenderPass<'_>, layer: u8);
40}
41
42pub trait AnyPipeline: Any + std::fmt::Debug + Send + Sync {
43 fn append(&mut self, data: &dyn Any, layer: u8);
44 fn prepare(
45 &mut self,
46 driver: &graphics::Driver,
47 encoder: &mut wgpu::CommandEncoder,
48 config: &wgpu::SurfaceConfiguration,
49 );
50 fn draw(&mut self, driver: &graphics::Driver, pass: &mut wgpu::RenderPass<'_>, layer: u8);
51}
52
53impl<T: Pipeline + std::fmt::Debug + Send + Sync + 'static> AnyPipeline for T {
54 fn append(&mut self, data: &dyn Any, layer: u8) {
55 Pipeline::append(self, data.downcast_ref().unwrap(), layer)
56 }
57 fn prepare(
58 &mut self,
59 driver: &graphics::Driver,
60 encoder: &mut wgpu::CommandEncoder,
61 config: &wgpu::SurfaceConfiguration,
62 ) {
63 Pipeline::prepare(self, driver, encoder, config);
64 }
65 fn draw(&mut self, driver: &graphics::Driver, pass: &mut wgpu::RenderPass<'_>, layer: u8) {
66 Pipeline::draw(self, driver, pass, layer);
67 }
68}
69
70pub struct Chain<const N: usize>(pub [Rc<dyn Renderable>; N]);
71
72impl<const N: usize> Renderable for Chain<N> {
73 fn render(
74 &self,
75 area: crate::AbsRect,
76 driver: &crate::graphics::Driver,
77 compositor: &mut CompositorView<'_>,
78 ) -> Result<(), crate::Error> {
79 for x in &self.0 {
80 x.render(area, driver, compositor)?;
81 }
82 Ok(())
83 }
84}