maplibre/render/
builder.rs1use 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 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}