Editor/Pillar/ArchPillarExtentProvider.cs

Editor provider that measures the 3D extent of an architecture pillar part. It computes pillar footprint from count, spacing, orientation and base/height and returns a grown bounding extent.

Reflection
namespace Sunless.Architecture;

public sealed class ArchPillarExtentProvider : IArchExtentProvider
{
	public ArchKind Kind => ArchKind.Pillar;

	public ArchExtent Measure( object payload, ArchExtentContext context )
	{
		if ( payload is not ArchPillarPart pillar )
		{
			return new ArchExtent();
		}

		var extent = new ArchExtent();
		var height = ArchPillarGen.Height( pillar, context.Room, context.Kit, context.Plan );
		var radians = pillar.Yaw.DegreeToRadian();
		var along = new Vector2( MathF.Cos( radians ), MathF.Sin( radians ) );
		var across = new Vector2( -along.y, along.x );
		var spanX = MathF.Max( 0f, pillar.CountX - 1 ) * pillar.Spacing.x;
		var spanY = MathF.Max( 0f, pillar.CountY - 1 ) * pillar.Spacing.y;
		var origin = pillar.Origin;

		foreach ( var corner in new[]
		{
			origin,
			origin + along * spanX,
			origin + along * spanX + across * spanY,
			origin + across * spanY
		} )
		{
			extent.Add( corner, pillar.BaseHeight, pillar.BaseHeight + height );
		}

		return extent.Grown( 24f );
	}
}