diff --git a/NewHorizons/Builder/Props/DetailBuilder.cs b/NewHorizons/Builder/Props/DetailBuilder.cs index f74dac74..72776897 100644 --- a/NewHorizons/Builder/Props/DetailBuilder.cs +++ b/NewHorizons/Builder/Props/DetailBuilder.cs @@ -64,7 +64,7 @@ namespace NewHorizons.Builder.Props GameObject prop = GameObject.Instantiate(prefab, sector.transform); prop.SetActive(false); - sector.OnOccupantEnterSector += (SectorDetector sd) => OWAssetHandler.LoadObject(prop); + sector.OnOccupantEnterSector += (SectorDetector sd) => OWAssetHandler.OnOccupantEnterSector(prop, sd, sector); OWAssetHandler.LoadObject(prop); foreach (var component in prop.GetComponents().Concat(prop.GetComponentsInChildren())) diff --git a/NewHorizons/Handlers/OWAssetHandler.cs b/NewHorizons/Handlers/OWAssetHandler.cs index 74611aa4..723a8545 100644 --- a/NewHorizons/Handlers/OWAssetHandler.cs +++ b/NewHorizons/Handlers/OWAssetHandler.cs @@ -11,52 +11,73 @@ namespace NewHorizons.Handlers public static class OWAssetHandler { private static Dictionary _materialCache; + private static Dictionary> _objectCache; public static void Init() { _materialCache = new Dictionary(); + _objectCache = new Dictionary>(); + } + + public static void OnOccupantEnterSector(GameObject obj, SectorDetector sd, Sector sector) + { + LoadObject(obj); + + // If its too laggy put this back idk + /* + if (sector.GetOccupants().Count > 0 || sd._occupantType == DynamicOccupant.Player) + { + LoadObject(obj); + } + */ } public static void LoadObject(GameObject obj) { var assetBundles = new List(); - var tables = Resources.FindObjectsOfTypeAll(); - foreach (var streamingHandle in obj.GetComponentsInChildren()) + if (_objectCache.ContainsKey(obj)) { - var assetBundle = streamingHandle.assetBundle; - if (!assetBundles.Contains(assetBundle)) + assetBundles = _objectCache[obj]; + } + else + { + var tables = Resources.FindObjectsOfTypeAll(); + foreach (var streamingHandle in obj.GetComponentsInChildren()) { - assetBundles.Add(assetBundle); - } - if (streamingHandle is StreamingRenderMeshHandle || streamingHandle is StreamingSkinnedMeshHandle) - { - var materials = streamingHandle.GetComponent().sharedMaterials; - - if (materials.Length == 0) continue; - - if (_materialCache == null) _materialCache = new Dictionary(); - - // Gonna assume that if theres more than one material its probably in the same asset bundle anyway right - if (_materialCache.TryGetValue(materials[0], out assetBundle)) + var assetBundle = streamingHandle.assetBundle; + if (!assetBundles.Contains(assetBundle)) { assetBundles.Add(assetBundle); } - else + if (streamingHandle is StreamingRenderMeshHandle || streamingHandle is StreamingSkinnedMeshHandle) { - foreach (var table in tables) + var materials = streamingHandle.GetComponent().sharedMaterials; + + if (materials.Length == 0) continue; + + // Gonna assume that if theres more than one material its probably in the same asset bundle anyway right + if (_materialCache.TryGetValue(materials[0], out assetBundle)) { - foreach (var x in table._materialPropertyLookups) + assetBundles.Add(assetBundle); + } + else + { + foreach (var table in tables) { - if (materials.Contains(x.material)) + foreach (var x in table._materialPropertyLookups) { - _materialCache.SafeAdd(x.material, table.assetBundle); - assetBundles.SafeAdd(table.assetBundle); + if (materials.Contains(x.material)) + { + _materialCache.SafeAdd(x.material, table.assetBundle); + assetBundles.SafeAdd(table.assetBundle); + } } } } } } + _objectCache[obj] = assetBundles; } foreach (var assetBundle in assetBundles) diff --git a/NewHorizons/Main.cs b/NewHorizons/Main.cs index 0e9aca9a..6e1aaebf 100644 --- a/NewHorizons/Main.cs +++ b/NewHorizons/Main.cs @@ -199,8 +199,8 @@ namespace NewHorizons NewHorizonsData.Load(); SignalBuilder.Init(); AstroObjectLocator.RefreshList(); - PlanetCreationHandler.Init(BodyDict[CurrentStarSystem]); OWAssetHandler.Init(); + PlanetCreationHandler.Init(BodyDict[CurrentStarSystem]); LoadTranslations(ModHelper.Manifest.ModFolderPath + "AssetBundle/", this); Instance.ModHelper.Events.Unity.FireOnNextUpdate(() => Locator.GetPlayerBody().gameObject.AddComponent());