diff --git a/Penumbra/Interop/ResourceTree/ResolveContext.cs b/Penumbra/Interop/ResourceTree/ResolveContext.cs index d14bd68b..0cb854f3 100644 --- a/Penumbra/Interop/ResourceTree/ResolveContext.cs +++ b/Penumbra/Interop/ResourceTree/ResolveContext.cs @@ -65,31 +65,10 @@ internal record class ResolveContext(Configuration Config, IObjectIdentifier Ide private ResourceNode CreateNodeFromGamePath(ResourceType type, nint sourceAddress, Utf8GamePath gamePath, bool @internal) => new(null, type, sourceAddress, gamePath, FilterFullPath(Collection.ResolvePath(gamePath) ?? new FullPath(gamePath)), @internal); - public static unsafe FullPath GetResourceHandlePath(ResourceHandle* handle) - { - var name = handle->FileName(); - if (name.IsEmpty) - return FullPath.Empty; - - if (name[0] == (byte)'|') - { - var pos = name.IndexOf((byte)'|', 1); - if (pos < 0) - return FullPath.Empty; - - name = name.Substring(pos + 1); - } - - return new FullPath(Utf8GamePath.FromByteString(name, out var p) ? p : Utf8GamePath.Empty); - } - private unsafe ResourceNode? CreateNodeFromResourceHandle(ResourceType type, nint sourceAddress, ResourceHandle* handle, bool @internal, bool withName) - { - if (handle == null) - return null; - - var fullPath = GetResourceHandlePath(handle); + { + var fullPath = Utf8GamePath.FromByteString(GetResourceHandlePath(handle), out var p) ? new FullPath(p) : FullPath.Empty; if (fullPath.InternalName.IsEmpty) return null; @@ -294,4 +273,25 @@ internal record class ResolveContext(Configuration Config, IObjectIdentifier Ide var i = index.GetOffset(array.Length); return i >= 0 && i < array.Length ? array[i] : null; } + + internal static unsafe ByteString GetResourceHandlePath(ResourceHandle* handle) + { + if (handle == null) + return ByteString.Empty; + + var name = handle->FileName(); + if (name.IsEmpty) + return ByteString.Empty; + + if (name[0] == (byte)'|') + { + var pos = name.IndexOf((byte)'|', 1); + if (pos < 0) + return ByteString.Empty; + + name = name.Substring(pos + 1); + } + + return name; + } } diff --git a/Penumbra/UI/AdvancedWindow/ModEditWindow.Materials.LivePreview.cs b/Penumbra/UI/AdvancedWindow/ModEditWindow.Materials.LivePreview.cs index 76ac8915..d2ce8796 100644 --- a/Penumbra/UI/AdvancedWindow/ModEditWindow.Materials.LivePreview.cs +++ b/Penumbra/UI/AdvancedWindow/ModEditWindow.Materials.LivePreview.cs @@ -9,6 +9,7 @@ using FFXIVClientStructs.FFXIV.Client.Graphics.Render; using FFXIVClientStructs.FFXIV.Client.Graphics.Scene; using Penumbra.GameData.Files; using Penumbra.Interop.ResourceTree; +using Penumbra.String; using Structs = Penumbra.Interop.Structs; namespace Penumbra.UI.AdvancedWindow; @@ -52,8 +53,8 @@ public partial class ModEditWindow private static unsafe List<(int SubActorType, int ChildObjectIndex, int ModelSlot, int MaterialSlot)> FindMaterial(CharacterBase* drawObject, int subActorType, string materialPath) { - static void CollectMaterials(List<(int, int, int, int)> result, int subActorType, int childObjectIndex, CharacterBase* drawObject, string materialPath) - { + static void CollectMaterials(List<(int, int, int, int)> result, int subActorType, int childObjectIndex, CharacterBase* drawObject, ByteString materialPath) + { for (var i = 0; i < drawObject->SlotCount; ++i) { var model = drawObject->Models[i]; @@ -67,11 +68,8 @@ public partial class ModEditWindow continue; var mtrlHandle = material->MaterialResourceHandle; - if (mtrlHandle == null) - continue; - var path = ResolveContext.GetResourceHandlePath((Structs.ResourceHandle*)mtrlHandle); - if (path.ToString() == materialPath) + if (path == materialPath) result.Add((subActorType, childObjectIndex, i, j)); } } @@ -82,9 +80,8 @@ public partial class ModEditWindow if (drawObject == null) return result; - materialPath = materialPath.Replace('/', '\\').ToLowerInvariant(); - - CollectMaterials(result, subActorType, -1, drawObject, materialPath); + var path = ByteString.FromString(materialPath.Replace('/', '\\'), out var m, true) ? m : ByteString.Empty; + CollectMaterials(result, subActorType, -1, drawObject, path); var firstChildObject = (CharacterBase*)drawObject->DrawObject.Object.ChildObject; if (firstChildObject != null) @@ -93,7 +90,7 @@ public partial class ModEditWindow var childObjectIndex = 0; do { - CollectMaterials(result, subActorType, childObjectIndex, childObject, materialPath); + CollectMaterials(result, subActorType, childObjectIndex, childObject, path); childObject = (CharacterBase*)childObject->DrawObject.Object.NextSiblingObject; ++childObjectIndex;