feather_ui/render/
mod.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: 2025 Fundament Software SPC <https://fundament.software>
3
4use 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}