maplibre/vector/
resource_system.rs1use crate::{
3 context::MapContext,
4 render::{
5 eventually::Eventually,
6 resource::{RenderPipeline, TilePipeline},
7 shaders,
8 shaders::Shader,
9 RenderResources, Renderer,
10 },
11 tcs::system::{SystemError, SystemResult},
12 vector::{resource::BufferPool, LinePipeline, VectorBufferPool, VectorPipeline},
13};
14
15pub fn resource_system(
16 MapContext {
17 world,
18 renderer:
19 Renderer {
20 device,
21 resources: RenderResources { surface, .. },
22 settings,
23 ..
24 },
25 ..
26 }: &mut MapContext,
27) -> SystemResult {
28 let Some((buffer_pool, vector_pipeline, line_pipeline)) = world.resources.query_mut::<(
29 &mut Eventually<VectorBufferPool>,
30 &mut Eventually<VectorPipeline>,
31 &mut Eventually<LinePipeline>,
32 )>() else {
33 return Err(SystemError::Dependencies);
34 };
35
36 buffer_pool.initialize(|| BufferPool::from_device(device));
37
38 vector_pipeline.initialize(|| {
39 let tile_shader = shaders::FillShader {
40 format: surface.surface_format(),
41 };
42
43 let pipeline = TilePipeline::new(
44 "vector_pipeline".into(),
45 *settings,
46 tile_shader.describe_vertex(),
47 tile_shader.describe_fragment(),
48 true,
49 false,
50 false,
51 false,
52 surface.is_multisampling_supported(settings.msaa),
53 false,
54 false,
55 )
56 .describe_render_pipeline()
57 .initialize(device);
58
59 VectorPipeline(pipeline)
60 });
61
62 line_pipeline.initialize(|| {
63 let line_shader = shaders::LineShader {
64 format: surface.surface_format(),
65 };
66
67 let pipeline = TilePipeline::new(
68 "line_pipeline".into(),
69 *settings,
70 line_shader.describe_vertex(),
71 line_shader.describe_fragment(),
72 true,
73 false,
74 false,
75 false,
76 surface.is_multisampling_supported(settings.msaa),
77 false,
78 false,
79 )
80 .describe_render_pipeline()
81 .initialize(device);
82
83 LinePipeline(pipeline)
84 });
85
86 Ok(())
87}