maplibre/render/
builder.rs

1use crate::{
2    render::{
3        error::RenderError,
4        settings::{RendererSettings, WgpuSettings},
5        Renderer,
6    },
7    window::{HeadedMapWindow, MapWindowConfig},
8};
9
10#[derive(Clone)]
11pub struct RendererBuilder {
12    wgpu_settings: Option<WgpuSettings>,
13    renderer_settings: Option<RendererSettings>,
14}
15
16impl RendererBuilder {
17    pub fn new() -> Self {
18        Self {
19            wgpu_settings: None,
20            renderer_settings: None,
21        }
22    }
23
24    pub fn with_renderer_settings(mut self, renderer_settings: RendererSettings) -> Self {
25        self.renderer_settings = Some(renderer_settings);
26        self
27    }
28
29    pub fn with_wgpu_settings(mut self, wgpu_settings: WgpuSettings) -> Self {
30        self.wgpu_settings = Some(wgpu_settings);
31        self
32    }
33
34    pub fn build(self) -> UninitializedRenderer {
35        UninitializedRenderer {
36            wgpu_settings: self.wgpu_settings.unwrap_or_default(),
37            renderer_settings: self.renderer_settings.unwrap_or_default(),
38        }
39    }
40}
41
42impl Default for RendererBuilder {
43    fn default() -> Self {
44        Self::new()
45    }
46}
47
48pub enum InitializationResult {
49    Initialized(InitializedRenderer),
50    Uninitialized(UninitializedRenderer),
51    Gone,
52}
53
54impl Default for InitializationResult {
55    fn default() -> Self {
56        Self::Gone
57    }
58}
59
60impl InitializationResult {
61    pub fn unwrap_renderer(self) -> InitializedRenderer {
62        match self {
63            InitializationResult::Initialized(renderer) => renderer,
64            InitializationResult::Uninitialized(_) => panic!("Renderer is not initialized"),
65            InitializationResult::Gone => panic!("Initialization context is gone"),
66        }
67    }
68
69    pub fn into_option(self) -> Option<Renderer> {
70        match self {
71            InitializationResult::Initialized(InitializedRenderer { renderer, .. }) => {
72                Some(renderer)
73            }
74            InitializationResult::Uninitialized(_) => None,
75            InitializationResult::Gone => panic!("Initialization context is gone"),
76        }
77    }
78}
79
80pub struct UninitializedRenderer {
81    pub wgpu_settings: WgpuSettings,
82    pub renderer_settings: RendererSettings,
83}
84
85impl UninitializedRenderer {
86    /// Initializes the whole rendering pipeline for the given configuration.
87    /// Returns the initialized map, ready to be run.
88    pub async fn initialize_renderer<MWC>(
89        self,
90        existing_window: &MWC::MapWindow,
91    ) -> Result<InitializationResult, RenderError>
92    where
93        MWC: MapWindowConfig,
94        <MWC as MapWindowConfig>::MapWindow: HeadedMapWindow,
95    {
96        let renderer = Renderer::initialize(
97            existing_window,
98            self.wgpu_settings.clone(),
99            self.renderer_settings,
100        )
101        .await?;
102        Ok(InitializationResult::Initialized(InitializedRenderer {
103            renderer,
104        }))
105    }
106}
107
108#[cfg(feature = "headless")]
109impl UninitializedRenderer {
110    pub(crate) async fn initialize_headless<MWC>(
111        self,
112        existing_window: &MWC::MapWindow,
113    ) -> Result<Renderer, RenderError>
114    where
115        MWC: MapWindowConfig,
116    {
117        Renderer::initialize_headless(
118            existing_window,
119            self.wgpu_settings.clone(),
120            self.renderer_settings,
121        )
122        .await
123    }
124}
125
126pub struct InitializedRenderer {
127    pub renderer: Renderer,
128}