From 717c51e280b572d9d00cada57178ac33fd289426 Mon Sep 17 00:00:00 2001 From: rootdarkarchon Date: Tue, 21 Nov 2023 15:01:40 +0100 Subject: [PATCH] add experimental resolving of data through penumbra --- .../Configurations/MareConfig.cs | 1 + .../PlayerData/Factories/PlayerDataFactory.cs | 30 ++++++++++++------- MareSynchronos/UI/SettingsUi.cs | 10 +++++++ 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/MareSynchronos/MareConfiguration/Configurations/MareConfig.cs b/MareSynchronos/MareConfiguration/Configurations/MareConfig.cs index 8392327..46a8adc 100644 --- a/MareSynchronos/MareConfiguration/Configurations/MareConfig.cs +++ b/MareSynchronos/MareConfiguration/Configurations/MareConfig.cs @@ -50,6 +50,7 @@ public class MareConfig : IMareConfiguration public int TransferBarsWidth { get; set; } = 250; public bool UseAlternativeFileUpload { get; set; } = false; public bool UseCompactor { get; set; } = false; + public bool ExperimentalUsePenumbraResourceTree { get; set; } = false; public int Version { get; set; } = 1; public NotificationLocation WarningNotification { get; set; } = NotificationLocation.Both; } \ No newline at end of file diff --git a/MareSynchronos/PlayerData/Factories/PlayerDataFactory.cs b/MareSynchronos/PlayerData/Factories/PlayerDataFactory.cs index 30700fb..fb4bbbc 100644 --- a/MareSynchronos/PlayerData/Factories/PlayerDataFactory.cs +++ b/MareSynchronos/PlayerData/Factories/PlayerDataFactory.cs @@ -5,6 +5,7 @@ using FFXIVClientStructs.FFXIV.Client.System.Resource; using MareSynchronos.API.Data.Enum; using MareSynchronos.FileCache; using MareSynchronos.Interop; +using MareSynchronos.MareConfiguration; using MareSynchronos.PlayerData.Data; using MareSynchronos.PlayerData.Handlers; using MareSynchronos.Services; @@ -25,11 +26,12 @@ public class PlayerDataFactory private readonly IpcManager _ipcManager; private readonly ILogger _logger; private readonly PerformanceCollectorService _performanceCollector; + private readonly MareConfigService _mareConfigService; private readonly TransientResourceManager _transientResourceManager; public PlayerDataFactory(ILogger logger, DalamudUtilService dalamudUtil, IpcManager ipcManager, TransientResourceManager transientResourceManager, FileCacheManager fileReplacementFactory, - PerformanceCollectorService performanceCollector) + PerformanceCollectorService performanceCollector, MareConfigService mareConfigService) { _logger = logger; _dalamudUtil = dalamudUtil; @@ -37,7 +39,7 @@ public class PlayerDataFactory _transientResourceManager = transientResourceManager; _fileCacheManager = fileReplacementFactory; _performanceCollector = performanceCollector; - + _mareConfigService = mareConfigService; _logger.LogTrace("Creating " + nameof(PlayerDataFactory)); } @@ -281,7 +283,7 @@ public class PlayerDataFactory AddReplacementsFromRenderModel(mdl, forwardResolve, reverseResolve); } - if (objectKind == ObjectKind.Player) + if (objectKind == ObjectKind.Player && human->CharacterBase.GetModelType() == CharacterBase.ModelType.Human) { AddPlayerSpecificReplacements(human, forwardResolve, reverseResolve); } @@ -330,12 +332,18 @@ public class PlayerDataFactory Stopwatch st = Stopwatch.StartNew(); // penumbra call, it's currently broken - // var data = (await _ipcManager.PenumbraGetCharacterData(_logger, playerRelatedObject).ConfigureAwait(false))![0]; - // if (data == null) throw new InvalidOperationException("Penumbra returned null data"); - - // gather static replacements from render model - var (forwardResolve, reverseResolve) = await _dalamudUtil.RunOnFrameworkThread(() => BuildDataFromModel(objectKind, charaPointer, token)).ConfigureAwait(false); - Dictionary> resolvedPaths = await GetFileReplacementsFromPaths(forwardResolve, reverseResolve).ConfigureAwait(false); + IReadOnlyDictionary? resolvedPaths; + if (_mareConfigService.Current.ExperimentalUsePenumbraResourceTree) + { + resolvedPaths = (await _ipcManager.PenumbraGetCharacterData(_logger, playerRelatedObject).ConfigureAwait(false))![0]; + if (resolvedPaths == null) throw new InvalidOperationException("Penumbra returned null data"); + } + 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] = new HashSet(resolvedPaths.Select(c => new FileReplacement([.. c.Value], c.Key)), FileReplacementComparer.Instance) .Where(p => p.HasFileReplacement).ToHashSet(); @@ -425,7 +433,7 @@ public class PlayerDataFactory return previousData; } - private async Task>> GetFileReplacementsFromPaths(HashSet forwardResolve, HashSet reverseResolve) + private async Task> GetFileReplacementsFromPaths(HashSet forwardResolve, HashSet reverseResolve) { var forwardPaths = forwardResolve.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 ManageSemiTransientData(ObjectKind objectKind, IntPtr charaPointer) diff --git a/MareSynchronos/UI/SettingsUi.cs b/MareSynchronos/UI/SettingsUi.cs index ce0a22b..aaea12a 100644 --- a/MareSynchronos/UI/SettingsUi.cs +++ b/MareSynchronos/UI/SettingsUi.cs @@ -549,6 +549,16 @@ public class SettingsUi : WindowMediatorSubscriberBase } _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); if (UiSharedService.NormalizedIconTextButton(FontAwesomeIcon.StickyNote, "Export all your user notes to clipboard")) {