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 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;
}

View File

@@ -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<PlayerDataFactory> _logger;
private readonly PerformanceCollectorService _performanceCollector;
private readonly MareConfigService _mareConfigService;
private readonly TransientResourceManager _transientResourceManager;
public PlayerDataFactory(ILogger<PlayerDataFactory> 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");
IReadOnlyDictionary<string, string[]>? 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);
Dictionary<string, List<string>> resolvedPaths = await GetFileReplacementsFromPaths(forwardResolve, reverseResolve).ConfigureAwait(false);
resolvedPaths = await GetFileReplacementsFromPaths(forwardResolve, reverseResolve).ConfigureAwait(false);
}
previousData.FileReplacements[objectKind] =
new HashSet<FileReplacement>(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<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 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)

View File

@@ -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"))
{