maplibre/vector/
populate_world_system.rs

1use std::{borrow::Cow, marker::PhantomData, rc::Rc};
2
3use crate::{
4    context::MapContext,
5    environment::Environment,
6    io::apc::{AsyncProcedureCall, Message},
7    kernel::Kernel,
8    tcs::system::{System, SystemResult},
9    vector::{transferables::*, VectorLayerBucket, VectorLayerBucketComponent},
10};
11
12pub struct PopulateWorldSystem<E: Environment, T> {
13    kernel: Rc<Kernel<E>>,
14    phantom_t: PhantomData<T>,
15}
16
17impl<E: Environment, T> PopulateWorldSystem<E, T> {
18    pub fn new(kernel: &Rc<Kernel<E>>) -> Self {
19        Self {
20            kernel: kernel.clone(),
21            phantom_t: Default::default(),
22        }
23    }
24}
25
26impl<E: Environment, T: VectorTransferables> System for PopulateWorldSystem<E, T> {
27    fn name(&self) -> Cow<'static, str> {
28        "populate_world_system".into()
29    }
30
31    fn run(&mut self, MapContext { world, .. }: &mut MapContext) -> SystemResult {
32        for message in self.kernel.apc().receive(|message| {
33            message.has_tag(T::TileTessellated::message_tag())
34                || message.has_tag(T::LayerMissing::message_tag())
35                || message.has_tag(T::LayerTessellated::message_tag())
36                || message.has_tag(T::LayerIndexed::message_tag())
37        }) {
38            let message: Message = message;
39            if message.has_tag(T::TileTessellated::message_tag()) {
40                let message = message.into_transferable::<T::TileTessellated>();
41                let Some(component) = world
42                    .tiles
43                    .query_mut::<&mut VectorLayerBucketComponent>(message.coords())
44                else {
45                    continue;
46                };
47
48                component.done = true;
49            } else if message.has_tag(T::LayerMissing::message_tag()) {
50                let message = message.into_transferable::<T::LayerMissing>();
51                let Some(component) = world
52                    .tiles
53                    .query_mut::<&mut VectorLayerBucketComponent>(message.coords())
54                else {
55                    continue;
56                };
57
58                component
59                    .layers
60                    .push(VectorLayerBucket::Missing(message.to_bucket()));
61            } else if message.has_tag(T::LayerTessellated::message_tag()) {
62                let message = message.into_transferable::<T::LayerTessellated>();
63                // FIXME: Handle points!
64                /*if message.is_empty() {
65                    continue;
66                }*/
67
68                let Some(component) = world
69                    .tiles
70                    .query_mut::<&mut VectorLayerBucketComponent>(message.coords())
71                else {
72                    continue;
73                };
74
75                component
76                    .layers
77                    .push(VectorLayerBucket::AvailableLayer(message.to_bucket()));
78            } else if message.has_tag(T::LayerIndexed::message_tag()) {
79                let message = message.into_transferable::<T::LayerIndexed>();
80                world
81                    .tiles
82                    .geometry_index
83                    .index_tile(&message.coords(), message.to_tile_index());
84            }
85        }
86        Ok(())
87    }
88}