oxygengine_composite_renderer/system/
map.rs1use crate::{
2 component::{CompositeMapChunk, CompositeRenderable, CompositeSurfaceCache},
3 composite_renderer::Renderable,
4 map_asset_protocol::{Map, MapAsset},
5};
6use core::{
7 assets::{asset::AssetId, database::AssetsDatabase},
8 ecs::{Comp, Universe, WorldRef},
9};
10use std::collections::HashMap;
11
12#[derive(Debug, Default)]
13pub struct CompositeMapSystemCache {
14 maps_cache: HashMap<String, Map>,
15 maps_table: HashMap<AssetId, String>,
16}
17
18pub type CompositeMapSystemResources<'a> = (
19 WorldRef,
20 &'a AssetsDatabase,
21 &'a mut CompositeMapSystemCache,
22 Comp<&'a mut CompositeMapChunk>,
23 Comp<&'a mut CompositeRenderable>,
24 Comp<&'a mut CompositeSurfaceCache>,
25);
26
27pub fn composite_map_system(universe: &mut Universe) {
28 let (world, assets, mut cache, ..) = universe.query_resources::<CompositeMapSystemResources>();
29
30 for id in assets.lately_loaded_protocol("map") {
31 let id = *id;
32 let asset = assets
33 .asset_by_id(id)
34 .expect("trying to use not loaded map asset");
35 let path = asset.path().to_owned();
36 let asset = asset
37 .get::<MapAsset>()
38 .expect("trying to use non-map asset");
39 let map = asset.map().clone();
40 cache.maps_cache.insert(path.clone(), map);
41 cache.maps_table.insert(id, path);
42 }
43 for id in assets.lately_unloaded_protocol("map") {
44 if let Some(path) = cache.maps_table.remove(id) {
45 cache.maps_cache.remove(&path);
46 }
47 }
48
49 for (_, (chunk, renderable, surface)) in world
50 .query::<(
51 &mut CompositeMapChunk,
52 &mut CompositeRenderable,
53 Option<&mut CompositeSurfaceCache>,
54 )>()
55 .iter()
56 {
57 if chunk.dirty {
58 if let Some(map) = cache.maps_cache.get(chunk.map_name()) {
59 let r = if let Some(commands) = map.build_render_commands_from_layer_by_name(
60 chunk.layer_name(),
61 chunk.offset(),
62 chunk.size(),
63 &assets,
64 ) {
65 Renderable::Commands(commands)
66 } else {
67 Renderable::None
68 };
69 renderable.0 = r;
70 if let Some(surface) = surface {
71 surface.rebuild();
72 }
73 chunk.dirty = false;
74 }
75 }
76 }
77}