A small immutable data container representing a detected contact region between two mesh parts. It stores the indices of the two parts, the contact cloud center, principal direction, contact plane normal, extent radius and sample count.
using System.Numerics;
namespace AutoRig.Analyze;
// s&box compat: the engine defines Vector2/Vector3 in the GLOBAL namespace, which
// shadows using-directive imports - alias explicitly to System.Numerics.
using Vector2 = System.Numerics.Vector2;
using Vector3 = System.Numerics.Vector3;
/// <summary>A detected contact region between two mesh parts.</summary>
public sealed class PartContact
{
/// <summary>Index of the first part (always < <see cref="PartB"/>).</summary>
public required int PartA { get; init; }
/// <summary>Index of the second part.</summary>
public required int PartB { get; init; }
/// <summary>Mean of the contact sample points.</summary>
public required Vector3 Center { get; init; }
/// <summary>Principal axis of the contact point cloud (unit; sign toward +X/+Y/+Z).</summary>
public required Vector3 Direction { get; init; }
/// <summary>
/// Unit normal of the contact region (smallest-variance axis of the contact cloud),
/// signed toward the smaller part's centroid. For a flat interface (turret ring,
/// door face) this is the natural hinge-axis candidate.
/// </summary>
public required Vector3 PlaneNormal { get; init; }
/// <summary>Largest distance of a contact sample from <see cref="Center"/>.</summary>
public required float Extent { get; init; }
/// <summary>Number of surface samples that landed within tolerance.</summary>
public required int SampleCount { get; init; }
}