Small cleanup in ResolveContext.

This commit is contained in:
Ottermandias 2023-08-31 01:11:57 +02:00
parent 5023fafc19
commit ff01276869
2 changed files with 30 additions and 33 deletions

View file

@ -65,31 +65,10 @@ internal record class ResolveContext(Configuration Config, IObjectIdentifier Ide
private ResourceNode CreateNodeFromGamePath(ResourceType type, nint sourceAddress, Utf8GamePath gamePath, bool @internal) private ResourceNode CreateNodeFromGamePath(ResourceType type, nint sourceAddress, Utf8GamePath gamePath, bool @internal)
=> new(null, type, sourceAddress, gamePath, FilterFullPath(Collection.ResolvePath(gamePath) ?? new FullPath(gamePath)), @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, private unsafe ResourceNode? CreateNodeFromResourceHandle(ResourceType type, nint sourceAddress, ResourceHandle* handle, bool @internal,
bool withName) bool withName)
{ {
if (handle == null) var fullPath = Utf8GamePath.FromByteString(GetResourceHandlePath(handle), out var p) ? new FullPath(p) : FullPath.Empty;
return null;
var fullPath = GetResourceHandlePath(handle);
if (fullPath.InternalName.IsEmpty) if (fullPath.InternalName.IsEmpty)
return null; return null;
@ -294,4 +273,25 @@ internal record class ResolveContext(Configuration Config, IObjectIdentifier Ide
var i = index.GetOffset(array.Length); var i = index.GetOffset(array.Length);
return i >= 0 && i < array.Length ? array[i] : null; 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;
}
} }

View file

@ -9,6 +9,7 @@ using FFXIVClientStructs.FFXIV.Client.Graphics.Render;
using FFXIVClientStructs.FFXIV.Client.Graphics.Scene; using FFXIVClientStructs.FFXIV.Client.Graphics.Scene;
using Penumbra.GameData.Files; using Penumbra.GameData.Files;
using Penumbra.Interop.ResourceTree; using Penumbra.Interop.ResourceTree;
using Penumbra.String;
using Structs = Penumbra.Interop.Structs; using Structs = Penumbra.Interop.Structs;
namespace Penumbra.UI.AdvancedWindow; 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) 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) for (var i = 0; i < drawObject->SlotCount; ++i)
{ {
var model = drawObject->Models[i]; var model = drawObject->Models[i];
@ -67,11 +68,8 @@ public partial class ModEditWindow
continue; continue;
var mtrlHandle = material->MaterialResourceHandle; var mtrlHandle = material->MaterialResourceHandle;
if (mtrlHandle == null)
continue;
var path = ResolveContext.GetResourceHandlePath((Structs.ResourceHandle*)mtrlHandle); var path = ResolveContext.GetResourceHandlePath((Structs.ResourceHandle*)mtrlHandle);
if (path.ToString() == materialPath) if (path == materialPath)
result.Add((subActorType, childObjectIndex, i, j)); result.Add((subActorType, childObjectIndex, i, j));
} }
} }
@ -82,9 +80,8 @@ public partial class ModEditWindow
if (drawObject == null) if (drawObject == null)
return result; return result;
materialPath = materialPath.Replace('/', '\\').ToLowerInvariant(); var path = ByteString.FromString(materialPath.Replace('/', '\\'), out var m, true) ? m : ByteString.Empty;
CollectMaterials(result, subActorType, -1, drawObject, path);
CollectMaterials(result, subActorType, -1, drawObject, materialPath);
var firstChildObject = (CharacterBase*)drawObject->DrawObject.Object.ChildObject; var firstChildObject = (CharacterBase*)drawObject->DrawObject.Object.ChildObject;
if (firstChildObject != null) if (firstChildObject != null)
@ -93,7 +90,7 @@ public partial class ModEditWindow
var childObjectIndex = 0; var childObjectIndex = 0;
do do
{ {
CollectMaterials(result, subActorType, childObjectIndex, childObject, materialPath); CollectMaterials(result, subActorType, childObjectIndex, childObject, path);
childObject = (CharacterBase*)childObject->DrawObject.Object.NextSiblingObject; childObject = (CharacterBase*)childObject->DrawObject.Object.NextSiblingObject;
++childObjectIndex; ++childObjectIndex;