This commit is contained in:
JohnCorby 2025-02-13 14:20:39 -08:00
parent b1e64c1491
commit a6c20cb231
3 changed files with 16 additions and 1 deletions

View File

@ -18,9 +18,12 @@ public class NHSlideCollection : SlideCollection
public string[] slidePaths; public string[] slidePaths;
public IModBehaviour mod; public IModBehaviour mod;
private HashSet<string> _pathsBeingLoaded = new(); private HashSet<string> _pathsBeingLoaded = new();
/// <summary>
/// map of slide path to collections that have this path loaded. used to only unload slide when nothing else is using it
/// </summary>
public static Dictionary<string, HashSet<NHSlideCollection>> _slidesRequiringPath = new(); public static Dictionary<string, HashSet<NHSlideCollection>> _slidesRequiringPath = new();
private ShipLogSlideProjector _shipLogSlideProjector; private static ShipLogSlideProjector _shipLogSlideProjector;
static NHSlideCollection() static NHSlideCollection()
{ {
@ -113,6 +116,7 @@ public class NHSlideCollection : SlideCollection
// Something else has loaded this image i.e., AutoProjector or Vision torch. We want to ensure we do not delete it // Something else has loaded this image i.e., AutoProjector or Vision torch. We want to ensure we do not delete it
if (ImageUtilities.IsTextureLoaded(mod, path)) if (ImageUtilities.IsTextureLoaded(mod, path))
{ {
// null is dummy value to ensure its never empty (so its not deleted)
_slidesRequiringPath[key] = new() { null }; _slidesRequiringPath[key] = new() { null };
} }
else else
@ -124,17 +128,21 @@ public class NHSlideCollection : SlideCollection
if (ImageUtilities.IsTextureLoaded(mod, path)) if (ImageUtilities.IsTextureLoaded(mod, path))
{ {
// already loaded
var texture = ImageUtilities.GetTexture(mod, path); var texture = ImageUtilities.GetTexture(mod, path);
slides[wrappedIndex]._image = texture; slides[wrappedIndex]._image = texture;
return texture; return texture;
} }
else if (!_pathsBeingLoaded.Contains(path)) else if (!_pathsBeingLoaded.Contains(path))
{ {
// not loaded yet, we need to load it
var loader = new SlideReelAsyncImageLoader(); var loader = new SlideReelAsyncImageLoader();
loader.PathsToLoad.Add((wrappedIndex, path)); loader.PathsToLoad.Add((wrappedIndex, path));
loader.Start(true, false); loader.Start(true, false);
loader.imageLoadedEvent.AddListener((Texture2D tex, int index, string originalPath) => loader.imageLoadedEvent.AddListener((Texture2D tex, int index, string originalPath) =>
{ {
// weird: sometimes we set image, sometimes we return from GetStreamingTexture. oh well
// also somehow setting this later works and updates the cookie without having to manually tell it to do that??? idk how
slides[wrappedIndex]._image = tex; slides[wrappedIndex]._image = tex;
_pathsBeingLoaded.Remove(path); _pathsBeingLoaded.Remove(path);
if (_shipLogSlideProjector == null) if (_shipLogSlideProjector == null)
@ -143,6 +151,7 @@ public class NHSlideCollection : SlideCollection
} }
if (_shipLogSlideProjector != null) if (_shipLogSlideProjector != null)
{ {
// gotta tell ship log we updated the image
_shipLogSlideProjector._slideDirty = true; _shipLogSlideProjector._slideDirty = true;
} }
else else

View File

@ -10,6 +10,7 @@ public class NHSlideCollectionContainer : SlideCollectionContainer
{ {
public string[] conditionsToSet; public string[] conditionsToSet;
public string[] persistentConditionsToSet; public string[] persistentConditionsToSet;
// at some point we'll do streaming on all slides. until then just have an off switch
public bool doAsyncLoading = true; public bool doAsyncLoading = true;
[HarmonyPrefix] [HarmonyPrefix]

View File

@ -42,6 +42,11 @@ public class SlideReelAsyncImageLoader
private bool _started; private bool _started;
private bool _clamp; private bool _clamp;
/// <summary>
/// start loading the images a frame later
/// </summary>
/// <param name="clamp">sets wrapMode</param>
/// <param name="sequential">load all slides one at a time vs at the same time</param>
public void Start(bool clamp, bool sequential) public void Start(bool clamp, bool sequential)
{ {
if (_started) return; if (_started) return;