feat: add ITextureSubstitutionProvider.InvalidatePaths()

This commit is contained in:
goat 2023-08-10 19:11:48 +02:00
parent 24ad2d4c8b
commit 4c15df80b9
No known key found for this signature in database
GPG key ID: 49E2AA8C6A76498B
2 changed files with 54 additions and 10 deletions

View file

@ -213,6 +213,39 @@ internal class TextureManager : IDisposable, IServiceType, ITextureSubstitutionP
#pragma warning restore CS0618
}
/// <inheritdoc/>
public string GetSubstitutedPath(string originalPath)
{
if (this.InterceptTexDataLoad == null)
return originalPath;
string? interceptPath = null;
this.InterceptTexDataLoad.Invoke(originalPath, ref interceptPath);
if (interceptPath != null)
{
Log.Verbose("Intercept: {OriginalPath} => {ReplacePath}", originalPath, interceptPath);
return interceptPath;
}
return originalPath;
}
/// <inheritdoc/>
public void InvalidatePaths(IEnumerable<string> paths)
{
lock (this.activeTextures)
{
foreach (var path in paths)
{
if (!this.activeTextures.TryGetValue(path, out var info) || info == null)
continue;
info.Wrap = null;
}
}
}
/// <inheritdoc/>
public void Dispose()
{
@ -263,16 +296,10 @@ internal class TextureManager : IDisposable, IServiceType, ITextureSubstitutionP
if (!this.im.IsReady)
throw new InvalidOperationException("Cannot create textures before scene is ready");
string? interceptPath = null;
this.InterceptTexDataLoad?.Invoke(path, ref interceptPath);
if (interceptPath != null)
{
Log.Verbose("Intercept: {OriginalPath} => {ReplacePath}", path, interceptPath);
path = interceptPath;
}
// Substitute the path here for loading, instead of when getting the respective TextureInfo
path = this.GetSubstitutedPath(path);
TextureWrap? wrap;
try
{

View file

@ -1,4 +1,6 @@
namespace Dalamud.Plugin.Services;
using System.Collections.Generic;
namespace Dalamud.Plugin.Services;
/// <summary>
/// Service that grants you the ability to replace texture data that is to be loaded by Dalamud.
@ -17,4 +19,19 @@ public interface ITextureSubstitutionProvider
/// Event that will be called once Dalamud wants to load texture data.
/// </summary>
public event TextureDataInterceptorDelegate? InterceptTexDataLoad;
/// <summary>
/// Get a path that may be substituted by a subscriber to ITextureSubstitutionProvider.
/// </summary>
/// <param name="originalPath">The original path to substitute.</param>
/// <returns>The original path, if no subscriber is registered or there is no substitution, or the substituted path.</returns>
public string GetSubstitutedPath(string originalPath);
/// <summary>
/// Notify Dalamud about substitution status for files at the specified VFS paths changing.
/// You should call this with all paths that were either previously substituted and are no longer,
/// and paths that are newly substituted.
/// </summary>
/// <param name="paths">The paths with a changed substitution status.</param>
public void InvalidatePaths(IEnumerable<string> paths);
}