Editor/Roof/ArchRoofLightExtentProvider.cs
using System;
using Sandbox;

namespace Sunless.Architecture;

public sealed class ArchRoofLightExtentProvider : IArchExtentProvider {
	public ArchKind Kind => ArchKind.RoofLight;

	// Corner by corner off the deck plane, because a light or a plant item on a raked deck stands at a different
	// height at each end and a box drawn off the eave alone selects thin air above a shed's high side.
	public ArchExtent Measure( object payload, ArchExtentContext context ) {
		var extent = new ArchExtent();

		if ( payload is not ArchRoofLightPart light || context.Host is not ArchRoofPart roof ) {
			return extent;
		}

		var kit = context.Kit;
		var top = ArchRoofGen.Stack( light, kit ).Top;

		foreach ( var corner in light.Outline() ) {
			var deck = ArchRoofGen.Seat( roof, kit, corner );

			extent.Add( corner, deck - ArchRoofPlane.Thickness( roof, kit ), deck + top );
		}

		return extent.Grown( MathF.Max( 6f, light.CurbWidth ) );
	}
}