mirror of
https://github.com/xivdev/Penumbra.git
synced 2025-12-12 18:27:24 +01:00
Small cleanup in ResolveContext.
This commit is contained in:
parent
5023fafc19
commit
ff01276869
2 changed files with 30 additions and 33 deletions
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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,7 +53,7 @@ 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)
|
||||||
{
|
{
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue