Editor/Core/Validation/BindTriangle.cs
namespace HumanoidRigger;
using Vector3=System.Numerics.Vector3;
/// <summary>Fixed mesh measurements shared by all stress poses and weight trials.
/// Owned by one validation/repair operation; never retained across mesh edits.</summary>
internal readonly record struct BindTriangle(int A,int B,int C,Vector3 Normal,float Area,float AB,float BC,float CA)
{
public static BindTriangle[] Measure(MeshPart mesh)
{
var result=new BindTriangle[mesh.Triangles.Length/3];
for(int t=0;t<mesh.Triangles.Length;t+=3)
{
int a=mesh.Triangles[t],b=mesh.Triangles[t+1],c=mesh.Triangles[t+2];
var first=mesh.Vertices[a];var second=mesh.Vertices[b];var third=mesh.Vertices[c];
var normal=Vector3.Cross(second-first,third-first);
result[t/3]=new(a,b,c,normal,normal.Length(),Vector3.Distance(first,second),Vector3.Distance(second,third),Vector3.Distance(third,first));
}
return result;
}
public (int A,int B,float Length) Edge(int index)=>index switch
{
0=>(A,B,AB),1=>(B,C,BC),_=>(C,A,CA)
};
}