add experimental resolving of data through penumbra

This commit is contained in:
rootdarkarchon
2023-11-21 15:01:40 +01:00
parent 1dfdab4fef
commit 717c51e280
3 changed files with 30 additions and 11 deletions

View File

@@ -50,6 +50,7 @@ public class MareConfig : IMareConfiguration
public int TransferBarsWidth { get; set; } = 250; public int TransferBarsWidth { get; set; } = 250;
public bool UseAlternativeFileUpload { get; set; } = false; public bool UseAlternativeFileUpload { get; set; } = false;
public bool UseCompactor { get; set; } = false; public bool UseCompactor { get; set; } = false;
public bool ExperimentalUsePenumbraResourceTree { get; set; } = false;
public int Version { get; set; } = 1; public int Version { get; set; } = 1;
public NotificationLocation WarningNotification { get; set; } = NotificationLocation.Both; public NotificationLocation WarningNotification { get; set; } = NotificationLocation.Both;
} }

View File

@@ -5,6 +5,7 @@ using FFXIVClientStructs.FFXIV.Client.System.Resource;
using MareSynchronos.API.Data.Enum; using MareSynchronos.API.Data.Enum;
using MareSynchronos.FileCache; using MareSynchronos.FileCache;
using MareSynchronos.Interop; using MareSynchronos.Interop;
using MareSynchronos.MareConfiguration;
using MareSynchronos.PlayerData.Data; using MareSynchronos.PlayerData.Data;
using MareSynchronos.PlayerData.Handlers; using MareSynchronos.PlayerData.Handlers;
using MareSynchronos.Services; using MareSynchronos.Services;
@@ -25,11 +26,12 @@ public class PlayerDataFactory
private readonly IpcManager _ipcManager; private readonly IpcManager _ipcManager;
private readonly ILogger<PlayerDataFactory> _logger; private readonly ILogger<PlayerDataFactory> _logger;
private readonly PerformanceCollectorService _performanceCollector; private readonly PerformanceCollectorService _performanceCollector;
private readonly MareConfigService _mareConfigService;
private readonly TransientResourceManager _transientResourceManager; private readonly TransientResourceManager _transientResourceManager;
public PlayerDataFactory(ILogger<PlayerDataFactory> logger, DalamudUtilService dalamudUtil, IpcManager ipcManager, public PlayerDataFactory(ILogger<PlayerDataFactory> logger, DalamudUtilService dalamudUtil, IpcManager ipcManager,
TransientResourceManager transientResourceManager, FileCacheManager fileReplacementFactory, TransientResourceManager transientResourceManager, FileCacheManager fileReplacementFactory,
PerformanceCollectorService performanceCollector) PerformanceCollectorService performanceCollector, MareConfigService mareConfigService)
{ {
_logger = logger; _logger = logger;
_dalamudUtil = dalamudUtil; _dalamudUtil = dalamudUtil;
@@ -37,7 +39,7 @@ public class PlayerDataFactory
_transientResourceManager = transientResourceManager; _transientResourceManager = transientResourceManager;
_fileCacheManager = fileReplacementFactory; _fileCacheManager = fileReplacementFactory;
_performanceCollector = performanceCollector; _performanceCollector = performanceCollector;
_mareConfigService = mareConfigService;
_logger.LogTrace("Creating " + nameof(PlayerDataFactory)); _logger.LogTrace("Creating " + nameof(PlayerDataFactory));
} }
@@ -281,7 +283,7 @@ public class PlayerDataFactory
AddReplacementsFromRenderModel(mdl, forwardResolve, reverseResolve); AddReplacementsFromRenderModel(mdl, forwardResolve, reverseResolve);
} }
if (objectKind == ObjectKind.Player) if (objectKind == ObjectKind.Player && human->CharacterBase.GetModelType() == CharacterBase.ModelType.Human)
{ {
AddPlayerSpecificReplacements(human, forwardResolve, reverseResolve); AddPlayerSpecificReplacements(human, forwardResolve, reverseResolve);
} }
@@ -330,12 +332,18 @@ public class PlayerDataFactory
Stopwatch st = Stopwatch.StartNew(); Stopwatch st = Stopwatch.StartNew();
// penumbra call, it's currently broken // penumbra call, it's currently broken
// var data = (await _ipcManager.PenumbraGetCharacterData(_logger, playerRelatedObject).ConfigureAwait(false))![0]; IReadOnlyDictionary<string, string[]>? resolvedPaths;
// if (data == null) throw new InvalidOperationException("Penumbra returned null data"); if (_mareConfigService.Current.ExperimentalUsePenumbraResourceTree)
{
// gather static replacements from render model resolvedPaths = (await _ipcManager.PenumbraGetCharacterData(_logger, playerRelatedObject).ConfigureAwait(false))![0];
var (forwardResolve, reverseResolve) = await _dalamudUtil.RunOnFrameworkThread(() => BuildDataFromModel(objectKind, charaPointer, token)).ConfigureAwait(false); if (resolvedPaths == null) throw new InvalidOperationException("Penumbra returned null data");
Dictionary<string, List<string>> resolvedPaths = await GetFileReplacementsFromPaths(forwardResolve, reverseResolve).ConfigureAwait(false); }
else
{
// gather static replacements from render model
var (forwardResolve, reverseResolve) = await _dalamudUtil.RunOnFrameworkThread(() => BuildDataFromModel(objectKind, charaPointer, token)).ConfigureAwait(false);
resolvedPaths = await GetFileReplacementsFromPaths(forwardResolve, reverseResolve).ConfigureAwait(false);
}
previousData.FileReplacements[objectKind] = previousData.FileReplacements[objectKind] =
new HashSet<FileReplacement>(resolvedPaths.Select(c => new FileReplacement([.. c.Value], c.Key)), FileReplacementComparer.Instance) new HashSet<FileReplacement>(resolvedPaths.Select(c => new FileReplacement([.. c.Value], c.Key)), FileReplacementComparer.Instance)
.Where(p => p.HasFileReplacement).ToHashSet(); .Where(p => p.HasFileReplacement).ToHashSet();
@@ -425,7 +433,7 @@ public class PlayerDataFactory
return previousData; return previousData;
} }
private async Task<Dictionary<string, List<string>>> GetFileReplacementsFromPaths(HashSet<string> forwardResolve, HashSet<string> reverseResolve) private async Task<IReadOnlyDictionary<string, string[]>> GetFileReplacementsFromPaths(HashSet<string> forwardResolve, HashSet<string> reverseResolve)
{ {
var forwardPaths = forwardResolve.ToArray(); var forwardPaths = forwardResolve.ToArray();
var reversePaths = reverseResolve.ToArray(); var reversePaths = reverseResolve.ToArray();
@@ -457,7 +465,7 @@ public class PlayerDataFactory
} }
} }
return resolvedPaths; return resolvedPaths.ToDictionary(k => k.Key, k => k.Value.ToArray(), StringComparer.OrdinalIgnoreCase).AsReadOnly();
} }
private HashSet<string> ManageSemiTransientData(ObjectKind objectKind, IntPtr charaPointer) private HashSet<string> ManageSemiTransientData(ObjectKind objectKind, IntPtr charaPointer)

View File

@@ -549,6 +549,16 @@ public class SettingsUi : WindowMediatorSubscriberBase
} }
_lastTab = "General"; _lastTab = "General";
UiSharedService.FontText("Experimental", _uiShared.UidFont);
var usePenumbraResolve = _configService.Current.ExperimentalUsePenumbraResourceTree;
if (ImGui.Checkbox("Use Penumbra to resolve character", ref usePenumbraResolve))
{
_configService.Current.ExperimentalUsePenumbraResourceTree = usePenumbraResolve;
_configService.Save();
}
UiSharedService.DrawHelpText("Requires Penumbra version greater equal to 0.8.1.9 - please report issues with that feature to the Penumbra Discord");
ImGui.Separator();
UiSharedService.FontText("Notes", _uiShared.UidFont); UiSharedService.FontText("Notes", _uiShared.UidFont);
if (UiSharedService.NormalizedIconTextButton(FontAwesomeIcon.StickyNote, "Export all your user notes to clipboard")) if (UiSharedService.NormalizedIconTextButton(FontAwesomeIcon.StickyNote, "Export all your user notes to clipboard"))
{ {