mirror of
https://github.com/xivdev/Penumbra.git
synced 2025-12-12 18:27:24 +01:00
ResourceTree: De-inline GlobalResolveContext in ResolveContext
This commit is contained in:
parent
3da20f2d89
commit
28a396470b
2 changed files with 25 additions and 26 deletions
|
|
@ -19,11 +19,10 @@ internal record GlobalResolveContext(IObjectIdentifier Identifier, TreeBuildCach
|
||||||
public readonly Dictionary<nint, ResourceNode> Nodes = new(128);
|
public readonly Dictionary<nint, ResourceNode> Nodes = new(128);
|
||||||
|
|
||||||
public ResolveContext CreateContext(EquipSlot slot, CharacterArmor equipment)
|
public ResolveContext CreateContext(EquipSlot slot, CharacterArmor equipment)
|
||||||
=> new(Identifier, TreeBuildCache, Skeleton, WithUiData, Nodes, slot, equipment);
|
=> new(this, slot, equipment);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal record ResolveContext(IObjectIdentifier Identifier, TreeBuildCache TreeBuildCache, int Skeleton, bool WithUiData,
|
internal record ResolveContext(GlobalResolveContext Global, EquipSlot Slot, CharacterArmor Equipment)
|
||||||
Dictionary<nint, ResourceNode> Nodes, EquipSlot Slot, CharacterArmor Equipment)
|
|
||||||
{
|
{
|
||||||
private static readonly ByteString ShpkPrefix = ByteString.FromSpanUnsafe("shader/sm5/shpk"u8, true, true, true);
|
private static readonly ByteString ShpkPrefix = ByteString.FromSpanUnsafe("shader/sm5/shpk"u8, true, true, true);
|
||||||
|
|
||||||
|
|
@ -32,7 +31,7 @@ internal record ResolveContext(IObjectIdentifier Identifier, TreeBuildCache Tree
|
||||||
if (resourceHandle == null)
|
if (resourceHandle == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
if (Nodes.TryGetValue((nint)resourceHandle, out var cached))
|
if (Global.Nodes.TryGetValue((nint)resourceHandle, out var cached))
|
||||||
return cached;
|
return cached;
|
||||||
|
|
||||||
if (gamePath.IsEmpty)
|
if (gamePath.IsEmpty)
|
||||||
|
|
@ -48,7 +47,7 @@ internal record ResolveContext(IObjectIdentifier Identifier, TreeBuildCache Tree
|
||||||
if (resourceHandle == null)
|
if (resourceHandle == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
if (Nodes.TryGetValue((nint)resourceHandle, out var cached))
|
if (Global.Nodes.TryGetValue((nint)resourceHandle, out var cached))
|
||||||
return cached;
|
return cached;
|
||||||
|
|
||||||
if (dx11)
|
if (dx11)
|
||||||
|
|
@ -98,7 +97,7 @@ internal record ResolveContext(IObjectIdentifier Identifier, TreeBuildCache Tree
|
||||||
FullPath = fullPath,
|
FullPath = fullPath,
|
||||||
};
|
};
|
||||||
if (autoAdd)
|
if (autoAdd)
|
||||||
Nodes.Add((nint)resourceHandle, node);
|
Global.Nodes.Add((nint)resourceHandle, node);
|
||||||
|
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
@ -108,7 +107,7 @@ internal record ResolveContext(IObjectIdentifier Identifier, TreeBuildCache Tree
|
||||||
if (imc == null)
|
if (imc == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
if (Nodes.TryGetValue((nint)imc, out var cached))
|
if (Global.Nodes.TryGetValue((nint)imc, out var cached))
|
||||||
return cached;
|
return cached;
|
||||||
|
|
||||||
return CreateNode(ResourceType.Imc, 0, imc, Utf8GamePath.Empty);
|
return CreateNode(ResourceType.Imc, 0, imc, Utf8GamePath.Empty);
|
||||||
|
|
@ -119,7 +118,7 @@ internal record ResolveContext(IObjectIdentifier Identifier, TreeBuildCache Tree
|
||||||
if (tex == null)
|
if (tex == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
if (Nodes.TryGetValue((nint)tex, out var cached))
|
if (Global.Nodes.TryGetValue((nint)tex, out var cached))
|
||||||
return cached;
|
return cached;
|
||||||
|
|
||||||
return CreateNode(ResourceType.Tex, (nint)tex->Texture, &tex->ResourceHandle, Utf8GamePath.Empty);
|
return CreateNode(ResourceType.Tex, (nint)tex->Texture, &tex->ResourceHandle, Utf8GamePath.Empty);
|
||||||
|
|
@ -130,7 +129,7 @@ internal record ResolveContext(IObjectIdentifier Identifier, TreeBuildCache Tree
|
||||||
if (mdl == null || mdl->ModelResourceHandle == null)
|
if (mdl == null || mdl->ModelResourceHandle == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
if (Nodes.TryGetValue((nint)mdl->ModelResourceHandle, out var cached))
|
if (Global.Nodes.TryGetValue((nint)mdl->ModelResourceHandle, out var cached))
|
||||||
return cached;
|
return cached;
|
||||||
|
|
||||||
var node = CreateNode(ResourceType.Mdl, (nint)mdl, &mdl->ModelResourceHandle->ResourceHandle, Utf8GamePath.Empty, false);
|
var node = CreateNode(ResourceType.Mdl, (nint)mdl, &mdl->ModelResourceHandle->ResourceHandle, Utf8GamePath.Empty, false);
|
||||||
|
|
@ -141,13 +140,13 @@ internal record ResolveContext(IObjectIdentifier Identifier, TreeBuildCache Tree
|
||||||
var mtrlNode = CreateNodeFromMaterial(mtrl);
|
var mtrlNode = CreateNodeFromMaterial(mtrl);
|
||||||
if (mtrlNode != null)
|
if (mtrlNode != null)
|
||||||
{
|
{
|
||||||
if (WithUiData)
|
if (Global.WithUiData)
|
||||||
mtrlNode.FallbackName = $"Material #{i}";
|
mtrlNode.FallbackName = $"Material #{i}";
|
||||||
node.Children.Add(mtrlNode);
|
node.Children.Add(mtrlNode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Nodes.Add((nint)mdl->ModelResourceHandle, node);
|
Global.Nodes.Add((nint)mdl->ModelResourceHandle, node);
|
||||||
|
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
@ -180,7 +179,7 @@ internal record ResolveContext(IObjectIdentifier Identifier, TreeBuildCache Tree
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
var resource = mtrl->MaterialResourceHandle;
|
var resource = mtrl->MaterialResourceHandle;
|
||||||
if (Nodes.TryGetValue((nint)resource, out var cached))
|
if (Global.Nodes.TryGetValue((nint)resource, out var cached))
|
||||||
return cached;
|
return cached;
|
||||||
|
|
||||||
var node = CreateNode(ResourceType.Mtrl, (nint)mtrl, &resource->ResourceHandle, Utf8GamePath.Empty, false);
|
var node = CreateNode(ResourceType.Mtrl, (nint)mtrl, &resource->ResourceHandle, Utf8GamePath.Empty, false);
|
||||||
|
|
@ -190,12 +189,12 @@ internal record ResolveContext(IObjectIdentifier Identifier, TreeBuildCache Tree
|
||||||
var shpkNode = CreateNodeFromShpk(resource->ShaderPackageResourceHandle, new ByteString(resource->ShpkName));
|
var shpkNode = CreateNodeFromShpk(resource->ShaderPackageResourceHandle, new ByteString(resource->ShpkName));
|
||||||
if (shpkNode != null)
|
if (shpkNode != null)
|
||||||
{
|
{
|
||||||
if (WithUiData)
|
if (Global.WithUiData)
|
||||||
shpkNode.Name = "Shader Package";
|
shpkNode.Name = "Shader Package";
|
||||||
node.Children.Add(shpkNode);
|
node.Children.Add(shpkNode);
|
||||||
}
|
}
|
||||||
var shpkFile = WithUiData && shpkNode != null ? TreeBuildCache.ReadShaderPackage(shpkNode.FullPath) : null;
|
var shpkFile = Global.WithUiData && shpkNode != null ? Global.TreeBuildCache.ReadShaderPackage(shpkNode.FullPath) : null;
|
||||||
var shpk = WithUiData && shpkNode != null ? (ShaderPackage*)shpkNode.ObjectAddress : null;
|
var shpk = Global.WithUiData && shpkNode != null ? (ShaderPackage*)shpkNode.ObjectAddress : null;
|
||||||
|
|
||||||
var alreadyProcessedSamplerIds = new HashSet<uint>();
|
var alreadyProcessedSamplerIds = new HashSet<uint>();
|
||||||
for (var i = 0; i < resource->TextureCount; i++)
|
for (var i = 0; i < resource->TextureCount; i++)
|
||||||
|
|
@ -205,7 +204,7 @@ internal record ResolveContext(IObjectIdentifier Identifier, TreeBuildCache Tree
|
||||||
if (texNode == null)
|
if (texNode == null)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (WithUiData)
|
if (Global.WithUiData)
|
||||||
{
|
{
|
||||||
string? name = null;
|
string? name = null;
|
||||||
if (shpk != null)
|
if (shpk != null)
|
||||||
|
|
@ -232,7 +231,7 @@ internal record ResolveContext(IObjectIdentifier Identifier, TreeBuildCache Tree
|
||||||
node.Children.Add(texNode);
|
node.Children.Add(texNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
Nodes.Add((nint)resource, node);
|
Global.Nodes.Add((nint)resource, node);
|
||||||
|
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
@ -242,7 +241,7 @@ internal record ResolveContext(IObjectIdentifier Identifier, TreeBuildCache Tree
|
||||||
if (sklb == null || sklb->SkeletonResourceHandle == null)
|
if (sklb == null || sklb->SkeletonResourceHandle == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
if (Nodes.TryGetValue((nint)sklb->SkeletonResourceHandle, out var cached))
|
if (Global.Nodes.TryGetValue((nint)sklb->SkeletonResourceHandle, out var cached))
|
||||||
return cached;
|
return cached;
|
||||||
|
|
||||||
var node = CreateNode(ResourceType.Sklb, (nint)sklb, (ResourceHandle*)sklb->SkeletonResourceHandle, Utf8GamePath.Empty, false);
|
var node = CreateNode(ResourceType.Sklb, (nint)sklb, (ResourceHandle*)sklb->SkeletonResourceHandle, Utf8GamePath.Empty, false);
|
||||||
|
|
@ -251,7 +250,7 @@ internal record ResolveContext(IObjectIdentifier Identifier, TreeBuildCache Tree
|
||||||
var skpNode = CreateParameterNodeFromPartialSkeleton(sklb);
|
var skpNode = CreateParameterNodeFromPartialSkeleton(sklb);
|
||||||
if (skpNode != null)
|
if (skpNode != null)
|
||||||
node.Children.Add(skpNode);
|
node.Children.Add(skpNode);
|
||||||
Nodes.Add((nint)sklb->SkeletonResourceHandle, node);
|
Global.Nodes.Add((nint)sklb->SkeletonResourceHandle, node);
|
||||||
}
|
}
|
||||||
|
|
||||||
return node;
|
return node;
|
||||||
|
|
@ -262,15 +261,15 @@ internal record ResolveContext(IObjectIdentifier Identifier, TreeBuildCache Tree
|
||||||
if (sklb == null || sklb->SkeletonParameterResourceHandle == null)
|
if (sklb == null || sklb->SkeletonParameterResourceHandle == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
if (Nodes.TryGetValue((nint)sklb->SkeletonParameterResourceHandle, out var cached))
|
if (Global.Nodes.TryGetValue((nint)sklb->SkeletonParameterResourceHandle, out var cached))
|
||||||
return cached;
|
return cached;
|
||||||
|
|
||||||
var node = CreateNode(ResourceType.Skp, (nint)sklb, (ResourceHandle*)sklb->SkeletonParameterResourceHandle, Utf8GamePath.Empty, false);
|
var node = CreateNode(ResourceType.Skp, (nint)sklb, (ResourceHandle*)sklb->SkeletonParameterResourceHandle, Utf8GamePath.Empty, false);
|
||||||
if (node != null)
|
if (node != null)
|
||||||
{
|
{
|
||||||
if (WithUiData)
|
if (Global.WithUiData)
|
||||||
node.FallbackName = "Skeleton Parameters";
|
node.FallbackName = "Skeleton Parameters";
|
||||||
Nodes.Add((nint)sklb->SkeletonParameterResourceHandle, node);
|
Global.Nodes.Add((nint)sklb->SkeletonParameterResourceHandle, node);
|
||||||
}
|
}
|
||||||
|
|
||||||
return node;
|
return node;
|
||||||
|
|
@ -297,7 +296,7 @@ internal record ResolveContext(IObjectIdentifier Identifier, TreeBuildCache Tree
|
||||||
{
|
{
|
||||||
"accessory" => IsMatchEquipment(path[2..], $"a{Equipment.Set.Id:D4}"),
|
"accessory" => IsMatchEquipment(path[2..], $"a{Equipment.Set.Id:D4}"),
|
||||||
"equipment" => IsMatchEquipment(path[2..], $"e{Equipment.Set.Id:D4}"),
|
"equipment" => IsMatchEquipment(path[2..], $"e{Equipment.Set.Id:D4}"),
|
||||||
"monster" => SafeGet(path, 2) == $"m{Skeleton:D4}",
|
"monster" => SafeGet(path, 2) == $"m{Global.Skeleton:D4}",
|
||||||
"weapon" => IsMatchEquipment(path[2..], $"w{Equipment.Set.Id:D4}"),
|
"weapon" => IsMatchEquipment(path[2..], $"w{Equipment.Set.Id:D4}"),
|
||||||
_ => null,
|
_ => null,
|
||||||
},
|
},
|
||||||
|
|
@ -319,7 +318,7 @@ internal record ResolveContext(IObjectIdentifier Identifier, TreeBuildCache Tree
|
||||||
// Weapons intentionally left out.
|
// Weapons intentionally left out.
|
||||||
var isEquipment = SafeGet(path, 0) == "chara" && SafeGet(path, 1) is "accessory" or "equipment";
|
var isEquipment = SafeGet(path, 0) == "chara" && SafeGet(path, 1) is "accessory" or "equipment";
|
||||||
if (isEquipment)
|
if (isEquipment)
|
||||||
foreach (var item in Identifier.Identify(Equipment.Set, Equipment.Variant, Slot.ToSlot()))
|
foreach (var item in Global.Identifier.Identify(Equipment.Set, Equipment.Variant, Slot.ToSlot()))
|
||||||
{
|
{
|
||||||
var name = Slot switch
|
var name = Slot switch
|
||||||
{
|
{
|
||||||
|
|
@ -342,7 +341,7 @@ internal record ResolveContext(IObjectIdentifier Identifier, TreeBuildCache Tree
|
||||||
|
|
||||||
internal ResourceNode.UiData GuessUIDataFromPath(Utf8GamePath gamePath)
|
internal ResourceNode.UiData GuessUIDataFromPath(Utf8GamePath gamePath)
|
||||||
{
|
{
|
||||||
foreach (var obj in Identifier.Identify(gamePath.ToString()))
|
foreach (var obj in Global.Identifier.Identify(gamePath.ToString()))
|
||||||
{
|
{
|
||||||
var name = obj.Key;
|
var name = obj.Key;
|
||||||
if (name.StartsWith("Customization:"))
|
if (name.StartsWith("Customization:"))
|
||||||
|
|
|
||||||
|
|
@ -179,7 +179,7 @@ public class ResourceTree
|
||||||
var sklbNode = context.CreateNodeFromPartialSkeleton(&skeleton->PartialSkeletons[i]);
|
var sklbNode = context.CreateNodeFromPartialSkeleton(&skeleton->PartialSkeletons[i]);
|
||||||
if (sklbNode != null)
|
if (sklbNode != null)
|
||||||
{
|
{
|
||||||
if (context.WithUiData)
|
if (context.Global.WithUiData)
|
||||||
sklbNode.FallbackName = $"{prefix}Skeleton #{i}";
|
sklbNode.FallbackName = $"{prefix}Skeleton #{i}";
|
||||||
nodes.Add(sklbNode);
|
nodes.Add(sklbNode);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue