maplibre/sdf/
populate_world_system.rs1use 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 sdf::SymbolLayersDataComponent,
9 tcs::system::{System, SystemResult},
10 vector::transferables::*,
11};
12
13pub struct PopulateWorldSystem<E: Environment, T> {
14 kernel: Rc<Kernel<E>>,
15 phantom_t: PhantomData<T>,
16}
17
18impl<E: Environment, T> PopulateWorldSystem<E, T> {
19 pub fn new(kernel: &Rc<Kernel<E>>) -> Self {
20 Self {
21 kernel: kernel.clone(),
22 phantom_t: Default::default(),
23 }
24 }
25}
26
27impl<E: Environment, T: VectorTransferables> System for PopulateWorldSystem<E, T> {
28 fn name(&self) -> Cow<'static, str> {
29 "sdf_populate_world_system".into()
30 }
31
32 fn run(&mut self, MapContext { world, .. }: &mut MapContext) -> SystemResult {
33 for message in self.kernel.apc().receive(|message| {
34 message.has_tag(T::SymbolLayerTessellated::message_tag())
35 || message.has_tag(T::LayerIndexed::message_tag())
36 }) {
37 let message: Message = message;
38 if message.has_tag(T::SymbolLayerTessellated::message_tag()) {
39 let message = message.into_transferable::<T::SymbolLayerTessellated>();
40
41 let Some(component) = world
42 .tiles
43 .query_mut::<&mut SymbolLayersDataComponent>(message.coords())
44 else {
45 continue;
46 };
47
48 component.layers.push(message.to_bucket());
49 }
50 }
51
52 Ok(())
53 }
54}