veloren_world/util/
gen_cache.rs1use hashbrown::HashMap;
2use vek::Vec2;
3
4use super::{Sampler, StructureGen2d};
5
6pub struct StructureGenCache<T> {
7 gen: StructureGen2d,
8 cache: HashMap<Vec2<i32>, Option<T>>,
10}
11
12impl<T> StructureGenCache<T> {
13 pub fn new(gen: StructureGen2d) -> Self {
14 Self {
15 gen,
16 cache: HashMap::new(),
17 }
18 }
19
20 pub fn get(
21 &mut self,
22 index: Vec2<i32>,
23 mut generate: impl FnMut(Vec2<i32>, u32) -> Option<T>,
24 ) -> Vec<&T> {
25 let close = self.gen.get(index);
26 for (wpos, seed) in close {
27 self.cache
28 .entry(wpos)
29 .or_insert_with(|| generate(wpos, seed));
30 }
31
32 close
33 .iter()
34 .filter_map(|(wpos, _)| self.cache.get(wpos).unwrap().as_ref())
35 .collect()
36 }
37
38 pub fn generated(&self) -> impl Iterator<Item = &T> {
39 self.cache.values().filter_map(|v| v.as_ref())
40 }
41}