summaryrefslogtreecommitdiff
path: root/client/src/render/scene/demand_map.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-01-26 22:22:53 +0100
committermetamuffin <metamuffin@disroot.org>2025-01-26 22:22:53 +0100
commit724e6e4d97f608282e891742565b1036f3e970d5 (patch)
treed75c43703c55ff35a8dd7f01960812f5b147d683 /client/src/render/scene/demand_map.rs
parentf0b213d51ee7b44362b5618bf5bd1eacf50d2bb8 (diff)
downloadweareserver-724e6e4d97f608282e891742565b1036f3e970d5.tar
weareserver-724e6e4d97f608282e891742565b1036f3e970d5.tar.bz2
weareserver-724e6e4d97f608282e891742565b1036f3e970d5.tar.zst
graphics config
Diffstat (limited to 'client/src/render/scene/demand_map.rs')
-rw-r--r--client/src/render/scene/demand_map.rs18
1 files changed, 15 insertions, 3 deletions
diff --git a/client/src/render/scene/demand_map.rs b/client/src/render/scene/demand_map.rs
index 16fa181..c27eaac 100644
--- a/client/src/render/scene/demand_map.rs
+++ b/client/src/render/scene/demand_map.rs
@@ -25,7 +25,7 @@ pub struct DemandMap<K, V> {
inner: RwLock<DemandMapState<K, V>>,
}
struct DemandMapState<K, V> {
- values: HashMap<K, V>,
+ values: HashMap<K, (V, usize)>,
needed: HashSet<K>,
size_metric: usize,
}
@@ -46,18 +46,30 @@ impl<K: Hash + Eq + Clone, V: Clone> DemandMap<K, V> {
pub fn insert(&self, key: K, value: V, size: usize) {
let mut s = self.inner.write().unwrap();
s.needed.remove(&key);
- s.values.insert(key, value);
+ if let Some((_, old_size)) = s.values.insert(key, (value, size)) {
+ s.size_metric -= old_size;
+ }
s.size_metric += size;
}
pub fn try_get(&self, key: K) -> Option<V> {
let mut s = self.inner.write().unwrap();
- if let Some(k) = s.values.get(&key) {
+ if let Some((k, _)) = s.values.get(&key) {
Some(k.to_owned())
} else {
s.needed.insert(key);
None
}
}
+ pub fn regenerate_all(&self) {
+ let mut s = self.inner.write().unwrap();
+ let keys = s.values.keys().cloned().collect::<Vec<_>>();
+ s.needed.extend(keys);
+ }
+ pub fn clear(&self) {
+ let mut s = self.inner.write().unwrap();
+ s.values.clear();
+ s.size_metric = 0;
+ }
}
impl<K, V> Widget for &DemandMap<K, V> {