From 853f779930776256ac3a6f2f30d0b155ed1455d8 Mon Sep 17 00:00:00 2001 From: Nova Date: Tue, 20 Aug 2024 17:18:48 -0400 Subject: [PATCH] fix(model): don't keep material references --- src/nodes/drawable/model.rs | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/nodes/drawable/model.rs b/src/nodes/drawable/model.rs index 756c3d0..01c396f 100644 --- a/src/nodes/drawable/model.rs +++ b/src/nodes/drawable/model.rs @@ -9,7 +9,7 @@ use color_eyre::eyre::{bail, eyre, Result}; use glam::{Mat4, Vec2, Vec3}; use once_cell::sync::{Lazy, OnceCell}; use parking_lot::Mutex; -use rustc_hash::{FxHashMap, FxHashSet}; +use rustc_hash::FxHashMap; use stardust_xr::values::ResourceID; use std::ffi::OsStr; use std::hash::{Hash, Hasher}; @@ -57,17 +57,25 @@ unsafe impl Send for MaterialWrapper {} unsafe impl Sync for MaterialWrapper {} #[derive(Default)] -struct MaterialRegistry(Mutex>>); +struct MaterialRegistry(Mutex>); impl MaterialRegistry { fn add_or_get(&self, material: Arc) -> Arc { let mut lock = self.0.lock(); + let hash = { + use std::hash::{Hash, Hasher}; + let mut hasher = std::collections::hash_map::DefaultHasher::new(); + material.hash(&mut hasher); + hasher.finish() + }; - if let Some(existing) = lock.get(&material) { - existing.clone() - } else { - lock.insert(material.clone()); - material + if let Some(id) = lock.get(&hash) { + if let Ok(existing) = Material::find(id) { + return Arc::new(MaterialWrapper(existing)); + } } + + lock.insert(hash, material.0.get_id().to_string()); + material } }