Editor/Core/Profiles/ReferenceSkin.cs
using HumanoidRigger.Formats.Fbx;
namespace HumanoidRigger;
public static class ReferenceSkin
{
/// <summary>Actual skin clusters decide deform membership. Control names and
/// proximity alone cannot tell an attachment from a deforming helper.</summary>
public static HashSet<string> WeightedBones(byte[] fbx)
{
var root=FbxTokenizer.Parse(fbx);var scene=FbxScene.Build(root);
var clusters=scene.ObjectsById.Values.Where(o=>o.SubClass=="Cluster"&&o.Node.Child("Weights")?.AsDoubleArray(0).Any(w=>w>0)==true).Select(o=>o.Id).ToHashSet();
var result=new HashSet<string>(StringComparer.OrdinalIgnoreCase);
foreach(var c in root.Child("Connections")?.ChildrenNamed("C")??[])
if(c.Properties.Count>=3&&c.Prop<string>(0)=="OO"&&clusters.Contains(c.Prop<long>(2))&&scene.ObjectsById.TryGetValue(c.Prop<long>(1),out var model)&&model.NodeType=="Model")result.Add(model.Name);
if(result.Count==0)throw new FormatException("The reference contains no skin clusters.");
return result;
}
}